前言
本篇博客主要是想描述Ribbon負載的規則、負載規則的替換、還有默認負載輪訓算法原理,通過這些知識點的總結與分享,不單單是爲了針對自己所學知識的總結,最主要的是幫助需要幫助的人,本人知識水平有限,但是上進的拼力無限。
默認自帶的負載規則
IRule:根據特定算法中從服務列表中選取一個要訪問的服務
Ribbon自帶的規則:
- RoundRobinRule --輪詢
- RandomRule --隨機
- RetyRule --先按照RoundRobinRule的策略獲取服務,如果獲取到服務失敗則在指定時間內會進行重試,獲取可用的服務
- WeightedResponseTimeRule --對RoundRobinRule的擴展,響應速度越快的實例選擇權重越大,越容易被選擇
- BestAvailableRule–會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個併發量最小的服務
- AvailabilityFilteringRule–先過濾掉故障實例,再選擇併發較小的實例
- ZoneAvoidanceRule–默認規則,複合判斷server所在區域的性能和server的可用性選擇服務器
Ribbon負載規則替換
- 修改module
- 配置
在配置時有一個細節需要我們知道,在通過官方文檔明確給的說明,自定義配置類不能放在ComponentScan所掃描的當前包下以及子包下,否則我們自定義的這個配置類就會被所有的Ribbon客戶端所共享,達不到特殊化定製的目的了。
例如:
意思我們的配置類不能放在如下圖標紅的啓動類的同包及子包下
- 創建上下包規則類
package com.zcw.myrule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName : MySelfRule
* @Description :
* @Author : Zhaocunwei
* @Date: 2020-05-15 11:37
*/
@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
//定義爲隨機
return new RandomRule();
}
}
- 修改啓動類
@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration= MySelfRule.class)
測試
總結:默認輪訓算法原理
負載均衡算法;rest接口第幾次請求數%服務器集羣總數量=實際調用服務器位置下標,每次服務器重啓動後rest接口計數從1開始。
來自大佬的話
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
如:
List[0] instances =127.0.0.1:8002
List[1] instances=127.0.0.1:8001
8001+8002 組合成爲集羣,它們共計2臺計算器,集羣總數爲2,
按照輪訓算法原理:
當總數請求爲1時: 1%2=1 對應下標位置爲1,獲得服務地址爲127.0.0.1:8001
當總數請求爲2時: 2%2=0 對應下標位置爲0,獲得服務地址爲 127.0.0.1:8002
當總數請求爲3時: 3%2=1 對應下標位置爲1 ,獲得服務地址爲 127.0.0.1:8001
當總請求數爲4時: 4%2=0 對應小標位置爲0,獲得服務地址爲 127.0.0.1:8002
如此類推… …