背景
在搭建微服务项目架构的过程中,整合Nacos discovery后,发现之前可以进行服务之间调用的openfeign,无法进行服务之间的调用报非法参数异常。
java.lang.IllegalStateException: No instances available for XXXX
微服务架构背景
本次项目整合了openfeign、nacos discovery,使用openfeign进行服务间调用,并使用ribbon进行负载均衡。
报错原因
使用了ribbon做了负载均衡。
@Bean
@LoadBalanced // 负载均衡 必须使用注册中心上的服务名 不能用ip或域名
public RestTemplate restTemplate() {
return new RestTemplate();
}
再使用ribbon做负载均衡后,服务间调用的时候,不能再直接使用ip或者域名进行调用服务,必须使用注册中心上的服务名才能实现服务之间的调用,都则就会报上述错误。
原理大致是在ribbon底层在负载均衡的时候,会从注册中心获取服务,通过服务来实现负载均衡的效果,如果使用的是ip或者域名,则只能调用一个服务,不能负载均衡。
openfeign错误配置(微服务间调用)
@Component //交给容器管理
@FeignClient(name = "feignTestService", url = "http://localhost:5500")
public interface PaymentFeignService {
}
openfeign正确配置
@Component //交给容器管理
@FeignClient(value = "XXX") //调用服务名为XXX的服务
public interface PaymentFeignService {
}