一、圖解

二、說明
這里將重點(diǎn)分為5點(diǎn),具體如下:
1. 注冊FeignClient工廠Bean
為注釋了FeignClient的接口注冊一個FeignClientFactoryBean,之后便可以被注入到其他的Bean中;
2. 生產(chǎn)動態(tài)代理對象
FeignClientFactoryBean利用Feign.builder生產(chǎn)出動態(tài)代理對象;
3. Eureka客戶端獲取實(shí)例
Eureka客戶端會定期從Eureka服務(wù)端拉取最新的服務(wù)列表,Eureka客戶端是由Spring注入;
4. Eureka服務(wù)端維護(hù)列表
Eureka服務(wù)端的實(shí)例列表是由一個二級緩存ResponseCache和一個注冊表ConcurrentHashMap構(gòu)成,通過各種由Resource類映射的Rest接口維護(hù),Eureka服務(wù)端是由Spring注入并在容器的生命周期方法中初始化和啟動;
5. 調(diào)用動態(tài)代理對象接口
5.1 提交Feign請求
動態(tài)代理對象調(diào)用接口方法,方法被封裝成一個Feign請求提交給Feign客戶端,Spring整合了Feign和 Ribbon的代碼后,LoadBalancerFeignClient作為一個Feign客戶端接受請求。
5.2 提交負(fù)載均衡請求
LoadBalancerFeignClient客戶端將請求封裝為Ribbon的負(fù)載均衡請求并提交給負(fù)載均衡客戶端,Spring 整合了Ribbon 和 Feign的代碼,F(xiàn)eignLoadBalancer 作為一個負(fù)載均衡客戶端接受請求
5.3 負(fù)載均衡器選擇服務(wù)實(shí)例
負(fù)載均衡客戶端使用負(fù)載均衡器ILoadBalancer選擇服務(wù)實(shí)例,整合了Eureka的代碼后,DiscoveryEnabledNIWSServerList為負(fù)載均衡器提供服務(wù)實(shí)例列表,DiscoveryEnabledNIWSServerList 持有Eureka客戶端實(shí)例
5.4 執(zhí)行Feign請求
延續(xù)第5點(diǎn),負(fù)載均衡客戶端選出服務(wù)實(shí)例后,將請求封裝為Feign提交給Feign客戶端,這里的Feign客戶端不再是LoadBalancerFeignClient,而是實(shí)際執(zhí)行遠(yuǎn)程訪問的feign客戶端,如Client.Default/ApacheHttpClient/OkHttpClient
5.5 獲取Feign請求結(jié)果并解碼
feign客戶端執(zhí)行請求后返回feign響應(yīng),feign響應(yīng)最終通過解碼,將請求結(jié)果返回給調(diào)用方法,整個流程結(jié)束