问题:
在通过RestTemplate进行调用其他项目的API时,由于是在本地调本地,产生了No instances available for localhost错误,导致无法调用。
原因:
既然是负载均衡,那必然是多台服务器的负载均衡,用IP访问就没有意义了,因此用负载均衡的注解时,不能用IP或者localhost,而应该用服务名。
RestTemplate的底层错误原因(摘录):
自动注入的restTemplate中加入了cloudflix*包下面的interceptor,
所以默认会通过RibbonLoadBalancerClient去查找注册中心的instances,
如上面的代码,www.baidu肯定不存在,所以就报错了。
问题是 因为 LoadBalancedClient 这里的 choose 根据 Consul注册的服务名(spring.cloud.consul.discovery.serviceName=service-producer) 命中一个服务提供者;
这里就不能使用加了LoadBalanced注解的RestTemplate对象了,因为会根据 host 去Consul查找服务提供者,这样就会抛异常 :No instances available for XXX ,也就是找不到指定的服务ID
原因:"服务地址:" + serviceInstance.getUri()这儿出现了问题。
解决方案:
在配置类配置RestTemplate时,分别配置负载均衡与默认优先选择,即写两个RestTemplate方法
@LoadBalanced
@Bean
public RestTemplate loadBalanced1() {
return new RestTemplate();
}
@Primary
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
更多推荐
解决RestTemplate的No instances available for localhost错误
发布评论