我部署了两个微服务和一个
eureka server
。微服务是 eureka 客户端,即分别为 eureka-client-1
和 eureka-client-2
。
使用,
service discovery
,我想从eureka-client-1
的eureka-client-2
调用API。
以下是支持的代码和配置:
discovery-server
(eureka服务器)配置:server: port: 8761 eureka: client: fetch-registry: false register-with-eureka: false spring: application: name: discovery-server
eureka-client-1
和 eureka-client-2
具有相同的配置:eureka: client: service-url: defaultZone: http://localhost:8761/eureka
eureka-client-1
中,我使用 RestTemplate
与 eureka-client-2
请注意,我目前已评论了
LoadBalanced
注释。
@Bean
// @LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
我访问
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
无法返回已部署的唯一具有给定名称的服务的信息?即使同一个服务被部署多次,为什么它不能在内部应用负载均衡算法?为什么客户端要特意加上注解
我认为,您可以注入 loadBalancer 客户端或发现客户端来执行相同的操作。请记住,在使用 loadBalancer 客户端时,您可以使用 Choose() 方法,负载均衡器将根据该方法以循环方式在向 eureka 注册的多个实例中进行选择,但如果您使用的是发现客户端,则不是获取单个实例您将获得实例列表。在这两种情况下,我们实际上是从我们的一端为休息模板提供了一个负载均衡器。但使用另一种方法,如不指定客户端负载均衡,其余模板会在必须调用哪个实例之间感到困惑(假设将来会扩展实例)。所以剩下的模板抱怨我们从我们这边提供了一个LB。 另外,即使我们没有明确提及云负载均衡器依赖项,添加 eureka 客户端依赖项也会在内部获取 Spring Cloud 负载均衡器。因此,一旦其余模板看到这个 @LoadBalanced 注解,它就会将其视为客户端负载均衡器,并开始以循环方式从 eureka 获取实例。