Feign原始碼解析

2021-08-28 16:59:15 字數 2189 閱讀 3554

首先我要說的是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在d版本後預設關閉hystrix,要想傳遞請求頭,如果不用hystrix的話在feign***裡塞一遍就好;如果要用hystrix,那麼改用訊號量。

②在c版本後預設關閉hystrix,要使用要手動開啟

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

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

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

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

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

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

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

Feign原始碼解析 執行過程

不了解factorybean介面的,可以看如何使用spring的factorybean介面 作為乙個實現了factorybean的工廠類,那麼每次在spring context 建立實體類的時候會呼叫它的getobject 方法。class feignclientfactorybean implem...

feign原始碼解讀

對於feign的介面請求失敗的重試配置可通過如下自定義配置檔案實現 一般不建議配置 configuration public class feignconfig 當然,也可使用預設的retry配置檔案,下方是feign.retryer的原始碼 類的全路徑是feign.retryer public d...

Feign原始碼分析

feign主要圍繞註解 feignclient和 autowired來分析就好了,feignclient是註解在乙個介面上面的,這個註解是乙個標誌,相應的後置處理器把有該標誌的類加入到bean defenition中。autowired是注入屬性的,feign採用的是factorybean的方式進行...