OpenFeign集成Hystrix、Ribbon进行测试时抛出503找不到服务实例问题求助
问题根因
- 版本适配问题:你使用的Spring Cloud 2020.0.x(代号Ilford)版本已经默认移除了Ribbon的内置支持,默认负载均衡组件替换为Spring Cloud LoadBalancer。你虽然引入了feign-ribbon测试依赖,但未显式启用Ribbon作为负载均衡实现,因此你配置的
RibbonClient和StaticServerList完全没有生效,OpenFeign使用默认的Spring Cloud LoadBalancer找不到服务实例,抛出503异常。 - 测试类配置错误:你的测试类名为
LoadBalancedHelloWorldFeignClientTest,但@SpringBootTest注解中引用的配置类是HelloWorldFeignClientTest.FeignConfig.class,类名不匹配导致配置类没有被Spring容器加载,也是配置不生效的直接原因之一。
修复方案
方案1:继续使用Ribbon(快速适配现有代码)
- 首先修正测试类注解的配置类引用,改为当前测试类的内部配置类,同时添加启用Ribbon的配置:
@SpringBootTest(classes = {LoadBalancedHelloWorldFeignClientTest.FeignConfig.class}, properties = { "eureka.client.enabled=false", "feign.circuitbreaker.enabled=true", // 显式启用Ribbon作为负载均衡实现,禁用默认的Spring Cloud LoadBalancer "spring.cloud.loadbalancer.ribbon.enabled=true" }, webEnvironment = WebEnvironment.RANDOM_PORT)
- 确认
@RibbonClient注解的name值和你的FeignClient的服务名simple-helloworld-api完全一致,你当前的配置是匹配的,修正后即可生效。
方案2:替换为官方推荐的Spring Cloud LoadBalancer(长期维护方案)
因为Ribbon已经进入停止维护阶段,更推荐你改用官方默认的负载均衡组件,修改步骤如下:
- 移除测试依赖中的
feign-ribbon依赖,删除@RibbonClient注解和对应的RibbonConfig配置类。 - 新增Spring Cloud LoadBalancer的静态服务实例配置,直接在测试配置属性中添加wiremock地址即可,如果是动态端口可以自定义
ServiceInstanceListSupplier的Bean来注册动态的wiremock实例:
@SpringBootTest(classes = {LoadBalancedHelloWorldFeignClientTest.FeignConfig.class}, properties = { "eureka.client.enabled=false", "feign.circuitbreaker.enabled=true", // 配置simple-helloworld-api服务的静态实例地址指向wiremock "spring.cloud.discovery.client.simple.instances.simple-helloworld-api[0].host=localhost" }, webEnvironment = WebEnvironment.RANDOM_PORT)
- 新增
spring-cloud-starter-loadbalancer依赖到你的构建文件中。
其他注意事项
你测试代码中的第二个用例的stub匹配规则使用了urlPathEqualTo,但路径写的是正则表达式/api/v1/greet/.*,应该改为urlPathMatching才能正常匹配请求,否则stub会不生效导致fallback逻辑无法触发。
内容的提问来源于stack exchange,提问作者thefrugaldev
相关产品推荐
相关产品推荐

