每个服务实现在数据库中的 java 个微服务中链接数据

Linking data in java microservices in a database per service implementation

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

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 或将用户名作为数组,activity 这可能是昂贵的。

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

Order Service 可以在其数据库中保留有限用户信息(您的名字和姓氏)的影子副本(使用事件源),并且可以自行构建具有有限用户信息的 Order 对象。

理想情况下,应该有一个 REST 调用来从其他 MS 获取数据。

但是如果这些调用非常昂贵,您应该考虑更改数据库设计并将这些所需数据放在一个普通位置。

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

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

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

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

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