天天看點

Spring Cloud Ribbon——用戶端負載均衡

一、負載均衡

負載均衡(Load Balance): 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴充網絡裝置和伺服器的帶寬、增加吞吐量、加強網絡資料處理能力、提高網絡的靈活性和可用性。其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,進而共同完成工作任務。

1、服務端負載均衡:用戶端請求到負載均衡伺服器,負載均衡伺服器根據自身的算法将該請求轉給某台真正提供業務的伺服器,該伺服器将響應資料給負載均衡伺服器,負載均衡伺服器最後将資料傳回給客服端。(nginx、LVS、HAPROXY)

Spring Cloud Ribbon——用戶端負載均衡

2、客服端負載均衡:基于用戶端的負載均衡,簡單的說就是在用戶端程式裡面,自己設定一個排程算法,在向伺服器發起請求的時候,先執行排程算法計算出向哪台伺服器發起請求,然後再發起請求給伺服器。

Spring Cloud Ribbon——用戶端負載均衡

基于用戶端負載均衡的特點:

a、由用戶端内部程式實作,不需要額外的負載均衡器軟硬體投入。

b、程式内部需要解決業務伺服器不可用的問題,伺服器故障對應用程式的透明度小。

c、程式内部需要解決業務伺服器壓力過載的問題。

二、Ribbon實作用戶端的負載均衡

我們使用spring boot來測試。

1、pom檔案:

Spring Cloud Ribbon——用戶端負載均衡
Spring Cloud Ribbon——用戶端負載均衡

View Code

2、application.yml

3、Ribbon的負載均衡政策(7種政策)

3.1、RoundRobinRule(輪詢模式)

public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin方式輪詢選擇 server 輪詢index,選擇index對應位置的server,該政策也是ribbon的預設政策。

3.2、RandomRule(随機政策)

public class RandomRule extends AbstractLoadBalancerRule 随機選擇一個server 在index上随機,選擇index對應位置的server。

在配置檔案application.yml加入:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

在SpringCloudRibbonApplication.java 中加入:

3、BestAvailableRule(并發量)

public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 選擇一個最小的并發請求的server ,逐個考察Server,如果Server被tripped了,則忽略,在選擇其中ActiveRequestsCount最小的server

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule

4、AvailabilityFilteringRule(伺服器狀态)

public class AvailabilityFilteringRule extends PredicateBasedRule 過濾掉那些因為一直連接配接失敗的被标記為circuit tripped(電路跳閘)的後端server,并過濾掉那些高并發的的後端server(active connections 超過配置的門檻值) 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就是檢查status裡記錄的各個server的運作狀态

5、WeightedResponseTimeRule(根據響應時間)

public class WeightedResponseTimeRule extends RoundRobinRule 根據響應時間配置設定一個weight,響應時間越長,weight越小,被選中的可能性越低。 一個背景線程定期的從status裡面讀取評價響應時間,為每個server計算一個weight。Weight的計算也比較簡單responsetime 減去每個server自己平均的responsetime是server的權重。當剛開始運作,沒有形成statas時,使用roubine政策選擇server。

6、RetryRule(根據政策+重試)

public class RetryRule extends AbstractLoadBalancerRule 對標明的負載均衡政策機上重試機制。 在一個配置時間段内當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server

7、ZoneAvoidanceRule(Zone狀态+服務狀态)

public class ZoneAvoidanceRule extends PredicateBasedRule 複合判斷server所在區域的性能和server的可用性選擇server 使用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個zone的運作性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于過濾掉連接配接數過多的Server。

4、5、6、7這些政策使用方式與上述方式相同這裡不在示範。