我们应该如何设计不同内部微服务之间的通信

how we should design communication between different internal Microservices

我是微服务新手。我目前正在开发一个使用微服务并使用同步和异步通信的应用程序。

最近看了很多文章说不应该使用同步(HTTP)通信,应该只使用异步(消息代理)。一些人已经提到 - 如果微服务通过 REST 进行通信,那么实际上您仍然拥有一个单体应用程序。

考虑我们有 2 个微服务 (MS) 的场景:

  1. CurrencyConversion MS - 我们会将输入传递给此 MS,因为我们要将 100 美元转换为 INR。 CurrencyConversion MS 将对 CurrencyExchange MS 执行 GET 调用,以获取 $ 到 INR 的汇率。
  2. CurrencyExchange MS - 我们会将输入作为 $ 传递给此 MS 到 INR,CurrencyExchange MS 将 return 汇率作为 75,即 $1 = 75 INR。

在这种情况下,CurrencyConversion 无法独立工作,如果 CurrencyExchange 失败,CurrencyConversion 也会失败。

所以我的第一个问题是 - 服务之间的同步通信是微服务中的反模式吗?

第二个问题是 - 如果同步通信不是首选方式,那么什么是 设计不同内部服务之间通信的最佳方式 其中一个服务将 执行 GET 调用以获取一些相关数据 例如我上面提到的场景。

我们如何在不使用同步通信的情况下克服这个问题?

当你在做一个微服务项目时,微服务需要其他微服务是很常见的。正如您所说,它们之间有几种通信方式:同步或异步。

就我而言,我认为同步和异步之间没有好坏之分,你需要做的是选择最符合你需求的。

在您提到的情况下,我个人会选择同步 HTTP 调用,因为如果您进行异步调用,则很难知道您的 MS 是否已收到请求,尤其是它何时会响应。这可能会迫使您暂时阻止来自您的客户端的调用,因为他正在 REST 资源上以 HTTP 同步调用您。

但是,如果您的客户不希望立即响应他的​​调用,您可以从异步调用开始并提供一个通知系统来通知您的客户他的请求已准备好响应。

无论如何,微服务之间的同步调用不应被视为anti-patterns。同步和异步调用各自满足不同的需求,所以你要根据自己的情况选择更合适的。

最后,不管你做同步的还是异步的,还是有几种方法可以做的。这是一个 link,我认为它很好地解释了这两种解决方案的不同可能性:https://dzone.com/articles/patterns-for-microservices-sync-vs-async

服务之间的同步通信不是微服务中的anti-pattern。但重要的是要根据指定的质量要求选择合适的沟通方式。 Microservices.io 描述了一些具有优缺点、权衡和示例的通信模式。

In such cases, CurrencyConversion can't work independently and if CurrencyExchange is failing, CurrencyConversion is also going to fail.

在您的示例中,两个 MS 高度耦合,因为它们需要在同步事务中协同工作以响应用户请求。假设用户希望在特定时间间隔(比如 50 毫秒)内得到响应,同步通信似乎是合适的。级联错误可以通过弹性模式(断路器、隔板等)来抵消。在我看来,示例功能应该只部署在一个 MS (Currency-Service) 中。所描述的两个操作和底层域模型似乎具有很高的内聚性。这是一个强烈的信号,您不应将功能拆分为多个 MS。通讯问题解决:)