1. 程式人生 > >spring cloud系列教程(7)---ribbon負載均衡演算法

spring cloud系列教程(7)---ribbon負載均衡演算法

給大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油https://img-blog.csdnimg.cn/20181129224604602.png ​  

1.ribbon工作的大概步驟

第一步先選擇EurekaServer,它優先選擇在同一個區域內負載較少的server。                      

第二步:再根據使用者指定的策略,從server取到的服務註冊列表中選擇一個地址。其中ribbon提供了多種策略:日入輪詢,隨機和根據相應時間加權

2.自帶的負載均衡演算法

https://github.com/Netflix/ribbon/blob/master/ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/RoundRobinRule.java   github地址

可以看看例如 randomrule 是在服務列表中隨機一個數

RoundRobinRule  是利用一個類變數AtomicInteger  來計數

Ribbon負載均衡演算法的實現是由IRule元件負責的預設有下面幾種演算法

RoundRobinRule               輪詢

RandomRule                       隨機

AvailabilityFilteringRule       會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,還有併發的連線數量超過閾值的服務,然後對剩餘的服務列表按輪詢策略進行訪問

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

RetryRule              先按照RoudRobinRule的策略獲取服務,如果獲取服務失敗則在指定時間內進行重試,獲取可用服務,如果還是失敗的就會自動把這個失敗的服務隔離掉

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

ZoneAvoidanceRule     預設規則,複合判斷server所在區域的效能和server的可用性選擇伺服器

3.自定義規則

每個服務呼叫5次後,換下一個服務

主要程式碼:

if (total.get() < 5) {
   totalAdd();
   server = upList.get(currentIndex.get());
} else {
   total = new AtomicInteger(0);
   indexAdd();
   if (currentIndex.get() >= upList.size()) {
      currentIndex = new AtomicInteger(0);
   }
}

全部程式碼:https://github.com/ZhZGod/spring-cloud-codes