前面我们已经看过了dubbo的服务引入以及服务导出的源码,下面我来看一下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呢?下面再看一下代码法

是不是很熟悉啊
好了,到这里我们的集群容错机制的源码基本就完事了
原文转载:http://www.shaoqun.com/a/480925.html
赛兔:https://www.ikjzd.com/w/2375
慧聪集团:https://www.ikjzd.com/w/1836
聚贸:https://www.ikjzd.com/w/1305
前面我们已经看过了dubbo的服务引入以及服务导出的源码,下面我来看一下dubbo的集群容错的源码一、相关组件关系dubbo中的集群容错方式说明:FailoverCluster-失败自动切换失败时会重试其它服务器FailfastCluster-快速失败请求失败后快速返回异常结果不重试FailsafeCluster-失败安全出现异常直接忽略会对请求做负载均衡FailbackCluster-失败自动恢
coles:https://www.ikjzd.com/w/2506
barclays:https://www.ikjzd.com/w/2775
亚马逊的Listing如何在谷歌搜索引擎获得排名?:https://www.ikjzd.com/home/17120
除了6月1日儿童节,其他国家还有这些孩子的节日!:https://www.ikjzd.com/home/96241
站外烧钱转化率又低怎么办?:https://www.ikjzd.com/home/123654
没有评论:
发表评论
注意:只有此博客的成员才能发布评论。