我正在构建一个java / spring微服务,其中每个服务都有它自己的数据库。假设我有一个用户服务,该用户服务将用户信息存储在表之一中,而订单服务则仅存储订购者的用户名,如下所述:

User Service (UserService Database - User Table )
id     firstName    lastName     username     age
1       Chris        Brown       c.brown      20
2       John         Doe         j.doe        25


并订购服务如下

 Order Service (OrderService Database - Order Table )
    id     username    productName     productPrice     OrderDate
    1      c.brown       Sony Mic       100$            20-08-2018
    2       j.doe       Television      j.doe           11-07-2018


问题是在列出订单时从用户服务中获取firstName和lastName的最佳方法是什么。我知道微服务应该通过Rest API进行通信,但是如果我有1000个有订单的用户,我将不得不循环1000次以获取firstName和lastName或将用户名作为数组,这可能会很昂贵。

我已经阅读了使用CQRS和事件源的内容,但是不确定如何在这种情况下最好地应用它。

最佳答案

如果要构建可伸缩且具有弹性的应用程序,则微服务不应进行从一个到另一个的同步调用(您可以阅读The Art of Scalability书)。

这意味着,当微服务从其客户端收到请求时,它应该已经在其本地存储中收集了所有数据。就您而言,您有两种可能性:


firstNamelastName列添加到Orders table
使用具有idfirstNamelastName列的用户创建另一个表,并在将数据返回给客户端时创建一个join


为了使复制的信息最终与源(用户服务)保持一致,可以使用以下技术之一:


有一个cron作业,该作业将获取所有必需的用户信息并替换所有firstNamelastName列。
使用整合事件;在CQRS /事件来源体系结构中,您已经具有域事件-您可以订阅这些事件。如果您没有CQRS而是简单的体系结构,则可以将触发器添加到数据库中,以将低级突变事件(行创建/更新/删除)推送到订阅的服务。有关更多选项,您可以阅读Edson Yanaga的Migrating to Microservice Databases

关于java - 每个服务实现在数据库中的Java微服务中链接数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51926575/

10-14 12:20
查看更多