Dubbo 路由规则之条件路由
前言
大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 路由规则之条件路由。在前一个章节中我们介绍了 Dubbo 令牌验证和优雅停机,以及我们也例举了常见的使用场景并且进行了源码解析来分析其实现原理,同时知道 Dubbo 中的令牌验证核心思想就是通过服务提供端提供的token
或者随机产生的token
放入注册中心进行管理,然后服务消费端获取token
令牌并且在调用服务提供端时携带 token
,服务提供端根据消费端携带的token
进行验证。有的小伙伴可能会想:我们多个服务提供者能否通过一定的规则对调用的服务提供者进行过滤和限制呢?那接下来我们就围绕着这个问题一起来学习下 Dubbo 中的路由规则。下面就让我们快速开始吧!
1. 条件路由简介
首先我们得了解什么是路由规则?假设有这样一个场景如下图所示:
上图中我们可以看到有两个机房分别是机房A、机房B,其中机房A只能访问到 Service A 和 Service B ,而机房B 只能访问到 Service C 和 Service D。要实现上面这种场景我们就需要用到所谓的路由规则。路由规则是在发起一次RPC调用前过滤目标服务器地址,而过滤后的地址列表,将作为消费端最终发起RPC调用的备选地址。在 Dubbo 中支持两种路由规则今天我们主要讨论条件路由。
- 条件路由:支持以接口服务或消费者应用为粒度配置路由规则。
2. 使用方式
下面我们简单的讨论下条件路由使用方式:
条件路由
-
接口服务粒度
# demo-consumer1 的消费者只能消费所有端口为20880的服务实例 # demo-consumer2 的消费者只能消费所有端口为20881的服务实例 --- scope: application #应用粒度 force: true runtime: true enabled: true key: demo-provider conditions: - application=demo-consumer1 => address=*:20880 - application=demo-consumer2 => address=*:20881
-
应用粒度
# BookFacade 的 queryAll 方法只能消费所有端口为20880的服务实例 # BookFacade 的 queryByName 方法只能消费所有端口为20881的服务实例 --- scope: service #服务粒度 force: true runtime: true enabled: true key: com.muke.dubbocourse.common.api.BookFacade conditions: - method=queryAll => address=*:20880 - method=queryByName => address=*:20881
-
字段说明:
编号 字段名称 说明 必填 1 scope 路由规则的作用粒度,scope的取值会决定key的取值。
service 服务粒度 application 应用粒度。必填 2 Key 明确规则体作用在哪个接口服务或应用。 scope=service时,
key取值为[{group}:]{service}[:{version}]的组合 scope=application时,
key取值为application名称 。必填 3 enabled enabled=true
当前路由规则是否生效,,缺省生效。可不填 4 force force=false
当路由结果为空时,是否强制执行,如果不强制执行,
路由结果为空的路由规则将自动失效,缺省为false
。可不填 5 runtime runtime=false
是否在每次调用时执行路由规则,
否则只在提供者地址列表变更时预先执行并缓存结果,
调用时直接从缓存中获取路由结果。如果用了参数路由,必须设为true
,
需要注意设置会影响调用的性能,缺省为false
。可不填 6 priority priority=1
路由规则的优先级,用于排序,优先级越大越靠前执行,缺省为0
。可不填 7 conditions 定义具体的路由规则内容。 必填 -
Conditions规则体
格式:
=>
之前的为消费者匹配条件,所有参数和消费者的 URL 进行对比,当消费者满足匹配条件时,对该消费者执行后面的过滤规则。=>
之后为提供者地址列表的过滤条件,所有参数和提供者的 URL 进行对比,消费者最终只拿到过滤后的地址列表。- 如果匹配条件为空,表示对所有消费方应用,如:
=> host != 192.168.53.11
- 如果过滤条件为空,表示禁止访问,如:
host = 192.168.53.10 =>
表达式:
参数支持:
- 服务调用信息,如:method, argument 等,暂不支持参数路由
- URL 本身的字段,如:protocol, host, port 等
- 以及 URL 上的所有参数,如:application, organization 等
条件支持:
- 等号
=
表示"匹配",如:host = 192.168.53.10
- 不等号
!=
表示"不匹配",如:host != 192.168.53.10
值支持:
- 以逗号
,
分隔多个值,如:host != 192.168.53.10,192.168.53.11
- 以星号
*
结尾,表示通配,如:host != 10.20.*
- 以美元符
$
开头,表示引用消费者参数,如:host = $host
Tips:
conditions
部分是规则的主体,由1到任意多条规则组成,下面我们就每个规则的配置语法做详细说明:
3. 使用场景
从上面的简单介绍我们可以大致了解到,当我们消费对访问服务提供者时我们可以通过一定的规则对服务提供者列表进行过滤。那下面我们列举下工作中常使用的场景:
- 黑名单: 比如我们需要禁止某些服务消费者消费服务
host = 192.168.53.10,192.168.53.11 =>
上面配置表示禁止192.168.53.10
、192.168.53.11
消费者访问服务提供者。
- 服务寄宿在应用上,只暴露一部分的机器,防止整个集群挂掉
=> host = 192.168.53.1*,192.168.53.2*
上面配置表示只能放192.168.53.1*
、192.168.53.2
ip 地址开头的服务提供者。
- 读写分离:读取数据和写入数据操作分开