SpringCloud總結:Feign&Ribbon

基於SpringCloud的分佈式微服務系統中各個服務之間的調用時通過http協議來完成的,提到http協議,最先想到的就是ip+端口+資源路徑的調用方式,但是這種調用方式並不符合微服務架構下的服務治理的要求,微服務架構中的服務治理是以註冊中心爲中心的,這種調用方式明顯脫離了註冊中心,此時Ribbon和Feigin就誕生了。

首先說Ribbon,Ribbon的主要作用有兩個,一個是將http調用與eureka相關聯,通過服務名稱獲取服務對應的調用地址,二是提供不同的負載均衡策略,這一點與dubbo中的ClusterInvoker功能類似,但此時仍然是基於RestTemplate+url的方式來調用服務,在使用上不僅麻煩而且不利於管理,這時就誕生了Feign,Feign說白了就是對RestTemplate的一個封裝,將對http協議的url的調用轉換成對java 接口的調用,這更加符合面向對象的設計原則,此外,feign還提供了一些額外的功能,比如超時時間的設置、數據壓縮供等,可以說,Ribbon和Feign是相互完善和補充的關係。

對於Ribbon和Feign的使用這裏就不做介紹了,網上有很多的資料,同時也可以參考官方網站,下面主要來看一下Ribbon和Feigin的源碼,看看具體的實現原理,這樣可以做到知己知彼,使用的時候更加的得心應手。

因爲Ribbon是基礎,所以首先來看看Ribbon的源碼。

按照SpringBoot的風格首先會有一個RibbonAutoConfiguration,到對應的依賴包中能夠找到這個類
在這裏插入圖片描述
在這裏插入圖片描述
找到了入口,下面到這個類中看看ribbon的負載均衡和麪向服務名稱的調用時如何做到的。

在這裏插入圖片描述
進來一首,第一眼看見的是EurekaClientAutoConfiguration,這也進一步驗證了Ribbon的面向服務名稱的調用的底層是基於Eureka註冊中心完成的,再往下看,我們會看到一個與LoadBalance相關的Bean
在這裏插入圖片描述
這個類對象時Ribbon的一個核心,後面會看到,另外在RibbonAutoConfiguration的類定義中有一個與LoadBalance相關的AutoConfiguration
在這裏插入圖片描述
這個類是一個初始化類,最主要的作用是初始了一個用於實現LoadBalance的攔截器
在這裏插入圖片描述
這裏的LoadBalancerInterceptor是作用就是對客戶端在RestTemplate的調用進行攔截,
在這裏插入圖片描述
從上面的截圖中我們可以很清楚的看到,把對RestTemplate的調用轉交給了LoadBalanceClient,這個LoadBalanderClient就是在RibbonAutoConfiguration中初始化的,具體的實例類型是RibbonLoadBalancerClient,怎麼樣,是不是很spring boot style。下面我們在深入這個Client中看看它到底做了什麼。

在這裏插入圖片描述
這裏面主要做了兩件事,第一件事是根據服務名稱得到一個LoadBalancer實例,爲什麼呢,因爲在使用ribbon的時候我們可以爲每個服務配置不同的負載均衡策略,拿到的ILoadBalancer實例中就包含了我們配置的負載均衡規則,然後再調用getServer()得到一個具體的server實例,這裏就不深入看了,主要的邏輯就是從註冊中心eureka的本地緩存總獲取到所有的服務提供者信息,然後根據用戶自定義的負載均衡策略來選擇一個provider,也就是上圖中的Server,然後再對這個Server發起http調用。

到這裏,ribbon的邏輯也就基本清楚了,下面在看看Feign,按照同樣的思路,我們先來找對應的@EnableFeignClient註解
在這裏插入圖片描述
可以看到在這個類中有一個Rigistrar,按照spring boot慣例,這個類應該很重要,點進來一看,不禁眼前一黑
在這裏插入圖片描述
ImportBeanDefinitionRegistrar這個接口是Spring IoC容器提供的一個向容器中註冊BeanDefinition的鉤子方法,由於在使用@EnableFeiginClient是我們需要指定一個包路徑,所以,我們很容易想到,這個類會對包下的接口進行掃描,並將對應的BeanDefinition註冊到IoC容器中,按照這個思路,我們找一找相關的代碼。
在這裏插入圖片描述
在這裏插入圖片描述
看吧,將接口的BeanDefinition和一個叫做FeignClientFactoryBean的類關聯了起來,熟悉dubbo的同學可能會知道,dubbo中的ReferenceBean就實現了FactoryBean接口,作用是當spring進行依賴注入的時候調用它的getObject()方法來獲取實例對象,所以這裏也是一樣,當我們注入一個FeiginClient的接口時,spring就會調用FeiginClientFactoryBean的getObject方法來獲取對象實例,那麼現在一切都明朗了,我們看看這個FactoryBean給IoC容器返回了什麼東西。

在這裏插入圖片描述
經過了層層調用,最終來到了一個叫做Taget的東西里,這個Target是什麼我們並不用太在意,直接點進去
在這裏插入圖片描述
看到了一個invocationHandlerFactory,是不是瀰漫了一種熟悉的氣息,如果沒有,那幾再點進去看
在這裏插入圖片描述
看到沒有,JDK動態代理!!到這裏其實就不用在看下去了,Feigin的基本原理就是爲接口創建動態代理,將調用轉到Ribbon。

另外一條線是AutoConfiguration,按照spring boot的邏輯一定還有一個FeiginAutoConfiguration
在這裏插入圖片描述
在這裏插入圖片描述
最終,我們找到了這個FeiginAutoConfiguration,這個類中其實沒有和具體的處理邏輯相關的代碼,知識初始化了一些與Http請求相關的Bean,以及前文中提到的Target.
在這裏插入圖片描述
到此,Feigin和Ribbon的基本原理就清楚了,至於細節,等需要的時候在看吧。

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