项目场景:

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分析相关推荐

  1. Load balancer does not have available server for client问题

    Load balancer does not have available server for client问题,是因为消费端没有调用成功服务端.下面四步是必备的,可以检查一番. 1.写nacos发 ...

  2. nacos问题: Load balancer does not have available server for client:xxx解决办法

    运行项目nacos项目  A服务通过fegin调用B服务时出现ava.lang.RuntimeException: com.netflix.client.ClientException: Load b ...

  3. 解决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报 ...

  4. Load balancer does not have available server for client: userservice

    Load balancer does not have available server for client: userservice(负载均衡器中没有userservice客户端服务) 注意:us ...

  5. springCloud出现:Load balancer does not have available server for client: SERVICE-XXX的错误解决方法

    我现在的框架结构大致是:前端请求,通过zuul转发到user的接口提供模块,user接口提供模块调用user服务模块的业务功能(feign调用),user服务的业务功能需要调用base服务模块的一个业 ...

  6. Load balancer does not have available server for client

    最近在研究spring-cloud,研究zuul组件时发生下列错误:  Caused by: com.netflix.client.ClientException: Load balancer doe ...

  7. 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 ...

  8. 服务间调用报错:Load balancer does not have available server for client

    使用微服务架构后,不同团队使用同一个eureka和zuul,各团队之间注册到eureka的方式不一样,有的是指明instanceId为机器IP+端口,有的服务是指明instanceId为机器名称+端口 ...

  9. 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 ...

最新文章

  1. python之网络爬虫
  2. php 下载脱离服务器,php – 强制从外部服务器下载并重命名
  3. 改善ASP.NET2.0性能的五件法宝
  4. BitmapFactory。Options.inSampleSize用法
  5. android获取sd的大小,Android实现获取SD卡总容量,可用大小,机身内存总容量及可用大小的方法...
  6. FFmpeg分离音视频,音视频合并,添加多音轨,格式转换,裁切,剪切常用参数详解
  7. ShxViewer_SHX字体查看
  8. 用C#做了个小工具,取名【微图寻码】,可以自动检测微信接收的图片,把含有二维码的图片挑出来,并分类好
  9. 非致命战计算机病毒战属于,《信息化战争》章节
  10. 微软亚洲研究院院长换帅!复旦校友周礼栋博士升任新院长
  11. ALOS 12.5米DEM 数字高程模型数据免费下载介绍(20200617)
  12. 详解Spark Streaming的Graceful Shutdown
  13. 【数据库】MySQL 加锁处理分析
  14. matlab ekf算法讲解,EKF_AHRS(matlab实现)
  15. pytorch(9)-- 利用resnet18使cifa10数据集达到95%准确率
  16. TSC 打印机开发TSPL黑底白字的打印以及一些问题
  17. 第七篇章——垃圾回收概念及相关算法
  18. 三星移动硬盘不显示的解决
  19. TabLayout自定义指示器及样式
  20. Servlet知识点小结

热门文章

  1. 图像处理基本算法--仿射变换和透视变换
  2. tp实现文件下载,以及下载图片,报错无法打开图片
  3. 冰冰学习笔记:进程概念
  4. 交通标志的检测、分类的方法整理(自己的方法)
  5. 2020湖南计算机考试能不能用红底,2021年湖南高考使用全国几卷 全国一卷还是二卷?...
  6. xjar 对Spring-Boot JAR 包加密运行工具
  7. Loki日志系统安装配置
  8. shell 中 if 和 else 用法详解
  9. ArcGIS API for JavaScript实现加载必应地图
  10. WBS计划实际存储(COSP,COSS)