Load balancer does not contain an instance for the service service-B [503] during [POST] 问题解决
场景:
service-A服务通过 openFeign 远程调用 service-B服务的test()方法,结果报错
Load balancer does not contain an instance for the service service-B feign.FeignException$ServiceUnavailable: [503] during [POST] to [http://service-B/test]
原因:
报错信息的意思是找不到服务 service-B,feign的远程服务没有调通
排查方法:
1 看一下loadbalancer的依赖是否加了
从 Spring Cloud 2020.0 开始使用LoadBanlancer作为负载均衡,放弃了ribbon
所以在使用时pom依赖要加上 loadBanlancer的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> <version>3.1.6</version> </dependency>
2 看一下服务service-B启动了没有
没启动当然调不到了3 看一下注册中心是否有服务service-B
看一下配置的注册中心是否正确
4 A服务调用B服务,两个服务的namespace和group是否一致
namespace和group的作用就是做环境隔离,所以两个服务在不同的namespace和group是调用不通的
5 对比一下配置的服务名是否和feign中指定的名称相同
服务名称是否写对了,注意大小写都要对应
看一下 application.yml 中的配置
spring:
application:
name: service-B
service-A中指定的远程调用服务名
@FeignClient("service-B")
如果在配置中指定了context-path
application.yml 中的配置
server:
servlet:
context-path: /test
service-A中指定的远程调用服务名,需要加path参数
//注意这里的path前面需要带 / @FeignClient(value = "test", path = "/test")
6 检查一下,如果使用了配置中心,还需要看看配置中心的配置是否正确
bootstrap.yml 中的配置会覆盖 application.yml 存在的配置
7 最后看一下是否重写了 LoadBalancer
重写loadBalancer需要实现接口 ReactorServiceInstanceLoadBalancer
这个如果重写后导致服务找不到,就需要看看重写的规则了
先屏蔽掉重写的laodbalancer看看是否是重写导致的影响。