如何自定义dubbo集群

223 阅读1分钟

自定义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);
        }
    }
}