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 RpcException{

        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" />  服務消費方

發佈了69 篇原創文章 · 獲贊 99 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章