1. 程式人生 > >Dubbo原始碼學習--RoundRobinLoadBalance負載均衡(四)

Dubbo原始碼學習--RoundRobinLoadBalance負載均衡(四)

RoundRobin LoadBalance

  • 輪循,按公約後的權重設定輪循比率。
  • 存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。

1)獲取輪詢key  服務名+方法名

獲取可供呼叫的invokers個數length

設定最大權重的預設值maxWeight=0

設定最小權重的預設值minWeight=Integer.MAX_VALUE

2)遍歷所有Inokers,比較出得出maxWeight和minWeight

3)如果權重是不一樣的

根據key獲取自增序列

自增序列加一與最大權重取模預設得到currentWeigth

遍歷所有invokers篩選出大於currentWeight的invokers

設定可供呼叫的invokers的個數length

4)自增序列加一併與length取模,從invokers獲取invoker

public class RoundRobinLoadBalance extends AbstractLoadBalance {

    public static final String NAME = "roundrobin";

    private final ConcurrentMap<String, AtomicPositiveInteger> sequences = new ConcurrentHashMap<String, AtomicPositiveInteger>();

    protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
        String key = invokers.get(0).getUrl().getServiceKey() + "." + invocation.getMethodName();
        int length = invokers.size(); // Number of invokers
        int maxWeight = 0; // The maximum weight 最大權重值
        int minWeight = Integer.MAX_VALUE; // The minimum weight 最小權重支援,預設最大
        final LinkedHashMap<Invoker<T>, IntegerWrapper> invokerToWeightMap = new LinkedHashMap<Invoker<T>, IntegerWrapper>();
		//權重值總數
        int weightSum = 0;
        for (int i = 0; i < length; i++) {
			//獲取權重值
            int weight = getWeight(invokers.get(i), invocation);
			//獲取最大和最小權重值
            maxWeight = Math.max(maxWeight, weight); // Choose the maximum weight
            minWeight = Math.min(minWeight, weight); // Choose the minimum weight
            if (weight > 0) {
                invokerToWeightMap.put(invokers.get(i), new IntegerWrapper(weight));
                weightSum += weight;
            }
        }
        AtomicPositiveInteger sequence = sequences.get(key);
        if (sequence == null) {
            sequences.putIfAbsent(key, new AtomicPositiveInteger());
            sequence = sequences.get(key);
        }
        int currentSequence = sequence.getAndIncrement();
        if (maxWeight > 0 && minWeight < maxWeight) {
			//輪詢當前值
            int mod = currentSequence % weightSum;
            for (int i = 0; i < maxWeight; i++) {
				//輪詢當前值的餘數輪詢從服務中獲取
                for (Map.Entry<Invoker<T>, IntegerWrapper> each : invokerToWeightMap.entrySet()) {
                    final Invoker<T> k = each.getKey();
                    final IntegerWrapper v = each.getValue();
                    if (mod == 0 && v.getValue() > 0) {
                        return k;
                    }
                    if (v.getValue() > 0) {
                        v.decrement();
                        mod--;
                    }
                }
            }
        }
        // Round robin
		//直接輪詢找服務
        return invokers.get(currentSequence % length);
    }

    private static final class IntegerWrapper {
        private int value;

        public IntegerWrapper(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        public void decrement() {
            this.value--;
        }
    }

}

相關推薦

Dubbo原始碼學習--RoundRobinLoadBalance負載均衡

RoundRobin LoadBalance輪循,按公約後的權重設定輪循比率。存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。1)獲取輪詢key  服務名+方法名獲取可供呼叫的invokers個數l

Dubbo原始碼學習負載均衡演算法1-隨機演算法

