Ribbon(客戶端負載均衡器)學習筆記

一、Ribbon簡介

Ribbon是一個開源的客戶端負載均衡器,由Netflix發佈,是SpringCLoud-Netflix中重要的一環,通過他將Netflix的中間層服務連接在一起

Ribbon類似於nginx的負載均衡前移到前端了。

Ribbon的客戶端組件提供了一些列完善的配置項,如連接超時、重試等。簡單的說,就是在配置文件中列出Load Balancer後面所有的服務,Ribbon會自動的基於某種規則(如輪詢、隨機等)去連接這些服務,也很容易實現自定義的負載均衡算法。

二、Ribbon能幹什麼

Ribbon是在客戶端來實現負載均衡的訪問服務,主要功能點包括:
1、服務發現:發現依賴的服務列表
2、服務選擇規則:在多個服務中如何選擇一個有效服務。(此功能是Ribbon的核心)
3、服務監聽:檢測到失效的服務,高效剔除失效服務。

三、Ribbon應用架構

在這裏插入圖片描述

四、Ribbon的HelloWorld

4.1、添加依賴

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-ribbon</artifactId> 
</dependency>

先不添加Eureka的starter。

4.2、Ribbon的參數配置

4.2.1、概述

對於Ribbon的參數的key及value的類型的定義,可以通過com.netflix.client.config.DefaultClientConfigKey查看。

如果你沒有配置任何屬性,則Ribbon會使用com.netflix.client.config.DefaultClientConfigImpl裏的值。

4.2.2、配置方式

Ribbon的參數配置通常有兩種方式:全局配置和指定客戶端配置。

4.2.2.1、全局配置

只需要使用

ribbon.<key>=<value>

格式進行配置即可。
其中,<key>代表了Ribbon客戶端配置的參數名,<value>則代表了對應參數的值。

比如,可以向項目這樣配置Ribbon的超時時間:
ribbon.ConnectTimeout=250
全局配置可以作爲默認值進行設置,當指定客戶端配置了響應的key的值時,將覆蓋全局配置的值。

4.2.2.2、指定客戶端的配置

可以使用

<client>.ribbon.<key>=<value>

的格式進行配置。
<client>表示服務名,比如沒有服務治理框架(如Eureka)的時候,需要指定實例清單,如userService.ribbon.listOfServers=localhost:8080

五、Ribbon的核心組件

5.1、Ribbon包含如下核心組件

5.1.1、IRule

根據特定算法,從服務列表中選取一個要訪問的服務。

5.1.2、IPing

後臺運行線程,用來判斷服務是否可用

5.1.3、ServerList

服務列表,可以是靜態的或動態的,如果是動態的,後續線程將刷新並按一定的時間間隔過濾列表。

5.1.4、ServerListFilter

該接口允許過濾配置,或動態獲取具有所需特性的服務器列表

5.1.5、ServerListUpdater

被DynamicServerListLoadBalancer用於動態更新服務列表

5.1.6、IClientConfig

定義各種配置信息,用來初始化Ribbon客戶端和負載均衡器。

5.1.7、ILoadBalancer

定義軟件負載均衡器操作的接口。動態更新一組服務列表,及根據指定算法從現有服務器列表中選擇一個服務。

5.2、配置

這些組件可以以編程的方式設置,也可以是客戶端配置屬性的一部分,並通過反射創建。

支持的屬性如下所示,應以<clientName>.ribbon.爲前綴:
NFLoadBalancerClassName:要使用的ILoadBalancer
NFLoadBalancerRuleClassName:要使用的Irule
NFLoadBalancerPingClassName:要使用Iping
NIWSServerListClassName:要使用的ServerList
NIWSServerListFilterClassName:要使用的ServerListFilter

5.3、核心組件之 IRule

IRule都在com.netflix.loadbalancer包下面,常用的實現由下面幾種:
1、RoundRobinRule:輪詢規則

2、RandomRule:隨機獲取一個服務

3、AvailabilityFilteringRule:這個負載均衡器規則,會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,還有併發的連接數量超過閾值的服務,然後對剩餘的服務列表按照輪詢策略進行訪問。

4、WeightedResponseTimeRule
根據平均響應時間,計算所有服務的權重,響應時間越快,服務權重越大,被選中的概率越高。剛啓動時,如果統計信息不足,則使用RoundRobinRule策略,等統計信息足夠,會切換到WeightedResponseTimeRule。

5、RetryRule
先按照RoundRobinRule的策略獲取服務,如果獲取服務失敗,則在指定時間內會進行重試,獲取可用的服務。

6、BestAvailableRule
此負載均衡器會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個併發量最小的服務。

7、ZoneAvoidanceRule
默認規則,複合判斷server所在區域的性能和server的可用性,選擇server。

5.4、核心組件之 IPing

IPing都在com.netflix.loadBalancer包下面,重用的實現有以下幾種:

