简介
通常生产环境中服务消费方和服务提供方都是以集群模式部署的,服务消费者会根据一定的策略选择服务提供方集群中的某个实例进行调用。当调用失败时,Dubbo 提供了多种容错方案,缺省为 failover (失败重试)。
以下为Dubbo提供的集群容错模式
容错模式 | 描述 |
---|---|
Failover Cluster | 失败自动重试。当调用出现失败,会自动切换到其它服务提供者实例进行重试。通常用于幂等的操作,但重试会带来更长延迟。 该配置为缺省配置。 |
Failfast Cluster | 快速失败。只发起一次调用,失败立即报错。通常用于非幂等性的操作。 |
Failsafe Cluster | 安全失败。出现调用出现异常时,直接忽略异常。通常用于写入审计日志等操作。 |
Forking Cluster | 并行调用。并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的操作,但需要浪费更多服务资源。 |
Failback Cluster | 失败自动恢复。后台记录失败请求,定时重发。通常用于消息通知操作。 |
Broadcast Cluster | 广播调用。逐个调用所有提供者,任意一台报错则标志本次调用失败。通常用于通知所有提供者更新缓存或日志等本地资源信息。 |
配置示例
服务消费方和服务提供方共用配置
1 | arduino复制代码/** |
服务消费方配置
1 | ini复制代码@Reference(interfaceName = "com.xxx.XxxService", cluster = ForkingCluster.NAME) |
1 | ini复制代码<dubbo:reference cluster="failsafe" /> |
服务提供方配置
1 | java复制代码@Service(cluster = FailoverCluster.NAME) |
1 | ini复制代码<dubbo:service cluster="failsafe" /> |
源码分析
下面以Dubbo默认的集群容错模式FailoverCluster为例,分析集群容错模式的源码。实现失败自动重试的是FailoverClusterInvoker类。
org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker
1 | ini复制代码public Result doInvoke(Invocation invocation, final List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException { |
校验服务提供者是否为空,如果为空则抛出异常
1 | typescript复制代码protected void checkInvokers(List<Invoker<T>> invokers, Invocation invocation) { |
自定义集群容错模式
Dubbo内置了丰富的集群容错模式,如果在实际开发中,开发者有更个性化的的使用需求,那么也可以根据org.apache.dubbo.rpc.cluster.Cluster扩展接口进行自定义实现。
1 | swift复制代码/** |
步骤
1.定义扩展接口Cluster的自定义实现类
1 | java复制代码public class CustomCluster implements Cluster { |
2.结合AbstractClusterInvoker,编写ClusterInvoker
1 | scala复制代码public class CustomClusterInvoker <T> extends AbstractClusterInvoker<T> { |
3.在META-INF/dubbo文件夹下,编写名称为扩展接口全路径的文件org.apache.dubbo.rpc.cluster.Cluster,内容如下
1 | ini复制代码custom=com.xxx.cluster.CustomCluster |
4.消费方配置
1 | ini复制代码@Reference(interfaceName = "com.xxx.XxxService", cluster = CustomCluster.NAME) |
本文转载自: 掘金