Feign原始碼分析

2021-10-22 20:03:47 字數 3440 閱讀 6772

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之後,有個注入屬性方法,裡面有一處後置處理器方法instantiationawarebeanpostprocessorpostprocesspropertyvalues,改方法的目的是在把屬性值應用到真正的字段前做一些動作(我的另外一篇專門關於後置處理器的文章)。

最後兜兜轉轉會到這個方法裡面,此時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...