1、DummyPing:默認實現,默認返回true,即認爲服務永遠活着。

2、NIWSDiscoveryPing:不執行真正的ping。如果Discovery Client認爲是在線,則呈現認爲本次心跳成功,服務活着。

3、PingUrl:此組件會使用HttpClient調用服務的一個URL,如果調用成功,則認爲本次心跳成功,表示此服務活着。

4、NoOpPing:永遠返回true,即認爲服務永遠活着。

5.5、核心組件之 ServerList

ServerList都在com.netflix.loadbalancer包下,常用的實現有以下幾種:

1、ConfigurationBasedServerList:從配置文件中獲取所有服務列表,也是靜態獲取服務列表,配置例子:sample-client.ribbon.listOfServers=

2、DiscoveryEnabledNIWSServerList:從Eureka Client中獲取服務列表,此值必須通過屬性中的VipAddress來標識服務器集羣。
DynamicServerListLoadBalancer會調用此對象來動態獲取服務列表。

3、DomainExtractingServerList:代理類,根據ServerList的值實現具體的邏輯。

5.6、核心組件之 ServerListFilter

ServerListFilter都在com.netflix.loadBalancer包下,重用的實現方式入下:

1、ZoneAffinityServerListFilter:過濾掉所有的不合客戶端在相同zone的服務,如果和客戶端相同的zone不存在,纔不過濾不同zone的服務。啓用此配置使用以下配置:
<clientName>.ribbon.EnableZoneAffinity=true

2、ServerListSubsetFilter:ZoneAffinityServerListFilter的子類。此過濾器確保客戶端僅看到有ServerList實現返回的整個服務器的固定子集。它還可以定期用心服務器替代可用性差的子集中的服務器。要啓用此過濾器,可指定以下屬性:

myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEna
bledNIWSServerList
# the server must register itself with Eureka server with VipAddress "myservice" myClient.ribbon.DeploymentContextBasedVipAddresses=myservice myClient.ribbon.NIWSServerListFilterClassName=com.netflix.loadbalancer.ServerListS
ubsetFilter
# only show client 5 servers. default is 20. myClient.ribbon.ServerListSubsetFilter.size=5

5.7、核心組件之 ServerListUpdater

ServerListUpdater都在com.netflix.loadbalancer包下,常用實現方式有幾種:
1、PollingServerListUpdater:默認的實現策略。此對象會啓動一個定時線程池,定時執行更新策略。

2、EurekaNotiflicationServerListUpdater:當收到緩存刷新的通知,會更新服務列表。

5.8、核心組件之 ILoadBalancer

ILoadBalancer都在com.netflix.loadbalancer包下,常用的實現方式有:

1、DynamicServerListLoadBalancer:組合了Rule, IPing, ServerList, ServerListFilter, ServerListUpdater實現類,實現動態更新和過濾更新服務列表。

2、ZoneAwareLoadBalancer:這是DynamicServerListLoadBalancer的子類,加入了zone的因素。統計每個zone的平均請求情況,保證從所有zone選取對當前客戶端服務最好的服務組列表。

六、重試機制

Spring Cloud通過整合Spring retry來增強RestTemplate的重試能力,對於開發者來說,只要簡單配置,即可完成重試策略。

配置示例入下:
1、spring.cloud.loadbalancer.retry.enabled=true // 該參數用來開啓重試機制,它默認是關閉的。

2、hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 //斷路器的超時時間需要大於Ribbon的超時時間,不然Ribbon不會被觸發重試。

3、userService.ribbon.ConnectTimeout=250 // 請求連接超時時間

4、userService.ribbon.ReadTimeout=1000 // 請求處理的超時時間

5、userService.ribbon.OkToRetryOnAllOperations=true // 對所有操作請求都進行重試

6、userService.ribbon.MaxAutoRetriesNextServer=2 // 切換實例的重試次數

7、userService.ribbon.maxAutoRetries=1 // 對當前實例的重試次數

七、@RibbonClient 註解

註解@RibbonClient,目的是爲了在啓動該微服務的時候就能去加載我們的自動以的Ribbon配置類,從而使配置生效。示例:

@RibbonClient(name="userService",configuration=MyConf2.class)

說明:
1、這個userService不是隨便寫的,而是註冊到Eureka發現組件上的微服務服務端,意思是要對所有工程名爲userService的服務提供者進行負載均衡管理。
2、官方文檔明確給出了警告:這個測試配置類MyConf2不能放在@ComponentScan所掃描的當前包下以及子包下,否則我們自定義的這個配置類就會被所有的Ribbon客戶端所共享,也就是我們達不到特殊化定時的目的了。

7.1、自定義負載均衡器

可以直接參考官方的Rule實現來做,比如:
https://github.com/Netflix/ribbon/blob/master/ribbon- loadbalancer/src/main/java/com/netflix/loadbalancer/RandomRule.java

開發好過後,就可以配置來使用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章