前面咱们已经看过了dubbo的服务引入以及服务导出的源码,下面我来看一下dubbo的集群容错的源码html
1、相关组件关系apache
dubbo中的集群容错方式说明:缓存
能够看到这个doJoin是一个模板方法安全
这里其实很简单只是简单的建立了一个ClusterInvoker服务器
二、Invoker负载均衡
这里能够看到invoke主要是从directory中获取invokerList以及获取负载均衡器,并将调用委派给子类dom
下面咱们再看一下org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke的具体实现ide
从上图咱们能够发现这里主要作几件事:ui
一、经过方法名称获取重试次数spa
二、遍历重试次数并作负载均衡
三、发起调用
这里又是一个模板方法咱们来看一下他的默认实现类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执行
AbstractDirectory是Directory 中有一个基础的实现类,主要是对一些通用的方法封装,主要仍是依靠子类真正的实现。
那么Directory是何时产生的呢?咱们能够回想一下服务引用的时候是否是也见过RegistryDirectory呢?下面再看一下代码法
是否是很熟悉啊
好了,到这里咱们的集群容错机制的源码基本就完事了