首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Dubbo源码解析——DIRECTORY和ROUTER

今天看一下Directory和Router。

这里我们之前说过了,根据扩展点,我们知道这里的protocol目前是RegistryProtocol,点进去:

这里的cluster同样是扩展点,点进去:

这里出现了第一个东西:DIRECTORY,这里会用cluster的join方法生成一个Invoker:Invoker invoker = cluster.join(directory);,这里的clusterdebug一下,是FailoverCluster,生成的就是FailoverClusterInvoker。这里我们都没有发现这个Directory的作用,先别急,我们至少知道了AbstractClusterInvoker中有一个Directory的实例。

再看我们的AbstractClusterInvoker的invoke方法,这是Dubbo所有集群invoker的入口:

这里有个list方法,返回的是invoker集合,doInvoke方法下沉到了子类,之前我们说过,这里会根据负载均衡策略选出一个invoker执行,那么我们看下list方法是如何选取invoker集合的:

点进去进入到AbstractDirectory的list方法:

继续看一下doList,这里同样下沉到子类,子类有两个,分别是:RegistryDirectory和StaticDirectory,这两个的区别我们别的文章再说,这里简单提一下:RegistryDirectory中的invoker集合是动态的(实现了NotifyListener接口),而StaticDirectory中的invoker集合是固定的。

那么StaticDirectory返回的集合就是固定的,而RegistryDirectory是动态的,我们在注册中心对invoker做改动,都会引起RegistryDirectory中invoker集合的变化。

这里我们大概就能理解这个Directory,实际上,这个东西就是Invoker的集合。

doList结束,下面就出现了我们说的Router,默认有三种实现:ConditionRouter、MockInvokersSelector(虽然叫Selector)和ScriptRouter。这篇文章先不具体展开讨论每种Router的实现方式。

router返回的并不是一个Invoker,而是invoker集合,我们可以认为,router的作用就是把Directory中符合路由规则的invoker筛选出来,然后在这些invoker中,根据负载均衡策略和集群容错策略执行invoke方法。

总结一下:

Director:invoker的集合,是AbstractClusterInvoker的属性,可以认为是本集群下的所有Invoker。

Router:从Directory中挑选出符合要求的Invoker集合。

LoadBalance:从Router挑选的invoker中再选出其中一个作为最终选择去执行invoke方法。

# directory # router

路由器

Jav

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180301A1I6ER00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券