1、簡介web
Ribbon是一個基於Netflix Ribbon實現的客戶端的負載均衡器,它提供對大量的HTTP和TCP客戶端的訪問控制。它不像服務註冊中心、配置中心、API網關那樣獨立部署,可是它幾乎存在於每一個微服務的基礎設施中。理解Ribbon對於咱們使用Spring Cloud來說很是的重要,由於負載均衡是對系統的高可用、網絡壓力的緩解和處理能力擴容的重要手段之一。真正的服務消費者選擇合適節點來調用服務生產者提供的數據是經過Spring Cloud Ribbon來實現的。spring
1.當一個服務實例啓動,會將它的IP地址等信息註冊到Eureka服務註冊中心;
2.當客戶端調用其它服務時,會先經過Ribbon檢查本地緩存中是否有目標服務實例信息,再選取列表中某個實例進行訪問(負載均衡發生在客戶端),不然會從服務發現代理獲取。
3.Ribbon會按期從Eureka刷新本地緩存。當服務調用失敗,客戶端會讓本地緩存失效,而後從新從服務發現代理獲取新的服務註冊信息。緩存
它主要包括六個組件:服務器
咱們也能夠本身定義負載均衡策略,好比咱們就利用本身實現的策略,實現了服務的版本控制和直連配置。實現好以後,將實現類從新注入到 Ribbon 中便可。網絡
Ribbon 工做時會作四件事情:負載均衡
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.自定義設置重試機制。