Feign源碼解析


1. Feign源碼解析

1.1. 啟動過程

1.1.1. 流程圖

1.1.2. 解釋說明

  1. Feign解析過程依賴Spring的初始化,它通過實現ImportBeanDefinitionRegistrar接口,來解析注解並進行加載
  2. 自動配置過程和很多框架一樣,通過xxxAutoConfiguration進行初始化配置,這里我使用了Hystrix,所以還會額外初始化Hystrix並進行動態代理包裝
  3. 同時它實現了一個FactoryBean,對Feign進行包裝,之后我們使用的xxxFeign都是包裝過的HardCodedTarget,如下圖

1.2. 調用過程

  1. String tom = portFeign.feignTest("Tom");進入到ReflectiveFeign類的代理方法
  2. 之后根據調用方法全稱找到對應處理器SynchronousMethodHandler
  3. 之后會經過攔截器,該攔截器默認是null的,可以自定義配置
  4. 再進入請求模板RequestTemplateRequest.create(this.method, this.url(), this.headers(), this.requestBody());
  5. 真正進行請求的,是LoadBalancerFeignClient負載均衡客戶端,它來負責解析服務和發送請求

1.2.1. 攔截器

  1. 加載位置

  2. 至於攔截器由誰加載,先看FeignClientFactoryBean類,它集成了FactoryBean,所以他實現了getObject方法



1.2.2. FeignClientFactoryBean初始化過程

  1. 我們知道,客戶端需要加注解@EnableFeignClients,內容如下
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
  1. 它會加載FeignClientsRegistrar類的實例化,而FeignClientsRegistrar實現了接口ImportBeanDefinitionRegistrar,因此,一旦spring一旦實例化它,后續會調用registerBeanDefinitions方法

1.3. 啟動過程總流程圖

https://www.processon.com/view/link/5cb5790ae4b0841b843185a6

Github地址:https://github.com/tzxylao/learn-demo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM