每个服务实现在数据库中的 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
书)。
这意味着当微服务从其客户端接收到请求时,它应该已经将所有数据收集到其本地存储中。在你的情况下,你有两种可能性:
- 将
firstName
、lastName
列添加到 Orders table
- 使用具有
id
、firstName
、lastName
列的用户创建另一个 table,并在向客户端返回数据时创建 join
。
要使复制的信息最终与源(用户服务)保持一致,您可以使用以下技术之一:
- 有一个
cron
作业可以获取所有需要的用户信息并替换所有 firstName
、lastName
列。
- 使用集成事件;在 CQRS/Event 采购架构中,您已经拥有领域事件 - 您可以订阅这些。如果您没有 CQRS,而是一个简单的架构,那么您可以向数据库添加触发器,将低级别突变事件(行 created/updated/deleted)推送到订阅的服务。如需更多选项,您可以阅读
Migrating to Microservice Databases
Edson Yanaga 的书
我正在构建一个 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
书)。
这意味着当微服务从其客户端接收到请求时,它应该已经将所有数据收集到其本地存储中。在你的情况下,你有两种可能性:
- 将
firstName
、lastName
列添加到Orders table
- 使用具有
id
、firstName
、lastName
列的用户创建另一个 table,并在向客户端返回数据时创建join
。
要使复制的信息最终与源(用户服务)保持一致,您可以使用以下技术之一:
- 有一个
cron
作业可以获取所有需要的用户信息并替换所有firstName
、lastName
列。 - 使用集成事件;在 CQRS/Event 采购架构中,您已经拥有领域事件 - 您可以订阅这些。如果您没有 CQRS,而是一个简单的架构,那么您可以向数据库添加触发器,将低级别突变事件(行 created/updated/deleted)推送到订阅的服务。如需更多选项,您可以阅读
Migrating to Microservice Databases
Edson Yanaga 的书