前面我们已经看过了dubbo的服务引入以及服务导出的源码,下面我来看一下dubbo的集群容错的源码
一、相关组件关系
dubbo中的集群容错方式说明:
![](https://img2020.cnblogs.com/blog/1033661/202010/1033661-20201011160501597-588462643.png)
可以看到这个doJoin是一个模板方法
这里其实很简单只是简单的创建了一个ClusterInvoker
2、Invoker
这里可以看到invoke主要是从directory中获取invokerList以及获取负载均衡器,并将调用委派给子类
下面我们再看一下org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke的具体实现
从上图我们可以发现这里主要做几件事:
1、通过方法名称获取重试次数
2、遍历重试次数并做负载均衡
3、发起调用
这里又是一个模板方法我们来看一下他的默认实现类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执行
![](https://img2020.cnblogs.com/blog/1033661/202010/1033661-20201011171725116-1189719703.png)
AbstractDirectory是Directory 中有一个基础的实现类,主要是对一些通用的方法封装,主要还是依靠子类真正的实现。
![](https://img2020.cnblogs.com/blog/1033661/202010/1033661-20201011172027961-146200463.png)
那么Directory是什么时候产生的呢?我们可以回想一下服务引用的时候是不是也见过RegistryDirectory呢?下面再看一下代码法
是不是很熟悉啊
好了,到这里我们的集群容错机制的源码基本就完事了