Dubbo原始碼解析之LoadBalance負載均衡

2021-08-29 18:25:41 字數 2957 閱讀 1131

dubbo一共支援四種負載均衡策略,roundrobinloadbalance(輪詢)、randomloadbalance(隨機)、leastactiveloadbalance(最少活躍)、consistenthashloadbalance(一致性雜湊)。預設為隨機策略,我門在分析consumer呼叫過程中invoker的選擇時,看到了負載均衡策略的應用,下面我們分別來分析一下這四種負載均衡策略的實現細節:

abstractloadbalance:

public

invoker

select

(list

> invokers, url url, invocation invocation)

首先來看預設的隨機策略:

randomloadbalance:

protected

invoker

doselect

(list

> invokers, url url, invocation invocation)}if

(totalweight >0&&

!sameweight)}}

// 如果所有的invoker具有相同的權重值或總權重等於0,則隨機返回乙個invoker

return invokers.

get(random.

nextint

(length));

}

protected

invoker

doselect

(list

> invokers, url url, invocation invocation)

} atomicpositiveinteger sequence = sequences.

get(key);if

(sequence == null)

// 當前序列

int currentsequence = sequence.

getandincrement()

;if(maxweight >

0&& minweight < maxweight)

if(v.

getvalue()

>0)

}}}// 輪詢選擇

return invokers.

get(currentsequence % length)

;}

接下來我們來看最少活躍策略:

leastactiveloadbalance:

protected

invoker

doselect

(list

> invokers, url url, invocation invocation)

else

if(active == leastactive)}}

if(leastcount ==1)

if(!sameweight && totalweight >0)

}// 如果所有呼叫者具有相同的權重值或totalweight = 0,則從具有最小活躍值的集合中隨機返回乙個

return invokers.

get(leastindexs[random.

nextint

(leastcount)])

;}

最後我們來看一致性雜湊策略,一致性雜湊,相同引數的請求總是發到同一提供者。當某一台提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者。預設只對第乙個引數hash,如果要修改,可以配置。預設使用160個虛擬節點,如果要修改,可以配置

consistenthashloadbalance:

protected

invoker

doselect

(list

> invokers, url url, invocation invocation)

/* 選擇器選擇invoker */

return selector.

select

(invocation)

;}

consistenthashloadbalance.consistenthashselector:

consistenthashselector

(list

> invokers, string methodname,

int identityhashcode)

// 這裡的作用個人理解為盡量將每個invoker的虛擬節點均勻的打散在雜湊環上

for(invoker

invoker : invokers)}}

}

consistenthashloadbalance.consistenthashselector:

public invoker

select

(invocation invocation)

consistenthashloadbalance.consistenthashselector:

private invoker

selectforkey

(long hash)

else

}// 根據key取出invoker返回

invoker = virtualinvokers.

get(key)

;return invoker;

}

到這裡,整個dubbo的負載均衡原始碼分析就完成了。

Dubbo原始碼解析之SPI

dubbo版本 2.5.4 dubbo在服務發布過程中缺省會載入自適應的協議擴充套件,在類serviceconfig中存在以下初始化 下面以此進行spi過程分析。private static final protocol protocol extensionloader.getextensionlo...

dubbo原始碼解析(dubbo容器部分)

dubbo 解析 dubbo中也有內建的容器介面就是類 com.alibaba.dubbo.container.container 如下所示 spi spring public inte ce container 也同樣是 spi擴充套件點。而且介面非常的簡單,乾淨,在 dubbo 框架中一共出現了...

dubbo原始碼 dubbo之Listener

1.exporterlistener spi public inte ce exporterlistener 使用者可以繼承該方法重寫需要的方法 public abstract class exporterlisteneradapter implements exporterlistener pub...