问题:

在通过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错误