Feign基本组成
作为一个远程调用框架,主要由以下部分组成(参考FeignClientProperties配置类)
- Client:http客户端,可以是ApacheHttpClient、OkHttpClient、jdk原生
- RequestInterceptor:请求拦截器
- Retryer:重试,默认不重试,Retryer.NEVER_RETRY
- Encoder:编码
- Decoder:解码
- ErrorDecoder:异常捕获
- LoggerLevel:日志级别
- Contract:定义哪些注释和值在接口上有效。提取注解上有用信息,封装成MethodMetadata元数据的。比如@QueryMap、@HeaderMap、@Body等注解的解析
- Decode404:是否对404返回码做特殊处理
# 简单配置示例:
feign:
client:
config:
# 针对所有的服务
default:
connectTimeout: 2000
readTimeout: 2000
loggerLevel: BASIC
retryer: feign.Retryer.Default
# 针对某个服务(服务名:use-service)
use-service:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: BASIC
retryer: feign.Retryer.Default
注册BeanDefinition到Spring容器中
class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar
FeignClientsRegistrar 注册的是FactoryBean工厂类
整个注册过程如图
创建feign代理对象
FeignClientFactoryBean
- FeignContext是全局配置类,他持有所有的feign客户端的configuration配置和AnnotationConfigApplicationContext类,用于获取自动自动装配类的一些配置信息。
- Feign.Builder 使用了建造者模式,用于创建最后的Feign对象
- Client:http客户端
- Targeter 有两种实现:一个是DefaultTargeter,直接调用 Feign.Builder; 还一个是 HystrixTargeter,调用 HystrixFeign.Builder,开启熔断。在FeignAutoConfiguration配置生效HystrixTargeter
HystrixFeign.Builder
Feign.Builder
ReflectiveFeign
Feign是个抽象类,唯一的继承是ReflectiveFeign,也是真正的创建动态代理的地方
SynchronousMethodHandler
将feignClient中每个方法解析成MethodHandler对象