我正在构建一个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
书)。
这意味着,当微服务从其客户端收到请求时,它应该已经在其本地存储中收集了所有数据。就您而言,您有两种可能性:
将firstName
,lastName
列添加到Orders table
使用具有id
,firstName
,lastName
列的用户创建另一个表,并在将数据返回给客户端时创建一个join
。
为了使复制的信息最终与源(用户服务)保持一致,可以使用以下技术之一:
有一个cron
作业,该作业将获取所有必需的用户信息并替换所有firstName
,lastName
列。
使用整合事件;在CQRS /事件来源体系结构中,您已经具有域事件-您可以订阅这些事件。如果您没有CQRS而是简单的体系结构,则可以将触发器添加到数据库中,以将低级突变事件(行创建/更新/删除)推送到订阅的服务。有关更多选项,您可以阅读Edson Yanaga的Migrating to Microservice Databases
书
关于java - 每个服务实现在数据库中的Java微服务中链接数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51926575/