1. Feign源码解析
1.1. 启动过程
1.1.1. 流程图
1.1.2. 解释说明
- Feign解析过程依赖Spring的初始化,它通过实现
ImportBeanDefinitionRegistrar
接口,来解析注解并进行加载 - 自动配置过程和很多框架一样,通过xxxAutoConfiguration进行初始化配置,这里我使用了Hystrix,所以还会额外初始化Hystrix并进行动态代理包装
- 同时它实现了一个
FactoryBean
,对Feign进行包装,之后我们使用的xxxFeign都是包装过的HardCodedTarget
,如下图
1.2. 调用过程
String tom = portFeign.feignTest("Tom");
进入到ReflectiveFeign
类的代理方法- 之后根据调用方法全称找到对应处理器
SynchronousMethodHandler
- 之后会经过拦截器,该拦截器默认是null的,可以自定义配置
- 再进入请求模板
RequestTemplate
的Request.create(this.method, this.url(), this.headers(), this.requestBody());
- 真正进行请求的,是
LoadBalancerFeignClient
负载均衡客户端,它来负责解析服务和发送请求
1.2.1. 拦截器
加载位置
至于拦截器由谁加载,先看
FeignClientFactoryBean
类,它集成了FactoryBean
,所以他实现了getObject
方法
1.2.2. FeignClientFactoryBean
初始化过程
- 我们知道,客户端需要加注解
@EnableFeignClients
,内容如下
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
- 它会加载
FeignClientsRegistrar
类的实例化,而FeignClientsRegistrar
实现了接口ImportBeanDefinitionRegistrar
,因此,一旦spring一旦实例化它,后续会调用registerBeanDefinitions
方法
1.3. 启动过程总流程图
https://www.processon.com/view/link/5cb5790ae4b0841b843185a6
Github地址:https://github.com/tzxylao/learn-demo