自定义dubbo集群,可以更加贴近业务的来处理服务容错的机制,自定义一些容错机制来处理特殊的业务
1. 集群定义
集群(`Cluster`)是 Dubbo 中的服务容错组件,它的主要作用是将多个服务提供方封装为一个集群,并在调用过程中处理容错逻辑,如服务调用失败之后采用怎样的策略处理。
2. 集群工作流程
1. 服务启动时,由 `Cluster` 创建 `ClusterInvoker`;
2. 在服务调用过程中,由 `ClusterInvoker` 处理调用逻辑,如查找可用的 `Invoker` 、使用负载均衡器选择 `Invoker` 、发起远程调用以及处理调用出错时的逻辑等。因此,要自定义实现 `Cluster` 容错策略,关键点是要扩展 `Cluster` 和 `ClusterInvoker`。
3. demo
/**
* @Description TODO
* @Author roy.ding
* @Date 2022/10/1 18:37:36
*/
public class MyCluster implements Cluster {
public final static String NAME = "myCluster";
@Override
public <T> Invoker<T> join(Directory<T> directory) throws RpcException {
return new MyClusterInvoker<>(directory);
}
}
配置myCluster SPI文件
myCluster=com.roy.ext.MyCluster
public class MyClusterInvoker<T> extends AbstractClusterInvoker<T> {
public MyClusterInvoker(Directory<T> directory) {
super(directory);
}
public MyClusterInvoker(Directory<T> directory, URL url) {
super(directory, url);
}
@Override
protected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
//此处是调用远程服务的关键逻辑
//一般要做以下事情:
//1. 检查invokers的状态,如是否为空,是否可用
//2. 通过父类AbstractClusterInvoker的select方法,使用loadbalance,选择调用的Invoker
//3. 通过上一步选中的Invoker调用远程服务
//4. 在完成以上步骤的基础上,添加自己的容错逻辑,比如调用出错了是重试、是抛异常还是其他
//5. return 结果,一般为第三步的结果,或者出错后自定义的结果
//return null;
checkInvokers(invokers, invocation);
Invoker<T> invoker = select(loadbalance, invocation, invokers, null);
try {
return invoker.invoke(invocation);
} catch (Throwable e) {
throw new RpcException(e);
}
}
}