三、dubbo的集群容错源码剖析

时间:2020-10-11 15:30:00 来源:互联网 作者: 神秘的大神 字体:

前面我们已经看过了dubbo的<span style="color: rgba(0, 0, 255, 1)">服务</span>引入以及<span style="color: rgba(0, 0, 255, 1)">服务导出</span>的源码,下面我来看一下dubbo的集群容错的源码

一、相关组件关系

dubbo中的集群容错方式说明:

Failover Cluster - 失败自动切换 失败时会重试其它服务器
Failfast Cluster - 快速失败 请求失败后快速返回异常结果 不重试
Failsafe Cluster - 失败安全 出现异常 直接忽略 会对请求做负载均衡
Failback Cluster - 失败自动恢复 请求失败后 会自动记录请求到失败队列中
Forking Cluster - 并行调用多个服务提供者 其中有一个返回 则立即返回结果
二、相关组件源码剖析
1、Cluster以及他的默认实现类
 

 

 

 

 

 可以看到这个doJoin是一个模板方法

 

 

 这里其实很简单只是简单的创建了一个ClusterInvoker

 

 

 

 2、Invoker

 

 

 

 

 

 

 这里可以看到invoke主要是从directory中获取invokerList以及获取负载均衡器,并将调用委派给子类

下面我们再看一下org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke的具体实现

 

 

 从上图我们可以发现这里主要做几件事:

  1、通过方法名称获取重试次数

  2、遍历重试次数并做负载均衡

  3、发起调用

 

 

 

3、LoadBalance

 

 

 

 

 

 这里又是一个模板方法我们来看一下他的默认实现类org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance的doSelect

 

 

 实现思路就是所有invoker的权重是否相同,如果相同则随机选一个invoker

否则把所有invoker的权重总和加起来,然后再[0,total]中产生一个随机数,找到第一个匹配到这个随机数的invoker

4、Invoker的执行逻辑

org.apache.dubbo.rpc.protocol.AbstractInvoker#invoke

 

 

 

 

 

 这里主要使用org.apache.dubbo.remoting.exchange.ExchangeClient发送请求

 

 

 

 

 

 

 

 

 

 

 

 最终会交给org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeChannel#request执行

 

 

这里的 Channle 对象是通过Transporter 这个SPI进行创建的,netty协议也就是在这里创建的
5、信息缓存组件Directory
主要用于缓存当前可以被调用的提供者列表信息。我们在消费者进行调用时都会通过这个接口来获取所有的提供者列表,再进行后续处理

 

 AbstractDirectory是Directory 中有一个基础的实现类,主要是对一些通用的方法封装,主要还是依靠子类真正的实现。

 

 

 

 那么Directory是什么时候产生的呢?我们可以回想一下服务引用的时候是不是也见过RegistryDirectory呢?下面再看一下代码法

 

 

 

 是不是很熟悉啊

好了,到这里我们的集群容错机制的源码基本就完事了