[學習微服務-第7天] ServiceComb+SpringCloud Ribbon源碼解讀

在上一篇 《ServiceComb + SpringCloud Ribbon使用篇》中介紹了負載均衡的概念和ServiceComb協同SpringCloud Ribbon的使用, 本篇將從源碼角度介紹ServiceComb是如何實現與SpringCloud Ribbon協同工做的。

 

一. ServiceComb對接 Spring Cloud Ribbon思路git

在Ribbon的wiki介紹頁(https://github.com/Netflix/ribbon/wiki/Working-with-load-balancers)能夠發現這樣的描述:github

ServerList - this can be static or dynamic. If it is dynamic (as used by DynamicServerListLoadBalancer), a background thread will refresh and filter the list at certain intervalspring

這段介紹了ServerList接口,該接口既能夠是靜態獲取服務實例列表也能夠是動態獲取的。apache

若是是動態獲取服務列表(被DynamicServerListLoadBalancer使用),會有一個後臺線程在特定得時間間隔負責刷新和過濾服務列表。緩存

 

也就是說,咱們只要實現了ServerList接口,加上相應的配置讓Ribbon獲取到,就能向Ribbon提供ServiceComb本身的服務發現邏輯。微信

 

以下圖↓↓↓負載均衡

ServiceComb 在以下的org.apache.servicecomb:spring-boot-starter-discovery項目中實現了ServerList接口和相應的配置。spring-boot

<dependency>
   <groupId>org.apache.servicecomb</groupId>
   <artifactId>spring-boot-starter-discovery</artifactId>
   <version>1.1.0</version></dependency>

 

二. 源碼分析微服務

項目結構源碼分析

以下圖,紅色方框內爲接入SpringCloud Ribbon組件的相關類。

 

下面咱們分別來看看這幾個類

↓↓↓

ScbRibbonConfiguration

Configuration 表示這是一個spring的配置類

EnableConfigurationProperties 使@ConfigurationProperties註解生效

ConditionalOnBean 只有特定名稱或者類型的Bean存在於BeanFactory時才建立某個Bean

AutoConfigureAfter 只有在指定類的配置類配置完後纔會生效

RibbonClients 容許在一個類中聲明多個RibbonClient註解

注意Ribbon是懶加載的,而該類在RibbonAutoConfiguration初始化配置以後纔會執行配置,因此該類也是懶加載

 

ScbRibbonClientConfiguration

在ScbRibbonConfiguration類中的RibbonClients註解指定了ScbRibbonClientConfiguration來實例化RibbonClient。 以下,該類實例化了一個ServerList對象,實際類型爲ServiceCombServerList,該對象會替換DynamicServerListLoadBalancer類裏的ServerList對象。

ServiceCombServerList

在Ribbon體系中,ServerList接口負責獲取服務實例列表。ServiceComb使用ServiceCombServerList實現了該接口。該類使用了ServiceComb內置的服務發現能力。

ServiceCombServerList構造器裏使用discoveryTree添加了一個過濾器ScbRibbonEndpointDiscoveryFilter。

•DiscoveryTree是ServiceComb Registry包的類。ServiceComb Registry包提供了服務註冊,服務發現與過濾器等能力。

•ScbRibbonEndpointDiscoveryFilter繼承了AbstractEndpointDiscoveryFilter,而AbstractEndpointDiscoveryFilter實現了DiscoveryFilter。DiscoveryFilter接口主要管理實例進行分組、緩存

getInitialListOfServers方法獲取初始的servers;getUpdatedListOfServers方法獲取更新的servers

 

ScbRibbonEndpointDiscoveryFilter

ScbRibbonEndpointDiscoveryFilter繼承於AbstractEndpointDiscoveryFilter類,觀察AbstractEndpointDiscoveryFilter代碼可發現有一個discovery方法,這個方法會被DiscoveryTree使用以獲取服務列表。此時已進入ServiceComb Registry包內部,具體的細節不展開分析。

關於filter類,實際上查看DiscoveryTree的源碼可發現一些信息,以下是DiscoveryTree的doDiscovery方法,該方法屬於ServiceCombServerList獲取服務實例列表的調用鏈上,而該方法會將這個獲取信息的任務交給DiscoveryFilter類去處理。

 

本文向社區讀者從源碼角度闡述了ServiceComb是如何與SpringCloud Ribbon協同工做的。 

[單純使用的用戶實際上沒必要關心這些細節]  

很是歡迎愛好者們向社區提問和貢獻代碼:)

 

下篇將介紹ServiceComb內置的負載均衡的能力,內置的能力可支持定製化重試策略。

 

如在閱讀代碼時有任何疑問想交流,歡迎掃碼加入進微信羣。

期待志同道合的朋友們加入

ServiceComb的大門爲大家敞開~

用心作開源,不忘初衷

 

前期閱讀 

[學習微服務-第6天] 

負載均衡之ServiceComb + SpringCloud Ribbon

[學習微服務-第5天]

ServiceComb+Zipkin源碼解讀

[學習微服務-第4天]

ServiceComb+Zipkin

[學習微服務-第3天] 

ServiceComb內置高性能網關服務

[天天學習微服務-源碼解讀] 

ServiceComb+SpringCloud Zuul

[天天學習微服務-網關]

ServiceComb+SpringCloud Zuul

-----------------------------------------------

瞭解更多信息請訪問: 

官方網站http://servicecomb.apache.org/ 

Github代碼倉庫https://github.com/apache?q=ServiceComb

相關文章
相關標籤/搜索