Router服务路由, 根据路由规则从多个Invoker中选出一个子集AbstractDirectory是所有目录服务实现的上层抽象, 它在list列举出所有invokers后,会在通过Router服务进行路由过滤。
Router
在应用隔离
,读写分离
,灰度发布中都发挥作用。
灰度发布
概念:
灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
灰度期:灰度发布开始到结束期间的这一段时间,称为灰度期。
过程:
1.首先在192.168.22.58
和192.168.22.59
两台机器上启动Provider
,然后启动Consumer
2.假设我们要升级192.168.22.58
服务器上的服务,接着我们去dubbo的控制台配置路由,切断192.168.22.58
的流量,配置完成并且启动之后,就看到此时只调用192.168.22.59
的服务
3.假设此时你在192.168.22.58
服务器升级服务,升级完成后再次将启动服务.
4.由于服务已经升级完成,那么我们此时我们要把刚才的禁用路由取消点,于是点了禁用
,但是此时dubbo的这个管理平台就出现了bug
惊奇的发现点了禁用
,数据就变两条了,继续点禁用
,还是两条,而且删除还删除不了,但是一直删不了也不是办法,解决办法也是有的,那就是去zookeeper上删除节点,然后刷新控制台的界面,如下图那么就只剩下一条了
6.那么此时我们再看控制台的输出,已经恢复正常,整个灰度发布流程结束
首先还是上图:
三个实现类,分别是ConditionRouter
,MockInvokersSelector
,ScriptRouter。
ConditionRouter:
条件路由主要就是根据dubbo管理控制台配置的路由规则来过滤相关的invoker
,当我们对路由规则点击启用
的时候,就会触发RegistryDirectory
类的notify
方法。条件路由有一个特点,就是他的getUrl
是有值的
思考 :为什么这个notify
方法传入的是List
呢?
所有配置最终都将转换为 URL 表示,并由服务提供方生成,经注册中心传递给消费方,各属性对应 URL 的参数,参见配置项一览表中的 "对应URL参数" 列
因为我们在管理后台配置了禁用192.168.56.2
,所以最后添加进invokers
的就只有192.168.56.3