java - 在每个服务实现的数据库中链接 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 和事件源的信息,但不确定如何在这种情况下最好地应用它。
解决方案
如果您想构建一个可扩展且有弹性的应用程序,您的微服务不应该从一个到另一个进行同步调用(您可以阅读The Art of Scalability
书籍)。
这意味着当微服务收到来自其客户端的请求时,它应该已将所有数据收集在其本地存储中。在您的情况下,您有两种可能性:
- 将
firstName
,lastName
列添加到Orders table
- 使用具有
id
,firstName
,lastName
列的用户创建另一个表,并join
在向客户端返回数据时创建一个。
为了使复制的信息最终与源(用户服务)保持一致,您可以使用以下技术之一:
- 有一个
cron
获取所有需要的用户信息并替换所有firstName
,lastName
列的作业。 - 使用集成事件;在 CQRS/事件溯源架构中,您已经拥有域事件 - 您可以订阅这些事件。如果您没有 CQRS 而是一个简单的架构,那么您可以向数据库添加触发器,将低级别的突变事件(行创建/更新/删除)推送到订阅的服务。有关更多选项,您可以阅读
Migrating to Microservice Databases
Edson Yanaga 的书
推荐阅读
- python - 抓取网站时出现 403 禁止错误,用户代理已使用和更新。有任何想法吗?
- python - 我在哪里可以获得比官方教程更多关于 igraph 的功能?
- database-design - Cassandra 大分区和重复数据删除
- javascript - Node.js 中的虚拟文件系统
- neural-network - YOLOv3 卷积层数
- django - 您可以以一种相同的形式创建父对象和子对象列表吗
- makefile - .PHONY 规则出现“无事可做”错误
- python - 如何将字符串更改为浮点列表和 n 维列表的“n”?
- docker - 启动用户态代理时出错:监听 tcp 0.0.0.0:7050:绑定:地址已在使用中
- eclipse - MAC OS 上的 Team Explorer 无处不在的问题