首页 > 解决方案 > Spring Boot - 如何在微服务之间进行通信?

问题描述

我目前正在开发一个 Spring Boot 微服务项目。我已经创建了服务,并且每个服务都单独运行。有了这个,我需要一些服务来与其他服务进行通信。我怎样才能做到这一点?

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

标签: spring-bootmicroservices

解决方案


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

为了让它们进化,你需要添加一些“魔法”(不是火箭科学),例如使用 Ribbon 在“生产者服务”的两个实例之间分配负载。

您可以使用一个发现服务,它只是一个带有注释 @EnableEurekaServer 的 spring-boot 应用程序(您需要在您的 pom 中添加适当的依赖项)现在将注释 @EnableDiscoveryClient 添加到您的第一个(原始)微服务到主类和defaultZone 在两者的 application.properties(或 application.yml)中指向您的 eureka-service,启动您的 eureka-service(发现服务)和 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);

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


推荐阅读