feign主要圍繞註解@feignclient和@autowired來分析就好了,@feignclient是註解在乙個介面上面的,這個註解是乙個標誌,相應的後置處理器把有該標誌的類加入到bean defenition中。@autowired是注入屬性的,feign採用的是factorybean
的方式進行建立的。下面開始詳細分析
在使用feign的時候都要的配置類上加上enablefeignclients
,這個註解上面有個import註解,這個很重要
@import
(feignclientsregistrar.
class
)public @inte***ce
enablefeignclients
registrar
是乙個載入bean定義的常見形式,他給開發者暴露出registry,讓開發者自由的載入bean熟悉spring的都知道,這些類的載入都是靠configclasspostprocessor
來完成的,我簡略的梳理一下流程
invokebeanfactorypostprocessors
(beanfactory)
;invokebeandefinitionregistrypostprocessors
(currentregistryprocessors,
registry)
;loadbeandefinitionsforconfigurationclass
(configclass,
trackedconditionevaluator)
loadbeandefinitionsfromregistrars
(configclass.
getimportbeandefinitionregistrars()
);registerbeandefinitions()
; ```
registerbeandefinitions
方法就是開發者可以自由進行註冊bean定義的方法,spring會給你registry作為引數,feign利用的是
annotationtypefilter annotationtypefilter =
newannotationtypefilter
(feignclient.
class
);
就是利用類上是否有相應的註解,如果有就加入進來。這些其實度不是feign的東西,都是spring的
feign利用的是@autowired來注入的。在呼叫建立bean之後,有個注入屬性方法,裡面有一處後置處理器方法instantiationawarebeanpostprocessor
的postprocesspropertyvalues
,改方法的目的是在把屬性值應用到真正的字段前做一些動作(我的另外一篇專門關於後置處理器的文章)。
最後兜兜轉轉會到這個方法裡面,此時beanname就是註解autowired的先關屬性,requiredtype就是autowired標註的那個類,這相當於又走回getbean()
這個老朋友身上
public object resolvecandidate
(string beanname, class<
?> requiredtype, beanfactory beanfactory)
throws bean***ception
在getbean
的時候我驚訝的發現,改bean的class竟然是feignclientfactorybean
,原來在feignclientsregistar
中,建立beandefinition的過程中被hardcode的指定了class
首先他繼承factorybean
,他的核心方法是getobject()
。在方法中主要做了構建loaderbalancerfeignclient,當然如何和hystrix
集合還會構建hystrixtarget,然後根據是否有 fallbackfactory,進行一系列的構建。
loaderbalancerfeignclient
的核心內容我貼出來了,他和ribbon的ribbonloadbalancerclient其實做的事情是一樣的,主要就是找出真正的loadbalancer,在這裡就是feignloadbalancer
(ribbon的是zoneawareloadbalancer)
uri asuri = uri.
create
(request.
url())
;string clientname = asuri.
gethost()
;uri uriwithouthost =
cleanurl
(request.
url(
), clientname)
;feignloadbalancer.ribbonrequest ribbonrequest =
newfeignloadbalancer.ribbonrequest
(this
.delegate, request, uriwithouthost)
;iclientconfig requestconfig =
getclientconfig
(options, clientname)
;return
lbclient
(clientname)
.executewithloadbalancer
(ribbonrequest,
requestconfig)
.toresponse()
;
下面的基本和ribbon相同,就是解析正服務url,進行http呼叫
ribbon更像是對resttempalte的擴充套件,而feign更符合物件導向的思想,但是最終他們實現的細節確實相同的,都是構建出相應client,然後找到隊形的loadbalancer,然後進行解析,執行http請求
Feign原始碼分析
前言 通過對feign的使用,發現 enablefeignclients和 feignclient兩個註解就實現了feign的功能,那就從 enablefeignclients註解開始分析feign的原始碼 1 enablefeignclients註解 retention retentionpoli...
Feign原始碼解析
首先我要說的是springcloud沒有rpc,這就涉及rpc和微服務的區別。springcloud的模組通訊工具feign跟httpclient和okhttp是一樣的東西,都是對http請求封裝的工具,其實feign可以選擇httpclient或者okhttp作為底層實現 修改配置即可 一 fei...
feign原始碼解讀
對於feign的介面請求失敗的重試配置可通過如下自定義配置檔案實現 一般不建議配置 configuration public class feignconfig 當然,也可使用預設的retry配置檔案,下方是feign.retryer的原始碼 類的全路徑是feign.retryer public d...