Feign源碼解析

首先我要說的是springcloud沒有rpc,這就涉及rpc和微服務的區別。springcloud的模塊通信工具feign跟httpclient和okhttp是一樣的東西,都是對http請求封裝的工具,其實feign可以選擇httpclient或者okhttp作爲底層實現(修改配置即可)。

一、Feign的作用:

       ①封裝http請求,使開發人員對發送請求的過程無感知,給人一種僞rpc感覺(這也許是feign這個名字的由來吧,僞裝~)。

       ②feign整合ribbon和hystrix,結合eureka起到負載均衡和熔斷器、降級作用。

二、源碼及流程介紹:

我們從@EnableFeignClients這個註解開始追蹤

我們發現有個@Import註解,引用FeignClientRegistrar類,跟進去看看

2個方法:①redisterDefalterConfiguration是加載配置,②registerFeignClients掃描你填寫的basepackage下的所有@FeignClient註解的接口。第一個方法沒啥好說的,我們主要看看第二個方法。

掃描完之後,把所有包含@FeignClient註解的接口都註冊到spring的beanfactory去,讓開發人員可以@Autowired來調用。這一部分代碼我就不貼了,我們只是追求feign的原理流程,太涉及spring源碼部分,我不做解釋。

========================= 以上是feign註冊流程,下面介紹拼裝request請求部分 =======================

首先,這裏看ReflectiveFeign類,這個類用的是jdk的動態代理

用到代理模式肯定是在發送feign請求之前做一些操作,繼續看看請求之前做了哪些操作。

代理攔截每一個FeignClient請求,進入SynchronousMethodHandler的invoke方法,該方法調用executeAndDecode方法,這個方法看名字就知道是創建請求的方法,進去看看。

在該方法發送請求並且解碼,解碼分爲decoder和errordecoder,這兩個都是可以重寫。這裏你可能會問解碼器,那編碼器呢,feign默認用springEncoder,同樣是可以替換成Gson等。

======================= 以上是feign的調用流程,以下是feign使用過程的坑 =================

①feign默認使用線程池,大小是10,這會使得模塊間調用丟失header,可以用InheritableThreadLocal解決

②在C版本後默認關閉hystrix,要使用要手動開啓

③不要妄想改變feign的邏輯,因爲代理模式被寫成final,無法修改

④無法在解碼器裏拋自定義異常,因爲feign最終會統一攔截,拋出一個feignexception。你想把統一攔截也改了,那麼你可以看看第③坑。

⑤feign的重試機制,默認是1,也就是說超時時間會變成2倍。這個可以通過配置修改。

⑥feign集成的負載均衡器ribbon,feign有個緩存,ribbon也有個緩存,會造成上線延遲,可以修改配置實現。

⑦feign對格式化時間處理有問題

⑧如果你是使用生產者提供api,並且實現該接口,@requestparam可以不用在實現類寫,但是@requestbody不寫無法映射

以上的坑都是我在實際工作中一個一個爬過來的,希望對大家有幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章