14. Dubbo原理解析-叢集&容錯之Cluster
Dubbo作為一個分散式的服務治理框架,提供了叢集部署,路由,軟負載均衡及容錯機制
下圖描述了dubbo呼叫過程中的對於叢集,負載等的呼叫關係。
Cluster
將Directory中的多個Invoker偽裝成一個Invoker, 對上層透明,包含叢集的容錯機制
Cluster介面定義
@SPI(FailoverCluster.NAME)
public interface Cluster {
@Adaptive
<T> Invoker<T>join(Directory<T> directory) throws RpcException;
}
Cluster可以看做是工廠類, 將目錄directory下的invoker合併成一個統一的Invoker,根據不同叢集策略的Cluster建立不同的Invoker
我們來看下預設的失敗轉移,當出現失敗重試其他服務的策略, 這個Cluster實現很簡單就是建立FailoverCluseterInvoker物件
public class FailoverCluster implements Cluster {
public final static String NAME ="failover";
public<T> Invoker<T> join(Directory<T> directory)throws
return new FailoverClusterInvoker<T>(directory);
}
}
下圖展示了dubbo提供的所有叢集方案
1)AvailableCluster: 獲取可用的呼叫。遍歷所有Invokers判斷Invoker.isAvalible,只要一個有為true直接呼叫返回,不管成不成功
2)BroadcastCluster: 廣播呼叫。遍歷所有Invokers, 逐個呼叫每個呼叫catch住異常不影響其他invoker呼叫
3)FailbackCluster: 失敗自動恢復, 對於invoker呼叫失敗, 後臺記錄失敗請求,任務定時重發, 通常用於通知
4)FailfastCluster: 快速失敗,只發起一次呼叫,失敗立即保錯,通常用於非冪等性操作
5)FailoverCluster: 失敗轉移,當出現失敗,重試其它伺服器,通常用於讀操作,但重試會帶來更長延遲
(1) 目錄服務directory.list(invocation) 列出方法的所有可呼叫服務
獲取重試次數,預設重試兩次
(2) 根據LoadBalance負載策略選擇一個Invoker
(3) 執行invoker.invoke(invocation)呼叫
(4) 呼叫成功返回
呼叫失敗小於重試次數,重新執行從3)步驟開始執行
呼叫次數大於等於重試次數丟擲呼叫失敗異常
6)FailsafeCluster: 失敗安全,出現異常時,直接忽略,通常用於寫入審計日誌等操作。
7)ForkingCluster: 並行呼叫,只要一個成功即返回,通常用於實時性要求較高的操作,但需要浪費更多服務資源。
8) MergeableCluster: 分組聚合, 按組合並返回結果,比如選單服務,介面一樣,但有多種實現,用group區分,現在消費方需從每種group中呼叫一次返回結果,合併結果返回,這樣就可以實現聚合選單項。
這個還蠻有意思,我們分析下是如何實現的
(1) 根據MERGE_KEY從url獲取引數值
(2) 為空不需要merge, 正常呼叫
(3) 按group分組呼叫,將返回介面儲存到集合中
(4) 獲取MERGE_KEY如果是預設的話,獲取預設merge策略,主要根據返回型別判斷
(5) 如果不是,獲取自定義的merge策略
(6) Merge策略合併呼叫結果返回
9)MockClusterWrapper: 具備呼叫mock功能是其他Cluster包裝
獲取url的MOCK_KEY屬性
(1) 不存在直接呼叫其他cluster
(2) 存在值startsWith("force") 強制mock呼叫
(3) 存在值不是startsWith("force") 先正常呼叫, 出現異常在mock呼叫
叢集模式的配置
<dubbo:service cluster="failsafe" /> 服務提供方
<dubbo:reference cluster="failsafe" /> 服務消費方