Spring Cloud Feign启动Load balancer does not have available server for client分析
项目场景:
Spring Cloud Feign 学习过程中遇到Feign访问的时候报错Load balancer does not have available server for client
问题描述:
完整报错日志如下
path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: MS-CUSTOMER] with root causecom.netflix.client.ClientException: Load balancer does not have available server for client: MS-CUSTOMERat com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483) ~[ribbon-loadbalancer-2.2.2.jar:2.2.2]at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.2.2.jar:2.2.2]at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.2.2.jar:2.2.2]at rx.Observable.unsafeSubscribe(Observable.java:10211) ~[rxjava-1.1.10.jar:1.1.10]at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94) ~[rxjava-1.1.10.jar:1.1.10]at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42) ~[rxjava-1.1.10.jar:1.1.10]at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10]at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10]
原因分析:
从报错信息上看Load balancer does not have available server for client: MS-CUSTOMER,表示负载均衡器没有找到有效的服务信息,此异常是 LoadBalancerContext从LoadBalancer对象中获取服务的时候, 没有找到所调用的服务信息
Server svc = lb.chooseServer(loadBalancerKey);
if (svc == null){throw new ClientException(ClientException.ErrorType.GENERAL,"Load balancer does not have available server for client: "+ clientName);
}
我们查询lb.chooseServer 实现的功能其实是从LoadBalancer对象中的到所有的服务, 然后根据规则从服务中获取一个匹配的服务(相关规则信息可以查看文章 Spring Cloud Ribbon负载均衡策略详解_学然后知不足!-CSDN博客)
List<Server> serverList = getLoadBalancer().getAllServers();
再看一下getAllServer接口,这个接口返回的是可用的和非可用的服务
/*** @return All known servers, both reachable and unreachable.*/public List<Server> getAllServers();
查看BaseLoadBalancer 如何实现的此方法发现, 服务取自List<Server>集合
protected volatile List<Server> allServerList = Collections.synchronizedList(new ArrayList<Server>());@Overridepublic List<Server> getAllServers() {return Collections.unmodifiableList(allServerList);}/*** Add a server to the 'allServer' list; does not verify uniqueness, so you* could give a server a greater share by adding it more than once.*/public void addServer(Server newServer) {if (newServer != null) {try {ArrayList<Server> newList = new ArrayList<Server>();newList.addAll(allServerList);newList.add(newServer);setServersList(newList);} catch (Exception e) {logger.error("LoadBalancer [{}]: Error adding newServer {}", name, newServer.getHost(), e);}}}/*** Add a list of servers to the 'allServer' list; does not verify* uniqueness, so you could give a server a greater share by adding it more* than once*/@Overridepublic void addServers(List<Server> newServers) {if (newServers != null && newServers.size() > 0) {try {ArrayList<Server> newList = new ArrayList<Server>();newList.addAll(allServerList);newList.addAll(newServers);setServersList(newList);} catch (Exception e) {logger.error("LoadBalancer [{}]: Exception while adding Servers", name, e);}}}
解决方案:
从上面的源码分析可知,请求处理时候会从会先从一个缓存集合List<Server> 中得到可用和不可用的服务,然后根据规则Rule 过滤获可访问的服务信息并返回Server,那么获取Server为空引起报错的可能场景有如下几个
1. Feign 启动后还没有从注册中心得到List<Server> 的时候lb#chooseServer获取结果为空
第一种可能:客户端没有开启从Eureka 中获取服务列表 ,所以需要检查配置是否错误配置成了 false
- eureka.client.register-with-eureka=true
- eureka.client.fetch-registry=true
第二种可能: 客户端已经开启了从注册中心获取服务列表, 获取列表是通过任务获取,此时任务还没执行List<Server>为空, 只需要等一会应用从注册中心检索服务后,问题会自行解决。
第三种可能: 检索后发现没有得到服务, 此时很有可能是你访问的服务应用没有正确注册到注册中心引起, 正确注册后Eureka注册中心可以正确看到发布的服务信息,发布失败一般也是上面的配置出错或其他配置问题
2. 根据Rule规则过滤从List<Server>中没有找到可用的Server
第一种可能: 因为getAllServers()返回的是可用和非可用, Rule规则会过滤到可用, 所以如果你的服务已经Down那么会找不到服务, 可以通过健康检查查看服务状态是否正常
第二种可能: 检查Fegin接口配置的服务名称和要访问的服务名称是否相同,注意字母顺序
3. 其他未知原因,只能通过断点调试了
上一篇:Spring Cloud Feign 示例笔记
Spring Cloud Feign启动Load balancer does not have available server for client分析相关推荐
- Load balancer does not have available server for client问题
Load balancer does not have available server for client问题,是因为消费端没有调用成功服务端.下面四步是必备的,可以检查一番. 1.写nacos发 ...
- nacos问题: Load balancer does not have available server for client:xxx解决办法
运行项目nacos项目 A服务通过fegin调用B服务时出现ava.lang.RuntimeException: com.netflix.client.ClientException: Load b ...
- 解决com.netflix.client.ClientException: Load balancer does not have available server for client:XXXXX(
解决com.netflix.client.ClientException: Load balancer does not have available server for client:XXXXX报 ...
- Load balancer does not have available server for client: userservice
Load balancer does not have available server for client: userservice(负载均衡器中没有userservice客户端服务) 注意:us ...
- springCloud出现:Load balancer does not have available server for client: SERVICE-XXX的错误解决方法
我现在的框架结构大致是:前端请求,通过zuul转发到user的接口提供模块,user接口提供模块调用user服务模块的业务功能(feign调用),user服务的业务功能需要调用base服务模块的一个业 ...
- Load balancer does not have available server for client
最近在研究spring-cloud,研究zuul组件时发生下列错误: Caused by: com.netflix.client.ClientException: Load balancer doe ...
- com.netflix.client.ClientException: Load balancer does not have available server for client: applica
nacos在2.x版本,Naco作为注册中心,Zuul作为网关进行整合 1 问题描述(Forwarding error. Load balancer does not have available s ...
- 服务间调用报错:Load balancer does not have available server for client
使用微服务架构后,不同团队使用同一个eureka和zuul,各团队之间注册到eureka的方式不一样,有的是指明instanceId为机器IP+端口,有的服务是指明instanceId为机器名称+端口 ...
- com.netflix.client.ClientException: Load balancer does not have available server for client: userser
错误消息: com.netflix.client.ClientException: Load balancer does not have available server for client: u ...
最新文章
- python之网络爬虫
- php 下载脱离服务器,php – 强制从外部服务器下载并重命名
- 改善ASP.NET2.0性能的五件法宝
- BitmapFactory。Options.inSampleSize用法
- android获取sd的大小,Android实现获取SD卡总容量,可用大小,机身内存总容量及可用大小的方法...
- FFmpeg分离音视频,音视频合并,添加多音轨,格式转换,裁切,剪切常用参数详解
- ShxViewer_SHX字体查看
- 用C#做了个小工具,取名【微图寻码】,可以自动检测微信接收的图片,把含有二维码的图片挑出来,并分类好
- 非致命战计算机病毒战属于,《信息化战争》章节
- 微软亚洲研究院院长换帅!复旦校友周礼栋博士升任新院长
- ALOS 12.5米DEM 数字高程模型数据免费下载介绍(20200617)
- 详解Spark Streaming的Graceful Shutdown
- 【数据库】MySQL 加锁处理分析
- matlab ekf算法讲解,EKF_AHRS(matlab实现)
- pytorch(9)-- 利用resnet18使cifa10数据集达到95%准确率
- TSC 打印机开发TSPL黑底白字的打印以及一些问题
- 第七篇章——垃圾回收概念及相关算法
- 三星移动硬盘不显示的解决
- TabLayout自定义指示器及样式
- Servlet知识点小结