在上一篇文章如何实现微服务之间的同步交互中,我们回顾了同步交互 (HTTP/HTTPS)。如您所见,此类应用程序可能存在一些应该解决的问题。例如,如果某些服务没有按预期工作,应用程序应该如何运行。如果服务不断需要来自另一个服务的数据怎么办?该服务能否应对负载?这只是在具有同步交互的微服务中可以找到的几个有问题的地方。在这篇文章中,将回顾微服务之间的异步交互。

        让我们创建一个示例来展示用例。如何实现微服务之间的同步交互中的图表 不能重复使用,在这种情况下最好的办法是:

  • 请求酒店服务以查找可用酒店房间列表。
  • 在具体的酒店房间选择上,异步调用三个API从酒店 Service接收酒店房间摘要,从酒店 Attractions Service接收景点,从第三方事件Service接收事件。如果酒店景点服务或第三方活动服务无法处理请求,屏幕上将显示与此数据相关的空白部分。

在这篇文章中,使用了航班预订系统。

#yyds干货盘点#——如何实现微服务之间的异步交互_微服务


城市和航班微服务是异步通信的第一步

首先,为了指定最基本的航班详细信息,需要有关城市的信息。因此,创建了城市 Service微服务。在这篇文章的范围内,城市仅用于航班。但是,城市可以用于其他服务,如酒店服务、汽车租赁服务、景点服务、天气服务、用户服务等。该服务可以有一个简单地CRUD API,城市可以用名称、描述、国家、人口、货币、语言、历史事件等来描述。

让我们想象一下,对于航班 Service,我们只需要一个 城市 id 和 name 来创建一个flight。景点服务可能还需要城市描述、货币、语言等。

值得一提的是,城市很少发生变化。另一个可以考虑的因素是这个城市服务被许多其他服务使用。每次使用同步方法调用城市服务以获取有关城市的信息都会对其产生巨大的负载。无论如何,例如在航班 Service 中,我们需要将城市链接到特定航班。

可以做什么?

  • 使用消息代理,例如Kafka或RabbitMQ。
  • 每个需要城市服务订阅的一些主题如cities_topic
  • 在城市 Service 中的每个操作 ( CRUD ) 上都会创建一个事件。此事件包含具有所有字段和执行的操作的城市快照。
  • 此城市事件发布到city_topic 中的消息代理中。
  • 每个订阅此主题服务的人都会收到一个事件并将其保存到服务的数据库中以供进一步使用。
  • 在一项服务(例如飞行服务)中,城市表只能包含idname。在其他服务中,可以保存其他字段。
  • 这是发布订阅模式的一个例子。

就这样。我们不需要使用城市 Service来处理航班。当城市服务关闭时, 飞行服务不受影响。此外,飞行服务可以独立测试。我们只需要将数据插入到航班Service 城市数据库表中。、


使 Flight 和 Notification 微服务异步

     让我们继续我们的例子并描述Flight Service和Notification Service之间的关系。

      当用户预订航班时,我们希望将预订详细信息发送给用户。它可以是电子邮件、短信、推送通知到智能手机应用程序等。

该飞行服务仅适用于飞行操作负责。它不应该知道消息传递。此外,其他服务可能对发送一些用户通知感兴趣。我们不想重复交付逻辑:

  • 寻找目标用户。
  • 查找用户首选项(例如,用户可以禁用 SMS 通知)。
  • 查找用户联系方式,例如电子邮件。
  • 查找基于某些预定义类型的电子邮件模板,例如航班 成功预订
  • 创建电子邮件正文。
  • 发送电子邮件。
  • 跟踪交付并重试。

因此,通知服务可用于此类操作。

  • ​通知服务订阅了单个主题,例如通知。
  • 航班 Service创建关于通知的事件并将其发布到主题(所有服务都使用单个通知主题)。
  • 通知 Service负责接收和发送通知给目标用户。

如果航班 Service向通知主题发布事件并且 通知服务完成,则事件将保存在消息代理中并在通知服务可操作性恢复时进行处理。


总结

在本文中,回顾了异步微服务交互。这种方法有助于使服务更加独立。但是,在某些情况下,跨服务的数据重复可能是一个问题。Kafka或RabbitMQ可用于实现此类异步微服务交互。