Spring Boot 为什么在使用RestTemplate和Eureka 服务器进行服务发现时需要@LoadBalanced注解

dced5bon  于 2024-01-06  发布在  Spring
关注(0)|答案(1)|浏览(181)

我部署了两个微服务和一个eureka server。微服务是Eureka 客户端,分别是eureka-client-1eureka-client-2
使用service discovery,我想从eureka-client-2eureka-client-1调用API。
以下是支持的代码和配置:
1.discovery-server(Eureka 服务器)配置:

  1. server:
  2. port: 8761
  3. eureka:
  4. client:
  5. fetch-registry: false
  6. register-with-eureka: false
  7. spring:
  8. application:
  9. name: discovery-server

字符串
1.eureka-client-1eureka-client-2配置相同:

  1. eureka:
  2. client:
  3. service-url:
  4. defaultZone: http://localhost:8761/eureka


1.在eureka-client-1中,我使用RestTemplateeureka-client-2通信

请注意,我目前已经注解了LoadBalanced注解。

  1. @Bean
  2. // @LoadBalanced
  3. public RestTemplate restTemplate(){
  4. return new RestTemplate();
  5. }


1.我访问eureka-client-2的API如下:

  1. restTemplate.getForObject(
  2. "http://EUREKA-CLIENT-2/api/v1/check/{customerId}", Response.class, customer.getId());


当我部署和测试应用程序时,我得到了EUREKA-CLIENT-2UnknownHostException。但是,一旦我启用注解@LoadBalanced,一切都正常,eureka-client-1可以成功地与eureka-client-2通信。
我的问题是:为什么@LoadBalanced annotation是绝对强制性的?如果我只部署了每个微服务的单个示例,为什么discovery-server不能返回唯一部署的具有给定名称的服务的信息?即使多次部署相同的服务,为什么它不能在内部应用负载均衡算法?为什么客户端必须专门添加annotation

brqmpdu1

brqmpdu11#

我认为,你可以注入一个loadBalancer客户端或一个发现客户端来做同样的事情。只要记住,在使用loadBalancer客户端时,你可以使用choose()一种方法,LB将根据该方法以循环方式在Eureka 注册的多个示例中进行选择,但如果使用的是发现客户端,则将获得一个示例列表,而不是单个示例。请参见在这两种情况下,我们实际上是从我们的终端给REST模板一个负载均衡器。但是对于另一种方法,如不指定客户端LB,REST模板在必须调用哪个示例之间感到困惑(假设将来会扩展示例).所以rest模板抱怨我们从我们的终端提供一个LB。同时向它添加Eureka 客户端依赖项将在内部获取一个spring云因此,只要rest模板看到这个@LoadBalanced注解,它就会将其视为客户端负载均衡器,并开始以循环方式从Eureka 获取示例。

相关问题