路由规则

通过 Dubbo 中的路由规则进行服务治理

路由规则在发起 RPC 调用之前过滤目标服务器地址起作用,过滤后的地址列表将作为消费者最终发起 RPC 调用的备用地址。

  • 条件路由。支持在服务或消费者应用程序的粒度配置路由规则。
  • 标签路由。在提供者应用程序的粒度配置路由规则。

未来,我们计划基于 2.6.x 版本继续增强脚本路由功能。

条件路由

您可以在服务管理控制台 Dubbo-Admin 中随时编写路由规则

简介

  • 应用程序粒度

    # The consumer of app1 can only consume all service instances with port 20880
    # The consumers of app2 can only consume all service instances with port 20881
    ---
    scope: application
    force: true
    runtime: true
    enabled: true
    key: governance-conditionrouter-consumer
    conditions:
      - application=app1 => address=*:20880
      - application=app2 => address=*:20881
    ...
    
  • 服务粒度

    # The sayHello method of DemoService can only consume all service instances with port 20880
    # The sayHi method of DemoService can only consume all service instances with port 20881
    ---
    scope: service
    force: true
    runtime: true
    enabled: true
    key: org.apache.dubbo.samples.governance.api.DemoService
    conditions:
      - method=sayHello => address=*:20880
      - method=sayHi => address=*:20881
    ...
    

详细规则

每个字段的含义

  • scope 指示路由规则的粒度,scope 的值将决定 key 的值。必填
    • service 服务粒度
    • application 应用程序粒度
  • Key 指定规则主体作用于哪个服务或应用程序。必填
    • 当 scope=service 时,key 值为 [{group}:]{service}[:{version}] 的组合
    • 当 scope=application 时,key 值为应用程序名称
  • enabled=true 当前路由规则是否有效,可以留空,默认有效。
  • force=false 当路由结果为空时,是否强制执行,如果不强制执行,路由结果为空的路由规则将自动失败,可以留空,默认值为 false
  • runtime=false 是否每次调用都执行路由规则,否则只在提供者地址列表发生变化时预执行并缓存结果,调用时直接从缓存中获取路由结果。如果使用参数路由,则必须设置为 true。需要注意的是,设置会影响调用的性能。可以留空,默认值为 false
  • priority=1 是路由规则的优先级,用于排序,优先级越高,执行越靠前,可以留空,默认值为 0
  • conditions 定义具体的路由规则内容。必填

条件规则主体

The `conditions` part is the main body of the rule, which consists of 1 to any number of rules. Below we describe the configuration syntax of each rule in detail:
  1. 格式
  • => 之前是消费者匹配条件,所有参数都与消费者的 URL 进行比较,当消费者满足匹配条件时,将对消费者执行以下过滤规则。
  • => 之后,是提供者地址列表的过滤条件。所有参数都与提供者的 URL 进行比较,消费者最终只获取过滤后的地址列表。
  • 如果匹配条件为空,则表示应用于所有消费者,例如:=> host != 10.20.153.11
  • 如果过滤条件为空,则禁止访问,例如:host = 10.20.153.10 =>
  1. 表达式

参数支持

  • 服务调用信息,例如:方法、参数等,目前不支持参数路由
  • URL 本身的字段,例如:协议、主机、端口等
  • 以及 URL 上的所有参数,例如:应用程序、组织等

条件支持

  • 等号 = 表示“匹配”,例如:host = 10.20.153.10
  • 不等号 != 表示“不匹配”,例如:host != 10.20.153.10

值支持

  • 用逗号 , 分隔多个值,例如:host != 10.20.153.10,10.20.153.11
  • 以星号 * 结尾,表示通配符,例如:host != 10.20.*
  • 以美元符号 $ 开头,表示引用消费者参数,例如:host = $host
  1. 条件示例
  • 排除预发布机器
=> host != 172.22.3.91
  • 白名单
register.ip != 10.20.153.10,10.20.153.11 =>
  • 黑名单
register.ip = 10.20.153.10,10.20.153.11 =>
  • 服务托管在应用程序上,只暴露机器的一部分,以防止整个集群挂起
