前面我們已經看過了dubbo的服務引入以及服務匯出的原始碼,下面我來看一下dubbo的集群容錯的原始碼
一、相關組件關系

dubbo中的集群容錯方式說明:
Failover Cluster - 失敗自動切換 失敗時會重試其它服務器 Failfast Cluster - 快速失敗 請求失敗后快速回傳例外結果 不重試 Failsafe Cluster - 失敗安全 出現例外 直接忽略 會對請求做負載均衡 Failback Cluster - 失敗自動恢復 請求失敗后 會自動記錄請求到失敗佇列中 Forking Cluster - 并行呼叫多個服務提供者 其中有一個回傳 則立即回傳結果 二、相關組件原始碼剖析 1、Cluster以及他的默認實作類


可以看到這個doJoin是一個模板方法


這里其實很簡單只是簡單的創建了一個ClusterInvoker
2、Invoker





這里可以看到invoke主要是從directory中獲取invokerList以及獲取負載均衡器,并將呼叫委派給子類
下面我們再看一下org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke的具體實作
從上圖我們可以發現這里主要做幾件事:
1、通過方法名稱獲取重試次數
2、遍歷重試次數并做負載均衡
3、發起呼叫

3、LoadBalance


這里又是一個模板方法我們來看一下他的默認實作類org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance的doSelect

實作思路就是所有invoker的權重是否相同,如果相同則隨機選一個invoker
否則把所有invoker的權重總和加起來,然后再[0,total]中產生一個亂數,找到第一個匹配到這個亂數的invoker
4、Invoker的執行邏輯
org.apache.dubbo.rpc.protocol.AbstractInvoker#invoke



這里主要使用org.apache.dubbo.remoting.exchange.ExchangeClient發送請求




最侄訓交給org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeChannel#request執行

這里的 Channle 物件是通過Transporter 這個SPI進行創建的,netty協議也就是在這里創建的 5、資訊快取組件Directory 主要用于快取當前可以被呼叫的提供者串列資訊,我們在消費者進行呼叫時都會通過這個介面來獲取所有的提供者串列,再進行后續處理
AbstractDirectory是Directory 中有一個基礎的實作類,主要是對一些通用的方法封裝,主要還是依靠子類真正的實作,


那么Directory是什么時候產生的呢?我們可以回想一下服務參考的時候是不是也見過RegistryDirectory呢?下面再看一下代碼法

是不是很熟悉啊
好了,到這里我們的集群容錯機制的原始碼基本就完事了
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/167853.html
標籤:架構設計
