Spring Cloud Eureka+FeignClient+Ribbon报错:负载均衡无可用服务排查
首先看你的错误日志,核心问题是Ribbon负载均衡器找不到discount-service的可用实例,这大概率是因为服务没成功注册到Eureka,或者PricingService没拉取到服务列表。咱们一步步排查:
1. 优先检查DiscountService的Eureka注册配置
我注意到你的DiscountService配置文件里,eureka.client.serviceUrl.defaultZone这一行等号后面多了个空格:
eureka.client.serviceUrl.defaultZone= http://localhost:8761/eureka/
这个空格会让配置值被解析成带前导空格的URL,Eureka客户端根本连不上注册中心,自然没法把服务注册进去。
你需要把这行改成:
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
(等号后面直接跟URL,不要空格)
改完后重启DiscountService,然后访问Eureka控制台http://localhost:8761,确认服务列表里出现了discount-service。
2. 验证PricingService的服务拉取情况
如果DiscountService已经成功注册,那再确认PricingService是否能从Eureka获取到服务列表:
- 你已经设置了
eureka.client.fetchRegistry=true,这个配置是对的,确保PricingService会拉取注册中心的服务列表。 - 可以临时加个接口验证:
启动PricingService后访问@RestController public class ServiceCheckController { @Autowired private DiscoveryClient discoveryClient; @GetMapping("/registered-services") public List<String> getRegisteredServices() { return discoveryClient.getServices(); } }http://localhost:8080/registered-services,如果返回的列表里有discount-service,说明服务拉取正常;如果没有,检查PricingService的Eureka配置是否有同样的空格问题,或者依赖是否缺失。
3. 确认依赖版本匹配
Spring Boot 2.1.4.RELEASE对应的Spring Cloud版本是Greenwich.SR1,你需要确保项目的依赖管理里引入了正确的Spring Cloud版本,否则Feign、Eureka客户端可能会出现兼容性问题:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
同时确保PricingService包含以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
4. 检查FeignClient的路径配置
你的FeignClient接口配置是对的:@FeignClient("discount-service")和@RequestMapping(method = RequestMethod.GET, value = "/discount/{product}"),和DiscountController的路径完全匹配,这部分没问题。
按照上面的步骤排查,最可能的问题就是第一步里的配置空格,修正后应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Niraj Sonawane

