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

前面咱们已经看过了dubbo的服务引入以及服务导出的源码,下面我来看一下dubbo的集群容错的源码html

1、相关组件关系apache

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

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

 

 

 

 

 能够看到这个doJoin是一个模板方法安全

 

 

 这里其实很简单只是简单的建立了一个ClusterInvoker服务器

 

 

 

 二、Invoker负载均衡

 

 

 

 

 

 

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

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

 

 

 从上图咱们能够发现这里主要作几件事:ui

  一、经过方法名称获取重试次数spa

  二、遍历重试次数并作负载均衡

  三、发起调用

 

 

 

三、LoadBalance

 

 

 

 

 

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

 

 

 实现思路就是全部invoker的权重是否相同,若是相同则随机选一个invoker

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

四、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协议也就是在这里建立的
五、信息缓存组件Directory
主要用于缓存当前能够被调用的提供者列表信息。咱们在消费者进行调用时都会经过这个接口来获取全部的提供者列表,再进行后续处理

 

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

 

 

 

 那么Directory是何时产生的呢?咱们能够回想一下服务引用的时候是否是也见过RegistryDirectory呢?下面再看一下代码法

 

 

 

 是否是很熟悉啊

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

相关文章
相关标签/搜索