我部署了两个微服务和一个eureka server
。微服务是Eureka 客户端,分别是eureka-client-1
和eureka-client-2
。
使用service discovery
,我想从eureka-client-2
的eureka-client-1
调用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
通信
请注意,我目前已经注解了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());
型
当我部署和测试应用程序时,我得到了EUREKA-CLIENT-2
的UnknownHostException
。但是,一旦我启用注解@LoadBalanced
,一切都正常,eureka-client-1
可以成功地与eureka-client-2
通信。
我的问题是:为什么@LoadBalanced
annotation是绝对强制性的?如果我只部署了每个微服务的单个示例,为什么discovery-server
不能返回唯一部署的具有给定名称的服务的信息?即使多次部署相同的服务,为什么它不能在内部应用负载均衡算法?为什么客户端必须专门添加annotation
1条答案
按热度按时间brqmpdu11#
我认为,你可以注入一个loadBalancer客户端或一个发现客户端来做同样的事情。只要记住,在使用loadBalancer客户端时,你可以使用choose()一种方法,LB将根据该方法以循环方式在Eureka 注册的多个示例中进行选择,但如果使用的是发现客户端,则将获得一个示例列表,而不是单个示例。请参见在这两种情况下,我们实际上是从我们的终端给REST模板一个负载均衡器。但是对于另一种方法,如不指定客户端LB,REST模板在必须调用哪个示例之间感到困惑(假设将来会扩展示例).所以rest模板抱怨我们从我们的终端提供一个LB。同时向它添加Eureka 客户端依赖项将在内部获取一个spring云因此,只要rest模板看到这个@LoadBalanced注解,它就会将其视为客户端负载均衡器,并开始以循环方式从Eureka 获取示例。