我不熟悉微服务.我目前正在使用微服务开发一个应用程序,并同时使用同步和异步通信.

最近我读了很多文章,说不应该使用同步(HTTP)通信,而应该只使用异步(message broker).有几个人提到过——如果微服务通过REST进行通信,那么实际上,您仍然拥有一个单片应用程序.

假设我们有两个微服务(MS):

  1. CurrencyConversion毫秒-我们将把输入传递给这个毫秒,因为我们想把CurrencyConversion美元转换成印度卢比.CurrencyConversion MS将执行对CurrencyExchange MS的GET调用,以获取美元兑印度卢比的汇率.
  2. CurrencyExchange毫秒-我们将以美元对印度卢比的形式向该MS传递输入,CurrencyExchange MS将以75的形式返回汇率,即$1=75印度卢比.

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

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

第二个问题是——如果同步通信不是一种首选方式,那么一个服务将在best way to design communication between different internal servicesexecute a GET call to get some dependent data之间运行,例如我上面提到的场景.

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

推荐答案

在微服务中,服务之间的同步通信不是反模式的.但是,根据特定的质量要求 Select 合适的沟通方式很重要.Microservices.io介绍了一些与pros&;缺点、权衡和例子.

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

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

Java相关问答推荐

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

try 创建一个对象,使用它,然后使用一条语句将其存储为列表

Spring Boot Maven包

我不能再在Android Studio Hedgehog上用Java语言创建新项目了吗?

Java-动态绑定-问题-了解

用OSQL创建索引

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

虚拟线程应该很快消亡吗?

如何在SWT菜单项文本中保留@字符

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

协同 routine 似乎并不比JVM线程占用更少的资源

不能在 map 上移除折线

升级版本后出现非法访问错误

设置背景时缺少Android编辑文本下划线

JavaFX中ListView中的问题

SonarQube在合并升级到java17后对旧代码提出错误

为什么 Random() 的行为不符合预期?

我可以使用一个 PoolingNHttpClientConnectionManager 运行多个 HttpAsyncClient 吗?

Spring Boot 的 WelcomePageHandlerMapping 在无效的 API 路径上被调用,其中预期出现 404 错误

Spring Boot不创建数据库表