為了避免單點故障,一般會在多臺機器上部署多個服務好乐,客戶端可以訪問任何一臺機器,當調(diào)用服務失敗回官,客戶端也會有多種選擇曹宴,是拋出異常,還是重試等歉提。
集群容錯涉及到上述兩個方面:
- 選擇合適的服務調(diào)用笛坦;
- 對服務調(diào)用失敗做出后續(xù)處理。
dubbo的集群容錯功能實現(xiàn)是在cluster路由層實現(xiàn)的苔巨。Cluster層將多個服務提供者合并為一個Cluster Invoker版扩,并將Cluster Invoker暴露給客戶端;客戶端調(diào)用時侄泽,該Invoker從Directory中找到所有可用服務的Invoker列表(Invoker可以認為是遠程服務提供者礁芦,Directory記錄了所有可用的遠程服務列表),后根據(jù)路由規(guī)則、負載均衡選擇一個合適的Invoker調(diào)用柿扣。
合并為一個Cluster Invoker流程圖如下:
客戶端調(diào)用遠程服務的流程如下:
集群容錯方案在Cluster Invoker中實現(xiàn)的肖方。
Cluster層主要有兩個接口:Cluster和Invoker。
Cluster接口的實現(xiàn)類有很多未状,這些實現(xiàn)類完成了第一個圖的藍色方塊功能:
- mock=org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterWrapper
- failover=org.apache.dubbo.rpc.cluster.support.FailoverCluster
- failfast=org.apache.dubbo.rpc.cluster.support.FailfastCluster
- failsafe=org.apache.dubbo.rpc.cluster.support.FailsafeCluster
- failback=org.apache.dubbo.rpc.cluster.support.FailbackCluster
- forking=org.apache.dubbo.rpc.cluster.support.ForkingCluster
- available=org.apache.dubbo.rpc.cluster.support.AvailableCluster
- mergeable=org.apache.dubbo.rpc.cluster.support.MergeableCluster
- broadcast=org.apache.dubbo.rpc.cluster.support.BroadcastCluster
- zone-aware=org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster
這些實現(xiàn)類都比較簡單俯画,例如:
public class FailsafeCluster extends AbstractCluster {
public final static String NAME = "failsafe";
public <T> AbstractClusterInvoker<T> doJoin(Directory<T> directory) throws RpcException {
return new FailsafeClusterInvoker<>(directory);
}
}
作用主要是創(chuàng)建Cluster Invoker對象,也就是Invoker接口的實現(xiàn)司草。Cluster Invoker對象是最終暴露給客戶端的艰垂。抽象類AbstractCluster使用ClusterInterceptor攔截器對doJoin方法返回的對象Cluster Invoker封裝。