关于netflix.client.ClientException: Load balancer does not have available server for client:xxx的好文章
关于com.netflix.client.ClientException: Load balancer does not have available server for client:xxx从字面意思是说负载均衡策略没有找到可用的服务xxx首先,你先不要去检查,听我说,在@FeignClient先使用uri的属性去指定远程调用的服务地址,如果可以成功,那就是服务名根本不起作用.如果还是不成功,
关于com.netflix.client.ClientException: Load balancer does not have available server for client:xxx
从字面意思是说负载均衡策略没有找到可用的服务xxx
首先,你先不要去检查,听我说,在@FeignClient先使用uri的属性去指定远程调用的服务地址,如果可以成功,那就是服务名根本不起作用.如果还是不成功,这个时候,看控制台输出,如果错误输出是一样的,大概率就是你基本的远程调用的操作步骤都没搞好.如果控制台输出的错误不一致的话,先尝试解决这个问题,记得不要太深入,解决不了就不要去解决了,固定都是因为刚开始那个错误引起的,如果能解决,当然是最好.能解决的话,就又回到了uri设置能远程调用成功这个点上,说明服务名根本不起作用.
为什么服务名不起作用?
-
最大的问题可能是服务名写错了.
-
可能压根就没有注册服务
-
可能GateWay网关根本没有配置这个服务.
-
可能注册了这个服务根本就没有被发现
所以,可以从下面几个去分析问题: -
首先看你的服务名是否正确,是否都注册到nacos中心,记得GateWay一定要开启,也要注册进去.
-
其次,是否加上两个固定注解@EnableDiscoveryClient @EnableFeignClients
-
看配置,如果你使用了bootsrap.yml加载外部化配置,查看控制台输出,看是否将相关的配置文件加载进来:
-
也是看加载的文件是否合理,比如说,看你加载的文件里是否有些配置被重新加载了,比如说如果你也配置了application.properties的文件,注意和bootstrap.yml看看是否有冲突的配置.
-
总之,就是先检查最基本的配置问题,这里提个醒的是,一定不要忽略控制台的输出,很多人都会忽略控制台的输出情况,都是直接看输出错误是什么,这样子你只能从csdn上查错误,然后一个一个去尝试,这样效率很差.你可以从将头到尾浏览一遍,看一些重要信息: 加载的配置文件,端口号,警告内容等等,然后这个时候你再去逐一对照你基本的远程调用配置是否正确,如果还是有问题,这样子才可以去查网络.
-
如果去查网络的话,推荐先看csdn,记住,看csdn不要盲目,看几个和你不相关的就不要尝试了,而且和你相关的你尝试几个发现没用后就不要看了,剩下的大多千篇一律,这个时候就可以转Stack Overflow 这个网站去查,道理也一样,还是查不到就不要查了.
-
在这个过程中,你要注意的是,一旦你修改了某个配置发现还是报错,不要气馁,先看报错信息是否一致,如果一致,说明修改这个配置压根没用,可以更换回来,继续查找,如果报错信息不一致了,说明这个配置可能生效了,这个时候继续当前这个错误去解决.而且,你要抓住机会的是,一旦修改配置生效了,你可以立即去尝试使用直接uri属性的方式去调用(前面说过),一般基本配置没有问题都能成功.
-
如果还是没有成功,你一定要断定是版本的问题,去看版本信息吧!因为版本不合适,导致某些依赖找不到,或者这个依赖根本不符合当前这个版本,所以这个时候你就要尝试去添加或者更换一些依赖.
-
对了最重要的是,如果是版本的问题,更重要的可能是在application文件中缺少了某个配置,比如说下面这个feign.hyStrix.enable=true(我用版本Greenwich.SR6,对应feign2.1.5.release),这个配置在网上各执一词,有说这个配置没用,有说这个配置有用.
-
第十个,也是我遇到的一个大坑,是关于服务命名空间会导致远程失败的问题,前面说到,远程调用失败的问题,在基础代码没有任何错误的前提,那一定是配置出错,唯一可能就是服务名不可用,首先,服务名不可用有可能是feign的版本问题,没有内置ribbon,前面说到加上ribbon这个依赖就可以了,其次,服务不可用还有一个原因,就是在nacos中同命名空间下根本就找不到这个服务,注意,这里是同命名空间下,如果不同命名空间下注册有该服务,该服务是不能共享的,这是命名空间隔离性的特点.但值得注意的是,如果是加载外部化配置文件,多个微服务建议使用不同的命名空间就很好,根据隔离性,每个微服务都对应自己一个命名空间,然后分别在各自的命名空间下配置分组,这些分组刚好对应各自的开发,测试,生产,其他等等环境,管理的很精致.(前者博主说的是服务注册,后者说的服务配置,要区分,服务注册同一个命名空间,服务配置建议不同的命名空间)
-
最后一点也是必须要说的一件事,feign.hystrix.enable这个配置很诡异,有时候能解决feign远程调用失败的问题,有时候又不能解决,如果观察这feign远程调用源码,你就会发现,加上这个配置和不加上这个配置是有很大区别的,二者的远程调用的执行器变得不一样了,前者用的是关于HyStrixCommand相关的这个执行器,说明我们要配置HyStrixCommand这个注解去使用,也就是加上这个配置,又回到了feign+HyStrix那一套,但是我们渴求的是使用SpringCloud Alibaba中OpenFeign+Sentinel去代替,也就说明,肯定不要用到feign.hystrix.enable这样的配置.如果你想比较这两个执行器的不同,你可以在远程调用执行的时候通过调试,比较加上feign.hystrix.enable这个配置和不加上这个配置进入的执行器有什么不同.(如果调试,需要提醒一点的是,建议设置feign的熔断时间长一些,因为你调试的时候可能会浪费一点时间,会出现feign调用超时的现象,这个无关紧要,你设置长一点,能调通就可以了)
更多推荐
所有评论(0)