前言
大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 路由规则之标签路由。在前一个章节中我们介绍了 Dubbo 路由规则之标签路由,以及我们也例举了常见的使用场景并且进行了源码解析来分析其实现原理,同时知道 Dubbo 中标签路由其本质上是通过过滤器对服务提供者列表进行规则的匹配,如果匹配不上则过滤掉服务提供者。那接下来我们解析讨论标签路由,什么是标签路由呢?有什么使用场景呢?下面就让我们快速开始吧!
1. 标签路由简介
首先小伙伴可以通过《Dubbo 路由规则之条件路由》回归一下什么是路由规则?下面我们主要讨论什么标签路由:
上图中我们可以看到有两个机房分别是机房A、机房B,其中机房 A 只能访问到 Service A 和 Service B ,而机房B 只能访问到 Service C 和 Service D。要实现上面这种场景我们就需要用到标签路由。从机房 A 发起的调用携带标签 TAG_A 访问到 Service A 和 Service B,而从机房 B 发起的调用携带 TAG_B Service C 和 Service D 。那什么是标签路由呢?
- 标签路由:以服务提供者应用为粒度配置路由规则,通过将某一个或多个服务的提供者划分到同一个分组,约束流量只在指定分组中流转,从而实现流量隔离的目的,可以作为蓝绿发布、灰度发布等场景的能力基础。标签主要是指对Provider端应用实例的分组,目前有两种方式可以完成实例分组,分别是
动态规则打标
和静态规则打标
,其中动态规则相较于静态规则优先级更高,而当两种规则同时存在且出现冲突时,将以动态规则为准。
2. 使用方式
下面我们简单的讨论下标签路由的使用方式:
2.1 标签路由
- 动态规则打标,可随时在服务治理控制台下发标签归组规则
# demo-provider应用增加了两个标签分组tag1和tag2
# tag1包含一个实例 127.0.0.1:20880
# tag2包含一个实例 127.0.0.1:20881
---
force: false
runtime: true
enabled: true
key: demo-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}
Tips: 消费端通过编程的方式使用
RpcContext.getContext().setAttachment(CommonConstants.TAG_KEY,"TAG_A")
请求标签的作用域为每一次invocation
,使用attachment
来传递请求标签,注意保存在attachment
中的值将会在一次完整的远程调用中持续传递,得益于这样的特性,我们只需要在起始调用时,通过一行代码的设置,达到标签的持续传递。
- 字段说明:
编号 | 字段名称 | 说明 | 必填 |
---|---|---|---|
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 | tags | 定义具体的标签分组内容,可定义任意n(n>=1)个标签并为每个标签指定实例列表。其中name为标签名称 | 必填 |
2.2 降级约定
request.tag&