Dubbo作為1個散布式的服務治理框架,提供了集群部署,路由,軟負載均衡及容錯機制
下圖描寫了dubbo調用進程中的對集群,負載等的調用關系。
將Directory中的多個Invoker假裝成1個Invoker, 對上層透明,包括集群的容錯機制
Cluster接口定義
@SPI(FailoverCluster.NAME)
public interface Cluster {
@Adaptive
<T> Invoker<T>join(Directory<T> directory) throws RpcException;
}
Cluster可以看作是工廠類, 將目錄directory下的invoker合并成1個統1的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,只要1個有為true直接調用返回,不管成不成功
2)BroadcastCluster: 廣播調用。遍歷所有Invokers, 逐一調用每一個調用catch住異常不影響其他invoker調用
3)FailbackCluster: 失敗自動恢復, 對invoker調用失敗, 后臺記錄失敗要求,任務定時重發, 通經常使用于通知
4)FailfastCluster: 快速失敗,只發起1次調用,失敗立即保錯,通經常使用于非冪等性操作
5)FailoverCluster: 失敗轉移,當出現失敗,重試其它服務器,通經常使用于讀操作,但重試會帶來更長延遲
(1) 目錄服務directory.list(invocation) 列出方法的所有可調用服務
獲得重試次數,默許重試兩次
(2) 根據LoadBalance負載策略選擇1個Invoker
(3) 履行invoker.invoke(invocation)調用
(4) 調用成功返回
調用失敗小于重試次數,重新履行從3)步驟開始履行
調用次數大于等于重試次數拋出調用失敗異常
6)FailsafeCluster: 失敗安全,出現異常時,直接疏忽,通經常使用于寫入審計日志等操作。
7)ForkingCluster: 并行調用,只要1個成功即返回,通經常使用于實時性要求較高的操作,但需要浪費更多服務資源。
8) MergeableCluster: 分組聚合, 按組合并返回結果,比如菜單服務,接口1樣,但有多種實現,用group辨別,現在消費方需從每種group中調用1次返回結果,合并結果返回,這樣就能夠實現聚合菜單項。
這個還蠻成心思,我們分析下是如何實現的
(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" /> 服務消費方