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

问题描述 投票:0回答:1

我部署了两个微服务和一个

eureka server
。微服务是 eureka 客户端,即分别为
eureka-client-1
eureka-client-2

使用,

service discovery
,我想从
eureka-client-1
eureka-client-2
调用API。

以下是支持的代码和配置:

  1. discovery-server
    (eureka服务器)配置:
server:
  port: 8761

eureka:
  client:
    fetch-registry: false
    register-with-eureka: false
  
spring:
  application:
    name: discovery-server
  1. eureka-client-1
    eureka-client-2
    具有相同的配置:
eureka:   
  client:
    service-url:
       defaultZone: http://localhost:8761/eureka
  1. eureka-client-1
    中,我使用
    RestTemplate
    eureka-client-2
  2. 进行交流

请注意,我目前已评论了

LoadBalanced
注释。

   @Bean
   // @LoadBalanced
   public RestTemplate restTemplate(){
     return new RestTemplate();
   }
  1. 我访问

    eureka-client-2
    的api如下:

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

当我部署和测试应用程序时,我得到

UnknownHostException
EUREKA-CLIENT-2
。但是,一旦我启用注释
@LoadBalanced
,一切都会正常,并且
eureka-client-1
可以成功与
eureka-client-2
通信。

我的问题是:为什么

@LoadBalanced
注释是绝对强制的?如果我只部署了每个微服务的单个实例,为什么
discovery-server
无法返回已部署的唯一具有给定名称的服务的信息?即使同一个服务被部署多次,为什么它不能在内部应用负载均衡算法?为什么客户端要特意加上注解

spring-boot microservices spring-cloud netflix-eureka service-discovery
1个回答
0
投票

我认为,您可以注入 loadBalancer 客户端或发现客户端来执行相同的操作。请记住,在使用 loadBalancer 客户端时,您可以使用 Choose() 方法,负载均衡器将根据该方法以循环方式在向 eureka 注册的多个实例中进行选择,但如果您使用的是发现客户端,则不是获取单个实例您将获得实例列表。在这两种情况下,我们实际上是从我们的一端为休息模板提供了一个负载均衡器。但使用另一种方法,如不指定客户端负载均衡,其余模板会在必须调用哪个实例之间感到困惑(假设将来会扩展实例)。所以剩下的模板抱怨我们从我们这边提供了一个LB。 另外,即使我们没有明确提及云负载均衡器依赖项,添加 eureka 客户端依赖项也会在内部获取 Spring Cloud 负载均衡器。因此,一旦其余模板看到这个 @LoadBalanced 注解,它就会将其视为客户端负载均衡器,并开始以循环方式从 eureka 获取实例。

© www.soinside.com 2019 - 2024. All rights reserved.