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



这仍然是我心中的一个理论。

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

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

首先,我理解了每个微服务都应该有完整的代码&数据隔离(因此,在不同的实例/VM上);所有微服务都应该严格使用HTTP REST API协议进行通信。

我的疑虑如下:

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

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

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

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

非常感谢任何人对此的帮助
谢谢

#1

如果我需要显示100个订单,并且每个订单都有一个唯一的customer_id,我是否需要执行100个REST API调用?

不,只需发出一个具有100个order_id的请求,并返回一个order_id<=>的字典customer_id

#2
这是一个单一的请求

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

它可以返回您的order_id,您可以在本地为客户打印它,或者跟踪进度或您拥有的内容。

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

对于您的第一个问题,您不需要进行100个查询,只需要对100个文档的数组进行一个查询,如下所示:

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

https://stackoverflow.com/a/7713461/1384539

我知道这个问题已经有一年了,但我想补充我对第一点的回答。

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

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

最新更新