dubbo源码解析-集群容错架构设计
开始之前先来一波概念:
上图为官网的架构图,它是从设计的角度而非使用角度画出,但是其中的Directory、Router、LoadBalance这三个关键词标注重点
进入代理类的Invoker方法中 ,
边看时序图,边走着代码,现在执行序列图的①,到达MockClusterInvoker,执行invoke
就要开始进入到集群,也就是Cluster
,我们看到前面说的三个关键字之一的Directory。
紧接着到了
AbstractDirectory ③
methodInvokerMap很重要,此时代码从methodInvokerMap中取出invokers 如图:
将invokers返回后(序号5),下面来到了第二个关键词,Router
,开始进入路由,现在我们到了序号6,此时到了MockInvokersSelector
类,不要看类名和Router
没有关系,其实他是Router
接口的实现类,从官网的介绍图中我们也可以看到Router
分为Script
和Condition
两种,翻译过来也就是脚本路由
和条件路由
从getNormalInvokers
就可以得知,他是要拿到能正常执行的invokers
,并将其返回.也就是序号7
此时我们再次回到了AbstractClusterInvoker
这个类:
以上过程中完成了哪些内容?
1.在Directory中找出本次集群中全部的invokers;
2.在Router中将上一步的全部invokers挑选出能正常执行的invokers返回;
对应序列图中的⑤和⑦。
思考:如果挑选出来的invokers,到底执行哪一个呢?继续往下看吧
是否看到LoadBalance关键词了呢?⑧
时刻跟着序列图走!!!
如果你配置的是Failfast Cluster(快速失败)
,Failsafe Cluster(失败安全)
,Failback Cluster(失败自动恢复)
,Forking Cluster(并行调用多个服务器,只要一个成功即返回)
,Broadcast Cluster(广播调用所有提供者,逐个调用,任意一台报错则报错)
他也会到达相应的类
调到关键字loadBalance 11
此时loadbalance决定执行那个invokers 13Invoker,get();
完!
思考答疑:
dubbo究竟做了什么。哪些事?
①在Directory中找出本次集群中的全部invokers;
②在router中,将上一步的全部invokers筛选出能正常执行的invokers;
③在loadBalance中,将上一步能正常执行的invokers根据配置的负载均衡策略,挑选出需要执行的Invoker;
下图对应到序列图的⑧