背景:
某个服务有2台机器,但是其中一台机器挂了,dubbo的重试还是会调用这台机器,经过查资料,推荐使用Failover机制;
过程:
经过跟踪源码,发现dubbo默认的容错机制就是使用了Failover,在执行调用前会直接进入FailoverClusterInvoker.class的doInvoke中,翻开源码:
public Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
List<Invoker<T>> copyinvokers = invokers;
this.checkInvokers(invokers, invocation);
int len = this.getUrl().getMethodParameter(invocation.getMethodName(), "retries", 2) + 1;
if (len <= 0) {
len = 1;
}
RpcException le = null;
List<Invoker<T>> invoked = new ArrayList(invokers.size());
//1.记录执行rpc方法失败的提供者,但是实际不作为下次选取服务提供者的参考
Set<String> providers = new HashSet(len);
for(int i = 0; i < len; ++i) {
//第一次选取提供端的时候,不进行检测
if (i > 0) {
this.checkWhetherDestroyed();
copyinvokers = this.list(in