=> host = 172.22.3.1*,172.22.3.2*
  • 重要应用程序的额外机器
application != kylin => host != 172.22.3.95,172.22.3.96
  • 读写分离
method = find*,list*,get*,is* => host = 172.22.3.94,172.22.3.95,172.22.3.96
method != find*,list*,get*,is* => host = 172.22.3.97,172.22.3.98
  • 前后端分离
application = bops => host = 172.22.3.91,172.22.3.92,172.22.3.93
application != bops => host = 172.22.3.94,172.22.3.95,172.22.3.96
  • 将不同机房的网络段隔离
host != 172.22.3.* => host != 172.22.3.*
  • 提供者和消费者部署在同一个集群中,本地机器只访问本地服务
=> host = $host

标签路由规则

简介

标签路由将一个或多个服务提供者划分为同一个组,并限制流量只能在指定的组内流动,从而达到流量隔离的目的,可以作为蓝绿发布、灰度发布等场景的能力基础。

提供者

标签主要指提供者侧应用实例的分组。目前完成实例分组有两种方式,分别是动态规则标记静态规则标记,其中动态规则优先级高于静态规则,当同时存在两种规则且发生冲突时,动态规则优先。

-动态规则标记,您可以在服务治理控制台随时发布标签分组规则

# The governance-tagrouter-provider application adds two tag groups tag1 and tag2
# tag1 contains an instance 127.0.0.1:20880
# tag2 contains an instance 127.0.0.1:20881
---
  force: false
  runtime: true
  enabled: true
  key: governance-tagrouter-provider
  tags:
    - name: tag1
      addresses: ["127.0.0.1:20880"]
    - name: tag2
      addresses: ["127.0.0.1:20881"]
 ...
  • 静态标记

    <dubbo:provider tag="tag1"/>
    

    <dubbo:service tag="tag1"/>
    

    java -jar xxx-provider.jar -Ddubbo.provider.tag={the tag you want, may come from OS ENV}
    

消费者

RpcContext.getContext().setAttachment(Constants.TAG_KEY,"tag1");

请求标签的范围是每次调用。使用附件传递请求标签。请注意,附件中存储的值将在完整的远程调用中继续传递。得益于此功能,我们只需要调用,通过设置一行代码,就可以实现标签的连续传递。

目前只支持硬编码设置 dubboTag。请注意,RpcContext 是线程绑定的,并优雅地使用 TagRouter 功能。建议通过 servlet 过滤器(在 web 环境中)或自定义 SPI 过滤器设置 dubboTag。

详细规则

格式

  • Key 指定规则主体应用于哪个应用程序。必需
  • enabled=true 当前路由规则是否有效,可以留空,默认有效。
  • force=false 当路由结果为空时,是否强制执行,如果不强制执行,路由结果为空的路由规则将自动失败,可以留空,默认值为 false
  • runtime=false 是否每次调用都执行路由规则,否则只在提供者地址列表发生变化时预执行并缓存结果,调用时直接从缓存中获取路由结果。如果使用参数路由,则必须设置为 true。需要注意的是,设置会影响调用的性能。可以留空,默认值为 false
  • priority=1 是路由规则的优先级,用于排序,优先级越高,执行越靠前,可以留空,默认值为 0
  • tags 定义特定的标签分组内容,可以定义任意 n (n>=1) 个标签,并为每个标签指定一个实例列表。必需
    • name,标签名称
  • addresses,当前标签包含的实例列表

降级约定

  1. dubbo.tag=tag1 时,标记为 tag=tag1 的提供者优先。如果集群中没有与请求标签对应的服务,则默认会降级到空请求标签的提供者;如果要改变这种默认行为,即没有匹配 tag1 的提供者会返回异常,则需要设置 dubbo.force.tag= true

  2. dubbo.tag 未设置时,只有标签为空的提供者才会匹配。即使集群中存在可用服务,如果标签不匹配,也不能调用。这与约定 1 不同。带有标签的请求可以降级到无标签服务,但没有标签/带有其他类型标签的请求永远无法访问其他带标签的服务。


上次修改时间:2023 年 1 月 2 日:增强 en 文档 (#1798) (95a9f4f6c1c)