1. 程式人生 > 其它 >還沒有禿頭嗎?你真的需要大牛來教你如何深入解析Ribbon原始碼了

還沒有禿頭嗎?你真的需要大牛來教你如何深入解析Ribbon原始碼了

  Ribbon原始碼解析

  Ribbon 的 源 碼 解 析 我 們 從 @LoadBalanced 開 始 講 起 , 添 加@LoadBalanced註解後AsyncRestTemplate就具備了負載均衡的能力,程式碼如下:

  

  在初始化HTTP客戶端時會載入Ribbon的攔截程式碼,同時根據配置檔案中設定的負載均衡策略或者程式碼實現定製好的負載均衡策略,實現HTTP請求過程中的後端服務分發。所以原始碼解讀可以分為兩個部分。

  ● 初始化構造過程:獲取@LoadBalanced註解標記RestTemplate或者AsyncRestTemplate,然後新增攔截器。鄭州心理疾病醫院

http://www.hyde8871.com/

  ● 負載均衡服務選擇過程:在Ribbon設定的負載均衡策略下,從服務叢集中根據預定的負載均衡策略實現後端服務的選取及請求轉發。

  如下圖所示是一個簡要的Ribbon初始化及呼叫攔截HTTP請求實現負載均衡的流程。

  

  Ribbon的初始化過程

  @LoadBalanced註解對RestTemplate做了標記,使用Ribbon的自動化配置載入類實現對負載均衡客戶端的載入,在生成的RestTemplate的Bean上添加註解後,它會配置LoadBalancerClient。首先我們看一下LoadBalancerClient的原始碼實現:

  

  說明:LoadBalancerClient是一個介面,裡面有三個方法。

  ● ServiceInstance choose(String serviceId)方法,根據傳入的serviceId(服務名),從負載均衡器中選擇一個服務例項,服務例項通過ServiceInstance類來表示。

  ● execute方法,使用從負載均衡器中選擇的服務例項來執行請求內容。

  ● URI reconstructURI ( ServiceInstance instance , URIoriginal ) 方 法 : 用 來 重 新 構 建 URI 。 我 們 通 過RestTemplate 請 求 後 端 服 務 時 會 使 用 serviceId ( 服 務名),這個方法會把請求的URI進行轉換,返回host+port,再通過host+port的形式去請求服務。

  從META-INF/spring.factories檔案來看Ribbon的自動化載入機制,主要是Spring Common的LoadBalancerClient的初始化和載入過程:

  

  Ribbon的自動配置實現

  下面是Ribbon的自動化配置實現:

  

  

  

  ● 說 明 1 # : Ribbon 將 所 有 標 記 @LoadBalanced 注 解 的RestTemplate儲存到一個List集合中。

  ● 說 明 2 # : Ribbon 借 助 了 Spring IoC 容 器 的SmartInitializingSingleton機制。實現該介面後,當所有單 例 Bean 都 被 初 始 化 完 成 後 , 容 器 會 調 用afterSingletonsInstantiated實現RestTemplateCustomizer的customize定製化方法。

  ● 說 明 3 # : 獲 取 RestTemplate 的 interceptors , 在 構 造LoadBalancerInterceptor時需要傳入LoadBalanceClient例項引數,LoadBalanceClient是一個介面,具體實現類將實現choose(服務例項選擇)和execute(請求轉發執行)方法,這一步完成Ribbon負載均衡策略Bean的構造。

  ● 說明4:將說明3#中構造的loadBalancerInterceptor Bean例項注入RestTemplate的定製化Bean中,這一步驟也會在說明2# 的 afterSingletonsInstantiated 方 法 中 被 調 用 , 完 成RestTemplate的定製化及與LoadBalancerInterceptor例項關聯。