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看看是否是重写导致的影响。

 
posted on 2024-07-18 17:24  欢跳的心  阅读(7)  评论(0编辑  收藏  举报