繁体   English   中英

两个微服务之间的双向通信(spring boot)

[英]Two way communication between two micro services (spring boot)

我有两个微服务M1M2 ,我需要从M1M2发送请求,我需要等待M2的响应,因为代码基于M2的响应工作 如何在spring boot中实现这个?

通过 controller 在您的 M1 微服务中创建 REST API 然后使用一些 ZDB93446A771 客户端库从 M2 调用它。

有很多方法可以做到这一点。 我建议您使用诸如Active MQRabbit MQKafka之类的消息传递工具在M1M2之间实现producer/consumer模式。

  1. M1向队列Q1生成消息
  2. M2处理来自Q1的消息
  3. M2回复Q2
  4. M1消费来自Q2的消息

看看这里

您在 M2 中创建 REST API 将消耗或响应您来自 M1 的输入

例如,您的 @RestController 中可能有以下端点,在 M2 中注释 class:

@GetMapping("/consumer")
public ResponseEntity<YourResponseDTO> produceResponse(){
    YourResponseDTO result = resultOfYourBusinessLogic();
return ResponseEntity.ok(result);

然后在您的 M1 服务中,我认为最简单的方法是使用 RestTemplate 调用 M2 这是一个示例:

RestTemplate rt = new RestTemplate();
YourResponseDTO result = rt.getForObject("http://urlOfYourM2/consumer", YourResponseDTO.class);

请注意,这只是生成“YourReponseDTO”Object 的 GET 请求的调用示例。 您提供的有关消息交换的实际需求的详细信息非常少,因此 RestTemplate 可以以不同的方式使用(不同类型的请求 PUT/POST/等...)您可以根据需要使用错误处理程序、连接超时设置对其进行自定义等等

这种方法的缺点是您需要在 M1 和 M2 之间共享 DTO model 以正确 map 响应对象。 但无论如何,RestTemplate 是一个客户端实现,您可以使用它在微服务之间进行同步通信

您可以使用声明式 Rest 客户端“Spring Cloud OpenFeign”进行同步通信,如下所示:

Spring Cloud - 与 Feign 同步通信

在大多数情况下,它总是建议在服务之间使用异步通信来保持它们的解耦。 如果您想为您的案例使用异步通信,您需要将双向事件通道实现为@Harry Coder。 由于您等待立即响应,因此它需要实现诸如 SAGA、CAP 理论、断路器之类的模式来为此类实现带来可靠性,特别是您的案例。

如果立即响应至关重要,您可以使用同步通信,例如 API 调用或 gRPC。 如果您需要高性能和快速的通信 gRPC 值得为这些服务实施。 最好使用Mass Transit之类的库来减少实现中的耦合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM