首页 > 解决方案 > 在每个服务实现的数据库中链接 Java 微服务中的数据

问题描述

我正在构建一个 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

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

我已阅读有关使用 CQRS 和事件源的信息,但不确定如何在这种情况下最好地应用它。

标签: javaspringspring-bootmicroservicescqrs

解决方案


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

这意味着当微服务收到来自其客户端的请求时,它应该已将所有数据收集在其本地存储中。在您的情况下,您有两种可能性:

  1. firstName,lastName列添加到Orders table
  2. 使用具有id, firstName,lastName列的用户创建另一个表,并join在向客户端返回数据时创建一个。

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

  1. 有一个cron获取所有需要的用户信息并替换所有firstName,lastName列的作业。
  2. 使用集成事件;在 CQRS/事件溯源架构中,您已经拥有域事件 - 您可以订阅这些事件。如果您没有 CQRS 而是一个简单的架构,那么您可以向数据库添加触发器,将低级别的突变事件(行创建/更新/删除)推送到订阅的服务。有关更多选项,您可以阅读Migrating to Microservice DatabasesEdson Yanaga 的书

推荐阅读