Spring Boot-微服务之间如何通信?

Thi*_*ran 1 spring-boot microservices

我目前正在从事Spring Boot微服务项目。我已经创建了服务,并且每个服务都单独运行。这样,我需要一些服务来与其他服务进行通信。我该如何实现?

我看到一些有关此的博客,这些博客使用Netflix,Eureka云服务器来实现此目的。在不使用云服务器的情况下,有什么方法可以在本地环境中实现?

vip*_* cp 8

微服务之间有不同的通信方式。但是使用哪一个:取决于用例。

  1. Api call:这是使用使实际的REST API调用其他服务RestTemplateFeignClient等如。
ResponseType obj=  new RestTemplate().getForObject(URL, ResponseType.class, params);
Run Code Online (Sandbox Code Playgroud)
  1. 但是,如果用例不同,例如,您的客户微服务和订单微服务都使用单独的数据库,该怎么办。您还有数据库中的customer name其他详细信息orders。一旦客户更新了他们的名字,您也必须更新 Orders 数据库中的详细信息。如何做到这一点。通过API call?那么如果账户微服务也需要这个更新呢。所以 Rest api 将是一个开销。在这个用例中,我们可以使用MessageQueueslike RabbitMQ。客户微服务将创建一个客户更新事件,任何对此感兴趣的微服务都可以订阅。

像RabbitMQ一样通过消息队列进行通信

Spring.io 兔 mq 指南


小智 8

这取决于您的选择、您希望服务之间进行同步通信还是异步通信。对于同步服务,您可以使用以下第三方工具之一:

  1. 算力公司领事
  2. Netflix Eureka [您可以使用 Netflix RIBBON 进行客户端负载平衡]
  3. NATS等

对于异步,您可以使用消息传递解决方案,例如:

  1. Redis [使用列表/流]
  2. ActiveMQ
  3. RabitMQ
  4. 卡夫卡
  5. NATS等


Mez*_*ane 5

当然可以。微服务只是REST服务。您需要了解REST服务的工作方式。之后,只需使用Spring-boot编写2个微服务(2个REST服务:生产者服务和消费者服务),让它们在不同的服务器端口下运行,从另一个服务器端口调用消费者服务即可,就是这样:您拥有了微服务。现在,这是编写微服务的原始方法。

为了使它们发展,您需要添加一些“魔术”(无火箭科学),例如,使用Ribbon在“生产者服务”的两个实例之间分配负载。

您可以使用带有注解@EnableEurekaServer的发现服务,它只是一个春季启动应用程序(您需要在pom中添加适当的依赖项)。现在,将(@EnableDiscoveryClient)注解添加到第一个(原始)微服务中,并添加到主类和在两者的application.properties(或application.yml)中指向您的eureka服务的defaultZone,启动您的eureka服务(发现服务)和2个微服务:这两个微服务将在发现服务上注册。当然,现在您无需在消费者服务中硬编码生产者服务的http地址。
看一下本教程

于格林威治标准时间2018年11月21日12:41编辑

假设您的第一个(简单)微服务(纯休息服务)在PC上的端口8091下运行。

在第二个(琐碎的)微服务的控制器中,您可以使用RestTemplate.getForEntity(url,responseType,uriVariables)调用第一个服务,如链接教程中的示例所示:

ResponseEntity<CurrencyConversionBean> responseEntity = 
   new RestTemplate().getForEntity(
        "http://localhost:8091/currency-exchange/from/{from}/to/{to}", CurrencyConversionBean.class,  uriVariables);
Run Code Online (Sandbox Code Playgroud)

其中url:您的第一个(微型)(其余)服务的url。responseType:等待作为响应的对象的类/类型。uriVariables:是包含URI模板变量的映射。


Abh*_*eet 3

正如 @g00glen00b 在评论中提到的,Eureka 不用于微服务之间的通信。它用于服务发现。据我所知,您可以通过两种方式与其他微服务进行通信:

  1. 休息模板
  2. 假客户端

RestTemplate 使用起来非常简单。它不需要配置。

例如

   ResponseType obj=  new RestTemplate().getForObject(URL, ResponseType.class, params);
Run Code Online (Sandbox Code Playgroud)

url - 网址

responseType - 返回值的类型

params- 扩展模板的变量

Spring Doc链接供您参考