今天在使用SpringCloud-Feign编写consumer的时候遇到的一个坑
具体配置如下:
- 依赖
<!--feign相关依赖包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- yml配置
server:
port: 9002
#eureka相关配置
eureka:
client:
service-url:
#指定eureka地址
defaultZone: http://localhost:9003/eureka/
#需要向eureka服务注册自己
register-with-eureka: false
#不需要获取服务的注册列表
fetch-registry: true
- 接口编写
@Component
@FeignClient(name = "USERAPI")
public interface UserService {
项目启动正常,但是在访问consumer调用接口时出现了如下问题:
com.netflix.client.ClientException: Load balancer does not have available server for client: USERAPI
at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
网上说这是feign的负载均衡问题,需要对Ribbon进行配置,试了以后发现没有用,而且我此处只是一个简单的Feign的应用,并没有使用到Ribbon,经过测试,最后发现问题出现在@FeignClient注解的值上。
在配置provider向eureka注册服务时,我们都知道eureka中的Application名称配置有两种配置方式,方式如下:
#eureka相关配置
eureka:
instance:
# 注册到eureka中的微服务的名字
appname: userapi
spring:
application:
# 配置SpringWeb application 的名字,
# 当euraka.instance.appname 未设置时,使用此值注册到eureka server
name: api
此处配置了Spring的项目名称和eureka中的微服务名称
按照正常逻辑,feign在eureka中寻找项目时应该是从Application名称中寻找,
但实际不是,Feign找的是我们配置的Spring项目的名称,
如果provide中不去配置spring.application.nameFeign依然找不到我们需要的项目,
所以此处我们应当将@FeignClient注解中的值改为spring.application.name定义的值,而不是eureka的appname名称。
修改如下:
@Component
@FeignClient(name = "API")
public interface UserService {
修改之后,运行就没有问题了,至于为什么要配置Spring的application名称而不是eureka中的注册名称,还有待研究