开始之前先来一波概念:

上图为官网的架构图,它是从设计的角度而非使用角度画出,但是其中的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;
下图对应到序列图的⑧
