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

时间:2015-12-08 14:49:01

标签: rest server publish-subscribe microservices

这在我看来仍然是一种理论。

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

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

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

我的怀疑如下:

  1. 要显示订单列表,我将使用订单数据库获取所有订单。在每个订单文档中(我将使用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上)捕获此消息&发送推送消息&使用消息内容中的数据向服务提供商的设备发送短信 这有可能吗?
    对问题2的更新:我希望Order微服务完全独立于将要并行构建的任何其他微服务。通道微服务是微服务的一个例子,它取决于订单微服务中发生的事件。

  3. 另外,请指导我使用的所有技术/库。

    我将要开发的内容:
    Java的
    MongoDB的
    每个微服务的亚马逊AWS实例。

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

3 个答案:

答案 0 :(得分:2)

<强>#1

  

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

不,只需使用100个order_id发出1个请求,然后返回order_id&lt; =&gt;的字典CUSTOMER_ID

<强>#2
这是一个单一的请求

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

哪些可以返回给您order_id,您可以在本地为客户打印或跟踪进度或有什么。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

我知道这个问题是1岁,但我想在第一点添加我的答案。

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

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