java B2B2C源碼電子商務平臺 -----客戶端負載均衡策略

一、負載均衡介紹
負載均衡(Load Balance): 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。願意瞭解源碼的朋友直接求求交流分享技術:二一四七七七五六三三

1、服務端負載均衡:客戶端請求到負載均衡服務器,負載均衡服務器根據自身的算法將該請求轉給某臺真正提供業務的服務器,該服務器將響應數據給負載均衡服務器,負載均衡服務器最後將數據返回給客服端。(nginx)

2、客服端負載均衡:基於客戶端的負載均衡,簡單的說就是在客戶端程序裏面,自己設定一個調度算法,在向服務器發起請求的時候,先執行調度算法計算出向哪臺服務器發起請求,然後再發起請求給服務器。

二、負載均衡策略介紹
(1) AbstractLoadBalancerRule
AbstractLoadBalancerRule是一個抽象類,裏邊主要定義了一個ILoadBalancer,定義它的目的主要是輔助負責均衡策略選取合適的服務端實例。

(2) RandomRule
該負載均衡策略就是隨機選擇一個服務實例,看源碼我們知道,在RandomRule的無參構造方法中初始化了一個Random對象,然後在它重寫的choose方法又調用了choose(ILoadBalancer lb, Object key)這個重載的choose方法,在這個重載的choose方法中,每次利用random對象生成一個不大於服務實例總數的隨機數,並將該數作爲下標所以獲取一個服務實例。

(3) RoundRobinRule
RoundRobinRule這種負載均衡策略叫做線性負載均衡策略,也就是我們在上文所說的BaseLoadBalancer負載均衡器中默認採用的負載均衡策略。這個類的choose(ILoadBalancer lb, Object key)函數整體邏輯是這樣的:開啓一個計數器count,在while循環中遍歷服務清單,獲取清單之前先通過incrementAndGetModulo方法獲取一個下標,這個下標是一個不斷自增長的數先加1然後和服務清單總數取模之後獲取到的(所以這個下標從來不會越界),拿着下標再去服務清單列表中取服務,每次循環計數器都會加1,如果連續10次都沒有取到服務,則會報一個警告No available alive servers after 10 tries from load balancer: XXXX。

(4) RetryRule

看名字就知道這種負載均衡策略帶有重試功能。首先RetryRule中又定義了一個subRule,它的實現類是RoundRobinRule,然後在RetryRule的choose(ILoadBalancer lb, Object key)方法中,每次還是採用RoundRobinRule中的choose規則來選擇一個服務實例,如果選到的實例正常就返回,如果選擇的服務實例爲null或者已經失效,則在失效時間deadline之前不斷的進行重試(重試時獲取服務的策略還是RoundRobinRule中定義的策略),如果超過了deadline還是沒取到則會返回一個null。

(5) WeightedResponseTimeRule
WeightedResponseTimeRule是RoundRobinRule的一個子類,在WeightedResponseTimeRule中對RoundRobinRule的功能進行了擴展,WeightedResponseTimeRule中會根據每一個實例的運行情況來給計算出該實例的一個權重,然後在挑選實例的時候則根據權重進行挑選,這樣能夠實現更優的實例調用。WeightedResponseTimeRule中有一個名叫DynamicServerWeightTask的定時任務,默認情況下每隔30秒會計算一次各個服務實例的權重,權重的計算規則也很簡單,如果一個服務的平均響應時間越短則權重越大,那麼該服務實例被選中執行任務的概率也就越大。

(6) ClientConfigEnabledRoundRobinRule
ClientConfigEnabledRoundRobinRule選擇策略的實現很簡單,內部定義了RoundRobinRule,choose方法還是採用了RoundRobinRule的choose方法,所以它的選擇策略和RoundRobinRule的選擇策略一致,不贅述。

(7) BestAvailableRule
BestAvailableRule繼承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基礎上主要增加了根據loadBalancerStats中保存的服務實例的狀態信息來過濾掉失效的服務實例的功能,然後順便找出併發請求最小的服務實例來使用。然而loadBalancerStats有可能爲null,如果loadBalancerStats爲null,則BestAvailableRule將採用它的父類即ClientConfigEnabledRoundRobinRule的服務選取策略(線性輪詢)。

(8) PredicateBasedRule
PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一個子類,它先通過內部定義的一個過濾器過濾出一部分服務實例清單,然後再採用線性輪詢的方式從過濾出來的結果中選取一個服務實例。

 
(9) ZoneAvoidanceRule
ZoneAvoidanceRule是PredicateBasedRule的一個實現類,只不過這裏多一個過濾條件,ZoneAvoidanceRule中的過濾條件是以ZoneAvoidancePredicate爲主過濾條件和以AvailabilityPredicate爲次過濾條件組成的一個叫做CompositePredicate的組合過濾條件,過濾成功之後,繼續採用線性輪詢的方式從過濾結果中選擇一個出來。使用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個zone的運行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用於過濾掉連接數過多的Server。

技術架構圖如下:

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