目录
1. 简介
2. 原理
2.1. 动态代理 动态代理 动态代理
2.2. 懒加载负载均衡器的问题与解决
2.3. 主要类
3. 使用举例
4. 参数配置
1. 简介
Feign,一种声明式的web service client,可以很容易的创建http apis client。创建一个interface并添加注解,即可使用Feign。
简化http api调用的同时,支持多种http-client、协议、编解码方式。
Spring Cloud为Feign提供了"集成Ribbon和Eureka的负载均衡http client"。
2. 原理
2.1. 动态代理 动态代理 动态代理
2.2. 懒加载负载均衡器的问题与解决
feignclient第一次调用时,才会生成负载均衡器,从eureka server获取serverlist。因此会导致第一次调用较慢。可以通过配置解决该问题。
ribbon.eager-load.enabled:开启Ribbon的饥饿加载模式
ribbon.eager-load.clients:必须指定需要饥饿加载的客户端名称、服务名
2.3. 主要类
FeignClientsRegistrar#registerFeignClients | 扫描使用@FeignClient注解的class,注册到spring context中,即加入beanFactory#beanDefinitionMap。 |
FeignClientFactoryBean#getObject | 生成feign客户端代理,例如Feign.builder().target(……) |
DynamicServerListLoadBalancer | 构造方法中就会去eureka server获取serverlist |
feign.Feign | 作为工厂,生成接口代理 |
FeignInvocationHandler#invoke | feign客户端代理调用控制器 |
feign.SynchronousMethodHandler#invoke | feign客户端方法处理器,构建requestTemplate,http client发起请求,重试,解码返回值等。 |
LoadBalancerFeignClient#execute | |
AbstractLoadBalancerAwareClient#executeWithLoadBalancer RetryableFeignLoadBalancer#execute LoadBalancerCommand#selectServer | 负载均衡,分发请求 选择应用标识对应服务实例ip:port 执行http1.1请求 |
3. 使用举例
3.1. maven 依赖
org.springframework.cloud:spring-cloud-starter-openfeign:1.4.5.RELEASE
3.2. @EnableFeignClients
3.3. 定义一个interface
@FeignClient("服务提供方应用标识/服务ID")
不同环境应用标识不同,如assets-springcloud-dev、assets-springcloud-test、assets-springcloud-prod。
stores 表示一个client name,用于创建Ribbon负载均衡器;可使用qualifier属性规定client bean别名。
Ribbon client将尝试发现stores服务的物理地址,如果应用是Eureka client,将通过Eureka服务器发现服务地址。
3.4. 使用方式
服务提供方暴露api包 | ![]() |
服务提供方实现api | ![]() |
服务调用方实现api且加@FeignClient | ![]() |
也可以在暴露的api使用@FeignClient。
4. 参数配置
优先选择 在配置文件中添加配置项,支持通用配置和特定client配置。
特定client的配置
feign:
client:
config:
feignName:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
errorDecoder: com.example.SimpleErrorDecoder
retryer: com.example.SimpleRetryer
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
decode404: false
通用配置
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
参考
https://github.com/OpenFeign/feign