Failsafe调用时如果出现异常,则会直接忽略,实现也很简单,流程如下:
1.校验传入的参数,校验从AbstractClusterInvoker传入的Invoker列表是否为空
2.负载均衡。调用select方法做负载均衡,得到要调用的节点
3.远程调用。在try代码块中调用invoker#invoke方法做远程调用,catch到任何异常都直接吞掉,返回一个空的结果集
failsafe调用源码:
public Result doInvoke(Invocation invocation,List<Invoker<T>> invokers,LoadBalance loadbalance){
try{
//校验传入参数
checkInvokers(invokers,invocation);
//做负载均衡
Invoker<T> invoker = select(loadbalance,invocation,invokers,null);
//进行远程调用,如果成功则返回
return invoker.invoke(invocation);
}catch(Throwable e){
...
//捕获到异常,直接返回一个空的结果集
return new RpcResult();
}
}