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