上篇文章介绍了服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。Dubbo 目前提供了三种服务路由实现,分别为条件路由 ConditionRouter、脚本路由 ScriptRouter 和标签路由 TagRouter
如图所示,经过Router过滤后的Invoker列表实际是Directory中Invoker列表的子集,起到过滤的作用
本文目的不在于分析Router实现的原理,个人认为学会Router路由规则的使用对实际工作更加有效果。本文会结合Dubbo keeper和实际例子来说明Router路由规则中条件路由和脚本路由的使用
插播我自己瞎想面试题
- 如何屏蔽掉部分提供者或者消费者?
- 如何在Dubbo中实现读写分离(读写接口调用不同机器)?
希望读者能有目的性的去看文章
条件路由ConditionRouter
什么是条件路由
条件路由即基于条件表达式的路由规则,如:host = 10.20.153.10 => host = 10.20.153.11
什么意思呢?
- => 之前的为消费者匹配条件,所有参数和消费者的 URL 进行对比,当消费者满足匹配条件时,对该消费者执行后面的过滤规则。
- => 之后为提供者地址列表的过滤条件,所有参数和提供者的 URL 进行对比,消费者最终只拿到过滤后的地址列表。
- 如果匹配条件为空,表示对所有消费方应用,如:=> host != 10.20.153.11
- 如果过滤条件为空,表示禁止访问,如:host = 10.20.153.10 =>
所以上面条件路由例子的意思就是:所有消费者ip为10.20.153.10的请求全部交由ip为10.20.153.11的提供者处理
更多的规则说明可以参考Dubbo官方文档之路由规则
下面结合Dubbo keeper运维平台来说明条件路由规则使用,首先定义如下接口,就是简单三个方法,