Dubbo之Cluster集群容错

Dubbo版本

  1. Dubbo版本2.6.7

集群作用

  1. Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理。

  2. 集群模块(Cluster)是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是集群的作用。

  3. Dubbo集群层(Cluster层)的总体工作流程

    • 生成Invoker对象。
    • 筛选可用的服务列表。通过Directory#list获取所有可用的服务列表。根据不同的ClusterInvoker筛选出不同的Invoker对象,使用Router处理改服务列表,根据路由规则过滤服务列表,最终返回剩余的服务列表
    • 做负载均衡。筛选可用的服务列表后,通过不同的负载均衡策略选择出一个服务,然后调用
    • 做RPC调用。

    Cluster层流程

集群容错方式

  1. Dubbo提供的集群容错方式

    • Failover Cluster : 失败自动切换重试,当服务消费方调用服务提供者失败后,会自动切换到其他服务提供者服务器进行重试,这通常用于读操作或者具有幂等的写操作。需要注意的是,重试会带来更长延迟。可以通过retries="2"来设置重试次数,表示额外的重试2次
    • **Failfast Cluster **:快速失败,当服务消费方调用服务提供者失败后,立即报错,即只调用一次。通常,这种模式用于非幂等性的写操作。
    • Failsafe Cluster : 失败安全,当服务消费者调用服务出现异常时,直接忽略异常。这种模式一般用于写入日志等操作,即不关心失败
    • Failback Cluster: 失败自动恢复,当服务消费端调用服务出现异常后,在后台记录失败的请求,并按照一定的策略后期再进行重试。这种模式通常用于消息通知操作
    • Forking Cluster:并行调用多个服务提供者。当消费方调用一个接口方法后,消费者会并行调用多个服务提供者的服务,只要其中有一个成功即返回。这种模式通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过forks="4"来设置最大并行数
    • Broadcast Cluster:广播调用,当消费者调用一个接口方法后,Dubbo消费者会逐个调用所有服务提供者,任意一台服务器调用异常则这次调用就标志失败。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。由于是广播,所以不需要做负载均衡
    • Available Cluster:选择一个可以使用的服务提供者进行调用
    • Mergeable Cluster:依次调用所有invokers, 并通过使用一个merger进行结果合并处理以返回结果。

自定义集群容错策略

  1. 除了以上默认提供的容错方式,如果有定制化需求,可以根据Dubbo提供的扩展接口Cluster进行定制

  2. 实现Cluster接口

    package com.alibaba.dubbo.spi;
    
    import com.alibaba.dubbo.rpc.Invoker;
    import com.alibaba.dubbo.rpc.RpcException;
    import com.alibaba.dubbo.rpc.cluster.Cluster;
    import com.alibaba.dubbo.rpc.cluster.Directory;
    
    public class LogCluster implements Cluster {
        @Override
        public <T> Invoker<T> join(Directory<T> directory) throws RpcException {
            return new LogClusterInvoker<>(directory);
        }
    }
  3. 创建LogClusterInvoker

    public class LogClusterInvoker<T> extends AbstractClusterInvoker<T> {
        private static final Logger logger = LoggerFactory.getLogger(LogClusterInvoker.class);
    
        public LogClusterInvoker(Directory<T> directory) {
            super(directory);
        }
    
        @Override
        protected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers,
                                  LoadBalance loadbalance) throws RpcException {
    
            checkInvokers(invokers, invocation);
            //使用负载均衡策略选择一个服务提供者
            Invoker<T> invoker = select(loadbalance, invocation, invokers, null);
            logger.info(String.format("methodName:%s,url:%s,attachments:%s",
                    invocation.getMethodName(), invoker.getUrl(), invocation.getAttachments()));
            try {
                //执行远程调用
    
                Result result = invoker.invoke(invocation);
                logger.info(String.format("result:%s,attachments:%s", result.getValue(), result.getAttachments()));
                return result;
            } catch (Throwable e) {
                if (e instanceof RpcException && ((RpcException) e).isBiz()) {
                    throw (RpcException) e;
                }
                throw new RpcException(e);
            }
        }
    }
  4. src/main/resources/META-INF/dubbo目录下创建com.alibaba.dubbo.rpc.cluster.Cluster文件,内容如下

    log=com.alibaba.dubbo.spi.LogCluster
  5. 在Consumer端配置

    <dubbo:reference id="demoService" check="false" interface="
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值