使用 REST 和 PUB/SUB 的微服务间通信

Inter-microservices Communication using REST & PUB/SUB

这在我脑海中仍然是一个理论。

我正在通过将事物拆分为微服务来重建我的后端。我想开始的微服务是:
- 订单(存储订单详细信息和每个订单的状态)
- 客户(存储客户详细信息、地址、预订的订单)
- 服务提供商(存储服务提供商详细信息、每个服务提供商的状态和位置、服务提供商当前正在处理的订单等)
- 付款(存储每个订单的付款信息)
- 渠道(通过电子邮件/短信/移动推送与客户沟通)

我希望能够使用PUB/SUB创建一条带有相应数据的消息,它可以被订阅该消息的任何其他微服务使用。

首先,我理解每个微服务都应该有完整的代码和数据隔离(因此,在不同的实例/虚拟机上)的概念;并且所有微服务都应该严格使用 HTTP REST API 契约进行通信。

我的疑惑如下:

  1. 为了显示订单列表,我将使用订单数据库获取所有订单。在每个订单文档中(我将使用 MongoDB 进行存储),我将有一个 customer_id 外键。现在使用customer_id.
    解决customer_name的问题 如果我需要在页面上显示 100 个订单并假设每个订单都有一个唯一的 customer_id 与之关联,那么我是否需要执行 REST API 调用 100 次才能获得所有 100 customer_id 的名字? 或者,数据复制是解决这个问题的好方法吗?

  2. 我正在设想这样的事情 w.r.t。 PUB/SUB: 业务中心人员将订单标记为已分配 & select 服务提供商分配给该订单。这会在跨服务器 PUB/SUB 频道上创建一条消息。
    然后,Channel 微服务(位于完全不同的实例/VM 上)捕获此消息并使用消息内容中的数据将推送消息和 SMS 发送到服务提供商的设备。
    这可能吗?
    问题 2 的更新:我希望订单微服务完全独立于将构建在它之上/并列的任何其他微服务。渠道微服务是微服务的一个示例,它依赖于订单微服务中发生的事件。

此外,请指导我使用哪些技术/库。

我要开发的内容:
Java
MongoDB
每个微服务的 Amazon AWS 实例。

在此感谢任何人的帮助。
谢谢!

对于你的第一个问题,你不需要做 100 个查询,只需要一个包含 100 个文档的数组,如下所示:

db.collection.find( { _id : { $in : [1,2,3,4] } } );

#1

If I need to show 100 orders and each order has a unique customer_id, will I need to do 100 REST API call?

不,只用 100 order_id(s) 和 return 一个 order_id <=> customer_id

的字典发出 1 个请求

#2
这是一个单一的请求

POST
/orders/new
{
    "selected_service_provider_id" : "123"
    ...
}

您可以 return order_id 您可以在本地为客户打印它或跟踪进度或您有什么。

在服务器端,您收到订单并进行处理。处理可以包括在某个阶段发送 SMS。此功能可以在接收此请求的原始服务中实现,也可以作为对另一个专用服务的单独调用来实现。

我知道这个问题已有 1 年历史,但我想对第一点添加我的答案。

一种选择是使用某种形式的 CQRS,并在创建订单时将一些用户详细信息也存储在 OrderDB 上。这样,当您必须显示订单列表时,您已经拥有了所需的所有详细信息。此外,订单文档将代表创建订单时用户状态的照片。

当然,如果您在存储订单时没有用户详细信息,您只需要对用户服务进行 GET 调用,但那将是 1 次调用,而不是 100 次。