案例使用环境如下
SpringCloud Hoxton.SR9
SpringBoot 2.2.5.RELEASE
jdk8
SpringCloud集成eureka的pom版本是4.1.1
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>4.1.1</version>
</dependency>
自定义负载均衡策略为随机模式代码
@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
return new RandomRule(); // 定义机制
}
}
当编写这个类的时候,发现 IRule、RandomRule这个两个类引入不进来,于是pom文件增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
之后两个类引入进来了之后,主启动类上增加注解
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
CLOUD-PAYMENT-SERVICE:是调用的提供者服务实例名称
启动项目访问出现以下错误
java.lang.IllegalStateException: No instances available for CLOUD-PAYMENT-SERVICE
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:119) ~[spring-cloud-netflix-ribbon-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:99) ~[spring-cloud-netflix-ribbon-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:58) ~[spring-cloud-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:93) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:77) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
但是我的提供者服务实例明明在Eureka上是跑着的,并且是健康的状态,怎么会找不到呢?
于是开始排查错误,最后发现 使用的Eureka版本为4.1.1 , 如果手动引入了 spring-cloud-starter-netflix-ribbon这个依赖,使用默认的负载均衡规则,也是找不到服务实例的,最后无奈只能降低了 Eureka的版本为 2.1.2.RELEASE,删除 手动引入的spring-cloud-starter-netflix-ribbon,就可以调用成功了。我也不知道什么原因,为什么手动引入这个依赖就不行了
如果你也遇到这个问题,就降低版本吧
解决方案
降低Eureka的版本从 4.1.1 -----> 2.1.2.RELEASE
有大佬知道的么。