在上一篇 《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組件的相關類。
下面咱們分別來看看這幾個類
↓↓↓
Configuration 表示這是一個spring的配置類
EnableConfigurationProperties 使@ConfigurationProperties註解生效
ConditionalOnBean 只有特定名稱或者類型的Bean存在於BeanFactory時才建立某個Bean
AutoConfigureAfter 只有在指定類的配置類配置完後纔會生效
RibbonClients 容許在一個類中聲明多個RibbonClient註解
注意Ribbon是懶加載的,而該類在RibbonAutoConfiguration初始化配置以後纔會執行配置,因此該類也是懶加載
在ScbRibbonConfiguration類中的RibbonClients註解指定了ScbRibbonClientConfiguration來實例化RibbonClient。 以下,該類實例化了一個ServerList對象,實際類型爲ServiceCombServerList,該對象會替換DynamicServerListLoadBalancer類裏的ServerList對象。
在Ribbon體系中,ServerList接口負責獲取服務實例列表。ServiceComb使用ServiceCombServerList實現了該接口。該類使用了ServiceComb內置的服務發現能力。
ServiceCombServerList構造器裏使用discoveryTree添加了一個過濾器ScbRibbonEndpointDiscoveryFilter。
•DiscoveryTree是ServiceComb Registry包的類。ServiceComb Registry包提供了服務註冊,服務發現與過濾器等能力。
•ScbRibbonEndpointDiscoveryFilter繼承了AbstractEndpointDiscoveryFilter,而AbstractEndpointDiscoveryFilter實現了DiscoveryFilter。DiscoveryFilter接口主要管理實例進行分組、緩存
getInitialListOfServers方法獲取初始的servers;getUpdatedListOfServers方法獲取更新的servers
ScbRibbonEndpointDiscoveryFilter繼承於AbstractEndpointDiscoveryFilter類,觀察AbstractEndpointDiscoveryFilter代碼可發現有一個discovery方法,這個方法會被DiscoveryTree使用以獲取服務列表。此時已進入ServiceComb Registry包內部,具體的細節不展開分析。
關於filter類,實際上查看DiscoveryTree的源碼可發現一些信息,以下是DiscoveryTree的doDiscovery方法,該方法屬於ServiceCombServerList獲取服務實例列表的調用鏈上,而該方法會將這個獲取信息的任務交給DiscoveryFilter類去處理。
小結
本文向社區讀者從源碼角度闡述了ServiceComb是如何與SpringCloud Ribbon協同工做的。
[單純使用的用戶實際上沒必要關心這些細節]
很是歡迎愛好者們向社區提問和貢獻代碼:)
下篇將介紹ServiceComb內置的負載均衡的能力,內置的能力可支持定製化重試策略。
如在閱讀代碼時有任何疑問想交流,歡迎掃碼加入進微信羣。
期待志同道合的朋友們加入
ServiceComb的大門爲大家敞開~
用心作開源,不忘初衷
前期閱讀
負載均衡之ServiceComb + SpringCloud Ribbon
-----------------------------------------------
瞭解更多信息請訪問:
官方網站http://servicecomb.apache.org/
Github代碼倉庫https://github.com/apache?q=ServiceComb