我是微服务新手。我目前正在开发一个使用微服务并使用同步和异步通信的应用程序。
最近我看到很多文章说你不应该使用同步(HTTP)通信而应该只使用异步(消息代理)。一些人提到 - 如果微服务通过 REST 进行通信,那么您实际上仍然拥有一个单体应用程序。
考虑我们有 2 个微服务 (MS) 的场景:
- CurrencyConversion MS - 我们会将输入传递给此 MS,因为我们要将 100 美元转换为 INR。 CurrencyConversion MS 将对 CurrencyExchange MS 执行 GET 调用,以获取美元对 INR 的汇率。
- CurrencyExchange MS - 我们会将输入作为 $ 传递给此 MS 到 INR,CurrencyExchange MS 会将汇率返回为 75,即 $1 = 75 INR。
在这种情况下,CurrencyConversion 无法独立工作,如果 CurrencyExchange 失败,CurrencyConversion 也会失败。
所以我的第一个问题是 - 服务之间的同步通信是微服务中的反模式吗?
第二个问题是 - 如果同步通信不是首选方式,那么什么是设计不同内部服务之间通信的最佳方式,其中一个服务将执行 GET 调用获取一些相关数据,例如我上面提到的场景。
我们如何在不使用同步通信的情况下克服这个问题?
最佳答案
当您在进行微服务项目时,微服务经常需要其他微服务。正如您所说,它们之间有多种通信方式:同步或异步。
就我而言,我认为同步和异步之间没有好坏之分,你需要做的是选择最符合你需求的。
在您提到的情况下,我个人会选择同步 HTTP 调用,因为如果您进行异步调用,则很难知道您的 MS 是否已收到请求,尤其是它何时会响应。这可能会迫使您暂时阻止来自客户端的调用,因为他正在 REST 资源上以 HTTP 同步调用您。
但是,如果您的客户不希望立即响应他的调用,您可以从异步调用开始并提供一个通知系统来通知您的客户其请求的响应已准备就绪。
无论如何,微服务之间的同步调用不应被视为反模式。同步和异步调用各自满足不同的需求,因此您必须根据自己的情况选择更合适的一种。
最后,不管你做同步还是异步,还是有几种方法可以做的。我认为,这里有一个链接很好地解释了这两种解决方案的不同可能性:https://dzone.com/articles/patterns-for-microservices-sync-vs-async
关于java - 我们应该如何设计不同内部微服务之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71994961/