第三篇:Spring Cloud Ribbon 負載均衡器 — 實現服務消費以及負載均衡

1、簡介web

 Ribbon是一個基於Netflix Ribbon實現的客戶端的負載均衡器,它提供對大量的HTTP和TCP客戶端的訪問控制。它不像服務註冊中心、配置中心、API網關那樣獨立部署,可是它幾乎存在於每一個微服務的基礎設施中。理解Ribbon對於咱們使用Spring Cloud來說很是的重要,由於負載均衡是對系統的高可用、網絡壓力的緩解和處理能力擴容的重要手段之一。真正的服務消費者選擇合適節點來調用服務生產者提供的數據是經過Spring Cloud Ribbon來實現的。spring

1.當一個服務實例啓動,會將它的IP地址等信息註冊到Eureka服務註冊中心;
2.當客戶端調用其它服務時,會先經過Ribbon檢查本地緩存中是否有目標服務實例信息,再選取列表中某個實例進行訪問(負載均衡發生在客戶端),不然會從服務發現代理獲取。
3.Ribbon會按期從Eureka刷新本地緩存。當服務調用失敗,客戶端會讓本地緩存失效,而後從新從服務發現代理獲取新的服務註冊信息。緩存

它主要包括六個組件:服務器

  • ServerList:負載均衡使用的服務器列表。這個列表會緩存在負載均衡器中,並按期更新。當 Ribbon 與 Eureka 結合使用時,ServerList 的實現類就是 DiscoveryEnabledNIWSServerList,它會保存 Eureka Server 中註冊的服務實例表。
  • ServerListFilter:服務器列表過濾器。這是一個接口,主要用於對 Service Consumer 獲取到的服務器列表進行預過濾,過濾的結果也是 ServerList。Ribbon 提供了多種過濾器的實現。
  • IPing:探測服務實例是否存活的策略。
  • IRule:負載均衡策略,其實現類表述的策略包括:輪詢、隨機、根據響應時間加權等,其類結構以下圖所示。
  • ILoadBalancer:負載均衡器。這也是一個接口,Ribbon 爲其提供了多個實現,好比 ZoneAwareLoadBalancer。而上層代碼經過調用其 API 進行服務調用的負載均衡選擇。通常 ILoadBalancer 的實現類中會引用一個 IRule。
  • RestClient:服務調用器。顧名思義,這就是負載均衡後,Ribbon 向 Service Provider 發起 REST 請求的工具。

咱們也能夠本身定義負載均衡策略,好比咱們就利用本身實現的策略,實現了服務的版本控制和直連配置。實現好以後,將實現類從新注入到 Ribbon 中便可。網絡

Ribbon 工做時會作四件事情:負載均衡

  1.  優先選擇在同一個 Zone 且負載較少的 Eureka Server;
  2.  按期從 Eureka 更新並過濾服務實例列表;
  3.  根據用戶指定的策略,在從 Server 取到的服務註冊列表中選擇一個實例的地址;
  4.  經過 RestClient 進行服務調用。

pom.xml引入ribbon插件:ide

spring-cloud-starter-netflix-eureka-client已集成ribbon,因此無需再額外引入spring-cloud-starter-netflix-ribbon。微服務

咱們採用了聲明式的方式來實現負載均衡。實際上,內部調用維護了一個RestTemplate對象,該對象會使用Ribbon的自動化配置(LoadBalancerAutoConfiguration),同時經過@LoadBalanced開啓客戶端負載均衡。RestTemplate是Spring用於客戶端HTTP同步訪問的主要類,用於發起 REST請求。工具

@LoadBalanced源碼追溯,該註解用來給RestTemplate作標記,以使用負載均衡的客戶端(LoadBalancerClient)來配置RestTemplate。spa

choose() 方法根據傳入的serviceId服務Id,從負載均衡器選擇一個一個對應的服務實例。

execute() 方法根據serviceId服務ID和請求request來執行請求內容。

reconstructURI() 方法構建出一個合適的Host:Port的URI。而 RibbonLoadBalancerClient就是LoadBalancerClient的具體實現。

LoadBalancerAutoConfiguration類是Ribbon的自動化配置類。

LoadBalancerInterceptor類用於實現對客戶端發起請求時進行攔截,以實現客戶端的負載均衡。

當於Spring Cloud應用引入Ribbon和Eureka的時候,會觸發Eureka中實現的Ribbon的自動化配置。

3、配置

因爲Spring Cloud應用引入Ribbon和Eureka的時候,會觸發Eureka中實現的Ribbon的自動化配置。

serverList 的維護機制是由 DiscoveryEnabledNIWSServerList的實例維護,該類會將服務清單列表交給Eureka的服務治理機制來維護。

IPing的實現由 NIWSDiscoveryPing 的實例維護,該類也將服務檢查交給Eureka的服務治理機制來維護。

默認狀況下,用於獲取實例請求的ServiceList接口實現是採用Spring Cloud Eureka中封裝的DomainExtractingServerList.

因爲Spring Cloud Ribbon默認實現了區域親和策略,因此咱們能夠經過Eureka實例的元數據配置來實現區域化的實例配置方案。

好比 eureka.instance.metadataMap.zone=hangzhou. 經過zone參數來指定本身所在的區域。

在Spring Cloud Ribbon 與 Spring Cloud Eureka結合工程中,咱們能夠經過參數配置方式來禁用Eureka對Ribbon服務實例的維護實現。

ribbon.eureka.enabled=false


4、除了傳統負載均衡的能力以外,它還能解決如下問題:

  1.當監控到集羣內有服務器發生故障,Ribbon 能夠臨時將故障的服務器從負載均衡中剔除,直到這三臺機器恢復正常的響應。  2.能夠對響應最快的服務器進行加權,將更多的流量帶到響應最快的節點。  3.支持將多種負載均衡的策略同時啓用,將負載均衡的效果調試到最好。  4.自定義設置重試機制。

相關文章
相關標籤/搜索