一. 概述
版本:2.7.8
服务提供端因为网络或其它原因导致调用不成功后消费端的处理逻辑
二. Dubbo集群容错模式
Failover Cluster:失败重试
- 当服务消费方调用服务提供者失败后,会自动切换到其他服务提供者服务器进行重试。
- 使用<dubbo:reference retries=“2”/>来进行接口级别的重试次数(一共调用三次)
Failfast Cluster:快速失败
- 当服务消费方调用服务提供者失败后,立即报错,也就是只调用一次。
Failsafe Cluster:安全失败
- 当服务消费者调用服务出现异常时,直接忽略异常。这种模式通常用于写入审计日志等操作。
Failback Cluster:失败自动恢复
- 当服务消费端调用服务出现异常后,在后台记录失败的请求,并按照一定的策略后期再进行重试。这种模式通常用于消息通知操作。
Forking Cluster:并行调用
- 当消费方调用一个接口方法后,Dubbo Client会并行调用多个服务提供者的服务,只要其中有一个成功即返回。
Broadcast Cluster:广播调用
- 当消费者调用一个接口方法后,Dubbo Client会逐个调用所有服务提供者,任意一台服务器调用异常则这次调用就标志失败。
- 这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。
三. Cluster接口及实现类结构图
四. 源码解析
1. 接口Cluster
package org.apache.dubbo.rpc.cluster;
@SPI(Cluster.DEFAULT)
public interface Cluster {
String DEFAULT = FailoverCluster.NAME;
@Adaptive
<T> Invoker<T> join(Directory<T> directory) throws RpcException;
static Cluster getCluster(String name) {
return getCluster(name, true);
}
static Cluster getCluster(String name, boolean wrap) {
if (StringUtils.isEmpty(name)) {
name = Cluster.DEFAULT;
}
return ExtensionLoader.getExtensionLoader(Cluster.class).getExtension(name, wrap);
}
}
2. AbstractCluster抽象类
- 使用模板模式执行公共业务,创建拦截器
- 各个实现类实现抽象方法(doJoin)
package org.apache.dubbo.rpc.cluster.support.wrapper;
public abstract class AbstractCluster