Dubbo架構

Dubbo架構

Provider: 暴露服務的服務提供方。 
Consumer: 調用遠程服務的服務消費方。 
Registry: 服務註冊與發現的註冊中心。 
Monitor: 統計服務的調用次數和調用時間的監控中心。

調用流程 
0.服務容器負責啓動,加載,運行服務提供者。 
1.服務提供者在啓動時,向註冊中心註冊自己提供的服務。 
2.服務消費者在啓動時,向註冊中心訂閱自己所需的服務。 
3.註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。 
4.服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。 
5.服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心

zookeeper 作爲註冊中心,服務器和客戶端都要訪問,如果有大量的併發,肯定會有等
待。所以可以通過zookeeper 集羣解決。
瞭解Leader 選舉
Zookeeper 的啓動過程中leader 選舉是非常重要而且最複雜的一個環節。那麼什麼是
leader 選舉呢?zookeeper 爲什麼需要leader 選舉呢?zookeeper 的leader 選舉的過程又是什
麼樣子的?
首先我們來看看什麼是leader 選舉。其實這個很好理解,leader 選舉就像總統選舉一樣,
每人一票,獲得多數票的人就當選爲總統了。在zookeeper 集羣中也是一樣,每個節點都會
投票,如果某個節點獲得超過半數以上的節點的投票,則該節點就是leader 節點了。
以一個簡單的例子來說明整個選舉的過程.
假設有五臺服務器組成的zookeeper 集羣,它們的id 從1-5,同時它們都是最新啓動的,也
就是沒有歷史數據,在存放數據量這一點上,都是一樣的.假設這些服務器依序啓動,來看看會
發生什麼。
1) 服務器1 啓動,此時只有它一臺服務器啓動了,它發出去的報沒有任何響應,所以它的
選舉狀態一直是LOOKING 狀態
2) 服務器2 啓動,它與最開始啓動的服務器1 進行通信,互相交換自己的選舉結果,由於
兩者都沒有歷史數據,所以id 值較大的服務器2 勝出,但是由於沒有達到超過半數以上的服務
器都同意選舉它(這個例子中的半數以上是3),所以服務器1,2 還是繼續保持LOOKING 狀態.
3) 服務器3 啓動,根據前面的理論分析,服務器3 成爲服務器1,2,3 中的老大,而與上面不
同的是,此時有三臺服務器選舉了它,所以它成爲了這次選舉的leader.
4) 服務器4 啓動,根據前面的分析,理論上服務器4 應該是服務器1,2,3,4 中最大的,但是
由於前面已經有半數以上的服務器選舉了服務器3,所以它只能接收當小弟的命了.
5) 服務器5 啓動,同4 一樣,當小弟

Dubbox 連接zookeeper 集羣

<!-- 指定註冊中心地址-->
<dubbo:registry
protocol="zookeeper"
address="192.168.25.135:2181,192.168.25.135:2182,192.168.25.135:2183">
</dubbo:registry>

zookeeper負載均衡

在集羣負載均衡時,Dubbo 提供了多種均衡策略,缺省爲 random 隨機調用

可以自行擴展負載均衡策略,參見:負載均衡擴展

負載均衡策略

Random LoadBalance

  • 隨機,按權重設置隨機概率。
  • 在一個截面上碰撞的概率高,但調用量越大分佈越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。

RoundRobin LoadBalance

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

LeastActive LoadBalance

  • 最少活躍調用數,相同活躍數的隨機,活躍數指調用前後計數差。
  • 使慢的提供者收到更少請求,因爲越慢的提供者的調用前後計數差會越大。

ConsistentHash LoadBalance

  • 一致性 Hash,相同參數的請求總是發到同一提供者。
  • 當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。
  • 算法參見:http://en.wikipedia.org/wiki/Consistent_hashing
  • 缺省只對第一個參數 Hash,如果要修改,請配置 <dubbo:parameter key="hash.arguments" value="0,1" />
  • 缺省用 160 份虛擬節點,如果要修改,請配置 <dubbo:parameter key="hash.nodes" value="320" />

配置

服務端服務級別

<dubbo:service interface="..." loadbalance="roundrobin" />

客戶端服務級別

<dubbo:reference interface="..." loadbalance="roundrobin" />

服務端方法級別

<dubbo:service interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>

客戶端方法級別

<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>


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