/** * random load balance. * */public class RandomLoadBalance extends AbstractLoadBalance { public static final String NAME = "random"; @Override

Dubbo原始碼學習負載均衡演算法2-輪詢演算法的實現

@Overrideprotected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) { String key = invokers.ge

Java併發包原始碼學習之AQS框架AbstractQueuedSynchronizer原始碼分析

經過前面幾篇文章的鋪墊,今天我們終於要看看AQS的廬山真面目了,建議第一次看AbstractQueuedSynchronizer 類原始碼的朋友可以先看下我前面幾篇文章: 分析原始碼是非常枯燥乏味的一件事,其實程式碼本身其實就是最好的說明了,因此基本都是貼出一些程式碼加上一些註釋, 因為Abstract

Dubbo原始碼學習--Redis註冊中心

基於 Redis 1 實現的註冊中心 2。使用 Redis 的 Key/Map 結構儲存資料結構:主 Key 為服務名和型別Map 中的 Key 為 URL 地址Map 中的 Value 為過期時間,用於判斷髒資料,髒資料由監控中心刪除 3使用 Redis 的 Publish

Golang原始碼學習:排程邏輯系統呼叫

## Linux系統呼叫 概念:系統呼叫為使用者態程序提供了硬體的抽象介面。並且是使用者空間訪問核心的唯一手段,除異常和陷入外,它們是核心唯一的合法入口。保證系統的安全和穩定。 呼叫號:在Linux中,每個系統呼叫被賦予一個獨一無二的系統呼叫號。當用戶空間的程序執行一個系統呼叫時,會使用呼叫號指明系統呼叫

從零學習遊戲伺服器開發LogServer原始碼探究

這是從零學習開源專案的第四篇,上一篇是《從零學習開源專案系列(三) CSBattleMgr服務原始碼研究》,這篇文章我們一起來學習LogServer,中文意思可能是“日誌伺服器”。那麼這個日誌伺服器到底做了哪些工作呢?我們在Visual Studio中將LogServer設定

SpringCloud學習 - Ribbon負載均衡客戶端

Ribbon負載均衡(客戶端) 書籤: (1)@LoadBalanced 負載均衡 (2)Ribbon自帶的負載規則 (3)Ribbon自定義負載規則 @LoadBalanced 負載均衡 複製專案eureka-provider,生成eureka-prov

spring cloud () 服務端客戶端負載均衡Ribbon

概述Ribbon是一個客戶端負載均衡器, 它可以讓您對HTTP和TCP客戶端的行為有很大的控制權。   Feign已經使用Ribbon,所以如果您使用的是@FeignClient, 那麼這個部分也適用。      Ribbon中一個重要的概念是named client。    Spring Cloud使用Ri

dubbo原始碼閱讀之負載均衡

負載均衡 在之前叢集的文章中,我們分析了通過監聽註冊中心可以獲取到多個服務提供者,並建立多個Invoker,然後通過叢集類如FailoverClusterInvoker將多個Invoker封裝在一起,而外部的呼叫者以這個封裝的Invoker為入口呼叫內部的多個Invoker,但是我們一次呼叫實際只能呼叫一個真

dubbo原始碼解析之負載均衡

在分散式系統中,負載均衡是必不可少的一個模組,dubbo 中提供了五種負載均衡的實現,在閱讀這塊原始碼之前,建議先學習負載均衡的基礎知識。把看原始碼當做一個印證自己心中所想的過程,這樣會得到事半功倍的效果 以下原始碼分析基於 dubbo 2.77 版本 ### 類結構 先來看一下這一塊的類結構圖 ![]

負載均衡LB具體解釋

code ilo pda host script cli snr 日誌 gin 二、LB LoadBalance就是把負載均衡分配到集群的各個節點,從而提高總體的吞吐能力。Oracle 10g RAC提供了兩種手段來實現負載,其一是通過Connection Ba

JavaSE 學習筆記之封裝

延遲加載 分類 static str super 想要 oid 懶漢式 可靠性 封 裝(面向對象特征之一):是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。 好處:將變化隔離;便於使用;提高重用性;安全性。 封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提

5.Azure負載均衡

應用 9.png tcp、udp ext 51cto apache服務器 變化 udp term 之前的文章中,我創建了一個WEB01的Windows Server虛擬機,接下來我再創建一臺Linux(CentOS 7.3)的WEB02虛擬機。在這2臺虛擬機上,我分別部署I

ng機器學習視頻筆記 ——logistic回歸

微信 style 簡化 關註 ora 微信公眾號 預測 縮放 log ng機器學習視頻筆記(四) ——logistic回歸 (轉載請附上本文鏈接——linhxx) 一、概述 1、基本概念 logistic回歸(logistic regression)

機器學習的簡要筆記——感知機的算法

author upd str eight 形式 最小化 turn ads urn 1、什麽是感知機(Perception) 感知機是生物神經細胞的簡單抽象。神經細胞結構大致可分為:樹突、突觸、細胞體及軸突。單個神經細胞可被視為一種只有兩種狀態的機器—&mdas

負載均衡 工作模式以及工作原理

工作 eal 組網 進一步 glob 中轉 反向代理服務 消息轉發 數據包轉發 負載均衡(科普篇) ?? 負載均衡(Load Balancing),簡單地說就是將多臺服務器組成一個服務器集群,然後根據我們設置的規則給服務器集群分配“工作任務”。?典型的互聯網應用的拓撲結構?

python程式設計:從入門到實踐學習筆記-Django入門

建立其他網頁 我們接下來擴充“學習筆記”專案,建立兩個顯示資料的網頁,其中一個列出所有的主題,另一個顯示特定主題的所有條目。 模板繼承 編寫一個包含通用元素的父模板,並讓每個網頁都繼承這個模板,而不必在每個網頁中重複定義這些通用元素。這樣我們可以專注於開發每個網頁的獨特部分。1.父模板

Spring Cloud Ribbon(客戶端負載均衡)2

1.引數配置 對於Ribbon的引數配置通常有兩種方式:全域性配置以及指定客戶端配置: 全域性配置:ribbon.<key>=<value>格式進行配置即可。<key>代表了Ribbon客戶端配置的引數名,<value>代表了對應引數值。比

Spring Cloud ---- 服務消費與負載均衡feign

req 啟動文件 創建 code cli 負載均衡。 auto request 文件   feign是一個聲明式的偽客戶端,只需要創建一個接口並且註解,它具有可插拔的特性。feign集合了Ribbon,再與Eurake結合實現服務的註冊發現與負載均衡。結合Hystrix,具