条件路由规则
条件路由规则将满足特定条件的请求转发到目标实例的子集。规则匹配传入流量的请求参数,满足匹配条件的请求将被转发到包含特定实例地址列表的子集。
以下是一个条件路由规则的示例。
根据以下示例规则,org.apache.dubbo.samples.CommentService
服务中 getComment
方法的所有调用将被转发到标记为 region=Hangzhou
的地址子集。
configVersion: v3.0
scope: service
force: true
runtime: true
enabled: true
key: org.apache.dubbo.samples.CommentService
conditions:
- method=getComment => region=Hangzhou
您可以参考条件路由的特定示例代码 这里。
ConditionRule
条件路由规则的主体定义了路由规则将生效的目标服务或应用程序、流量过滤条件以及特定场景下的行为。
字段 | 类型 | 描述 | 必需 |
---|---|---|---|
configVersion | string | 条件规则定义的版本,当前可用版本为 v3.0 | 是 |
scope | string | 支持 service 和 application 范围规则。 | 是 |
key | string | 此规则将应用于的目标服务或应用程序的标识符。 - 如果设置了 scope:service ,则 key 应指定为此规则目标控制的 Dubbo 服务键。- 如果设置了 scope:application ,则 key 应指定为此规则目标控制的应用程序的名称,应用程序应始终为 Dubbo 消费者。 | 是 |
enabled | bool | 是否启用此规则,设置 enabled:false 禁用此规则。 | 是 |
conditions | string[] | 此配置的条件路由规则定义。有关详细信息,请查看 Condition | 是 |
force | bool | 路由后实例子集为空时的行为。true 表示返回无提供者异常,而 false 表示忽略此规则。 | 否 |
runtime | bool | 是否为每次 rpc 调用运行路由规则,或者如果可用则使用路由缓存。 | 否 |
Condition
Condition
充当条件路由规则的主体,类型为字符串,具有复合结构,例如 method=getComment => region=Hangzhou
。这里
=>
符号之前的条件表示请求参数匹配条件。指定的匹配条件
与消费者的请求上下文 (URL) 甚至方法参数进行比较。当消费者满足匹配条件时,将对消费者应用条件之后的地址子集过滤规则。=>
符号之后的条件表示地址子集过滤条件。指定的过滤条件
与提供者实例地址 (URL) 进行比较。消费者只能访问满足过滤条件的实例,确保流量仅发送到满足条件的地址子集。- 如果匹配条件为空,则表示规则适用于所有请求,例如:
=> status != staging
- 如果过滤条件为空,则拒绝来自相应请求的访问,例如:
application = product =>
- 如果匹配条件为空,则表示规则适用于所有请求,例如:
匹配/过滤条件
参数支持
- 服务调用上下文,例如接口、方法、组、版本等。
- 请求上下文,例如 attachments[key] = value。
- 方法参数,例如 arguments[0] = tom。
- URL 本身的字段,例如协议、主机、端口等。
- URL 上的附加参数,例如应用程序、组织等。
- 支持开发者定义的扩展。
条件支持
- 等号 (=) 表示“匹配”,例如:method = getComment。
- 不等号 (!=) 表示“不匹配”,例如:method != getComment。
值支持
- 用逗号 (,) 分隔的多个值,例如:host != 10.20.153.10,10.20.153.11。
- 以星号 (*) 结尾表示通配符匹配,例如:host != 10.20..
- 以美元符号 ($) 开头表示引用消费者参数,例如:region = $region。
- 整数范围,例如:userId = 1~100, userId = 101~。
- 支持开发者定义的扩展。
上次修改时间:2024 年 1 月 11 日:增强条件路由规则文档 (#2901) (2fe914296a3)