(); RpcInternalContext.popContext(); } } 这个方法主要做了几件事: 包装request请求,设置必要的参数 调用FailOverCluster 的invoke方法,将reques请求发送出去,并得到response相应 包装response响应 我们在调用FailOverCluster的时候实际上是调用的父类AbstractCluster的invoker 方法,FailOverCluster关系图如下: 所以我们进入到AbstractCluster的invoker方法中: @Override public SofaResponse invoke consumerBootstrap.getCluster().sendMsg(providerInfo, sofaRequest); } consumerBootstrap.getCluster()会返回FailOverCluster
com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterWrapper failover=com.alibaba.dubbo.rpc.cluster.support.FailoverCluster FailoverCluster: 失败转移,当出现失败,重试其它服务器,通常用于读操作,但重试会带来更长延迟。 Dubbo中默认使用的是FailoverCluster策略,而在实际执行的过程中是FailoverCluster会被先被注入到MockClusterWrapper中,过程就是: Cluster$Adaptive -> 定位到内部key为failover的对象 ->FailoverCluster->注入到MockClusterWrapper MockClusterWrapper内部会创建一个MockClusterInvoker
} } try { // build cluster //默认是FailOverCluster RpcRuntimeContext.cacheConsumerConfig(this); return proxyIns; } } 这个方法里面除了做校验以外,主要做了如下几件事: 设置cluster属性,默认是FailOverCluster
org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterWrapper failover=org.apache.dubbo.rpc.cluster.support.FailoverCluster org.apache.dubbo.rpc.cluster.support.RegistryAwareCluster 1 2 3 4 5 6 7 8 9 10 理论上来说,Dubbo 的集群容错机制就有以上 10 种,且还可从 Cluster 接口上的 @SPI 可知,其默认的扩展类为 FailoverCluster @SPI(FailoverCluster.NAME) public interface Cluster { @Adaptive <T> Invoker<T> join(Directory
Cluster$Adaptive#join => MockClusterWrapper#join => return MockClusterInvoker(directory, FailoverCluster
FailoverCluster 这个是本篇的重点,也是dubbo里面容错方案的缺省值.让我们来看官网介绍 ❈ 失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。 答案也是很明显的,因为默认FailoverCluster会重试,如果是"写"类型的接口,如果在网络抖动情况下写入多个值,所以"写"类型的接口要换成FailfastCluster FailbackCluster
是FailoverCluster吗? 其实并不是的,实际应该为MockClusterWrapper(FailoverCluster)对象(在服务发布一节中已有相应的分析),有什么用,我们后面再分析,这里暂时不讨论。 MockClusterWrapper.join public <T> Invoker<T> join(Directory<T> directory) throws RpcException { // 这里的cluster是FailoverCluster return new MockClusterInvoker<T>(directory, this.cluster.join(directory)); } // FailoverCluster.join
这个主要用在 本地伪装上,让我们来看官网描述 本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败 同样我也用一个流程图来描述他的逻辑 FailoverCluster 答案也是很明显的,因为默认 FailoverCluster会重试,如果是"写"类型的接口,如果在网络抖动情况下写入多个值,所以"写"类型的接口要换成 FailfastCluster FailbackCluster
*分隔线*************/ 回到doRefer中的Cluster.join(directory),Cluster是一个集群容错接口,同时也是一个@Adaptive自适应扩展点,默认实现类是FailoverCluster.NAME Dubbo主要内置了如下几种策略:失败自动切换Failover、安全失败Failsafe、快速失败Failfast、失败自动恢复Failback、并行调用Forking、广播Broadcast @SPI(FailoverCluster.NAME Invoker<T> join(Directory<T> directory) throws RpcException; } 前面我们说过ExtensionLoader在实例化对象时,会将自己(这里是FailOverCluster
这里看下这两种容错机制的代码实现 1,failover容错机制 通过spi机制我们找到Cluster failover扩展FailoverCluster类是这样实现的 public class FailoverCluster
下面我们先说6种集群容错的实现方法: Failover Cluster: failover=org.apache.dubbo.rpc.cluster.support.FailoverCluster 失败自动切换 其默认实现是FailoverCluster.NAME,如下源码所示: 所以默认的实现方法就是: org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker FailoverCluster doInvoke源码解析 接下来我们就对FailoverClusterInvoker的doInvoke方法的源码进行解析。
com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterWrapper 2failover=com.alibaba.dubbo.rpc.cluster.support.FailoverCluster 9broadcast=com.alibaba.dubbo.rpc.cluster.support.BroadcastCluster 上述各种集群策略,对应的执行器为Cluser+Invoker,例如FailoverCluster FailoverCluster 策略:失败后自动选择其他服务提供者进行重试,重试次数由retries属性设置,< dubbo:reference retries = "2"/>设置,默认为2,代表重试2
下面我们先说6种集群容错的实现方法: Failover Cluster: failover=org.apache.dubbo.rpc.cluster.support.FailoverCluster 失败自动切换 其默认实现是FailoverCluster.NAME,如下源码所示: [1702f3c3a86c95df? FailoverCluster doInvoke源码解析 接下来我们就对FailoverClusterInvoker的doInvoke方法的源码进行解析。
); } Cluster : 根据Directory创建集群Invoker,通过directory/router获取invokers public class FailoverCluster
这里由于没配置路由规则,因此默认会走FailoverCluster实现。
bug分析 从异常堆栈能看出是抛出异常的是AvailableCluster,dubbo的cluster即集群容错机制,总结一下2.6.x中内置的集群容错机制 FailoverCluster: 失败自动切换
return new FailoverClusterInvoker<T>(directory); } join方法主要是初始化对应的路由信息,因为在配置文件中未配置所以进入了默认的路由规则实现 - FailoverCluster
IIS-ManagementService IIS-PowerShellProvider 通过WoW64 支持32位应用程序: ServerCore-WOW64 Additional WoW64 support: FailoverCluster-Core-WOW64
比如dubbo默认的集群策略failover类的实现 public class FailoverCluster implements Cluster { public final static
org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterWrapper failover=org.apache.dubbo.rpc.cluster.support.FailoverCluster