标签路由通过标签将一个或多个服务的提供者划分到同一个分组,从而约束流量只在指定分组中流转,实现流量隔离的目的。标签路由可以作为蓝绿发布、灰度发布等场景的能力基础。

演示视频

说明 该视频为Spring Cloud应用的演示视频,Dubbo应用除了流量规则参数有所不同外,其它使用体验和Spring Cloud是一致的。

应用场景

  • 多版本开发测试

    多个版本并行开发时,需要为每个版本准备一套开发环境。如果版本较多,开发环境成本会非常大。流量隔离方案可以在多版本开发测试时大幅度降低资源成本。

    使用基于标签路由的全链路流量隔离机制,可以将特定的流量路由到指定的开发环境。例如在开发环境1中只修改应用B和应用D,则为这两个应用在开发环境1中的版本创建Tag1标签,并配置对应的路由规则。入口应用A调用B时,会判断流量是否满足路由规则。如果满足,路由到开发环境1中应用B的V1.1版本;如果不满足,路由到基线环境中的应用B的V1版本。应用C调用D的时候同样根据流量决定路由到D的V1版本或V1.1版本。

    多版本开发测试
  • 相同应用的多版本间流量隔离

    如果一个应用有多个版本在线上同时运行,部署在不同环境中,如日常环境和特殊环境,则可以使用标签路由对不同环境中的不同版本进行流量隔离,将秒杀订单流量或不同渠道订单流量路由到特殊环境,将正常的流量被路由到日常环境。即使特殊环境异常,本应进入特殊环境的流量也不会进入日常环境,不影响日常环境的使用。

    相同应用的多版本间流量隔离
  • A/B Testing

    线上有多个应用版本同时运行,期望对不同版本的应用进行A/B Testing,则可以使用标签路由的全链路流量控制将地域A(如杭州)的客户流量路由到V1版本,地域B(如上海)的客户流量路由到V1.1版本,对不同版本进行验证,从而降低降低新产品或新特性的发布风险,为产品创新提供保障。

    A/B Testing

操作场景

本文以cartservice为例,分别给应用打上tag1和tag2两个标签,将应用划分为2个分组,每个分组各包含四个节点。

标签路由示例

本文介绍如何为cartservice创建标签路由,主要包含以下两步:

  1. 在ACK中为应用接入MSE微服务治理并设置标签。
  2. 在MSE微服务治理中为应用创建标签路由。

在ACK中为应用接入MSE微服务治理并设置标签

  1. 登录容器服务控制台
  2. 在左侧导航栏选择应用 > 无状态
  3. 无状态(Deployment)页面右上角单击使用镜像创建
  4. 创建应用页面分别创建两个无状态应用cartservice1和cartservice2。

    创建无状态应用的详细步骤请参见使用镜像创建无状态Deployment应用

    本文仅介绍为cartservice1和cartservice2创建标签路由相关的参数。

    参数 说明
    集群 选择已经安装了MSE微服务治理的集群。
    副本数量 按示例,设置为4。
    镜像名称 在选择镜像时,单击搜索,选择华东1(杭州)地域,搜索并选择alibabacloud-microservice-demo/cartservice镜像。
  5. 为应用cartservice1和cartservice2接入MSE微服务治理,并设置标签。
    1. 返回无状态(Deployment)页面,选择集群命名空间,找到创建的应用(cartservice1和cartservice2),在操作列单击更多,在列表中单击编辑Yaml
      无状态-编辑Yaml
    2. 编辑Yaml对话框分别为cartservice1和cartservice2在spec > template > metadata下添加以下annotations,接入MSE微服务治理。
      annotations:
        msePilotAutoEnable: "on"
        msePilotCreateAppName: "<your-deployment-name>"
      说明 需要将<your-deployment-name>替换为您在MSE微服务治理实际使用的应用名称,即cartservice。
    3. 编辑Yaml对话框为cartservice1和cartservice2分别添加标签alicloud.service.tag: tag1alicloud.service.tag: tag2
    编辑 Yaml

在MSE微服务治理中为应用创建标签路由

  1. 登录MSE管理控制台
  2. 在左侧导航栏选择微服务治理中心 > 应用列表
  3. 应用列表页面单击在ACK创建的应用名称cartservice
  4. 在cartservice的应用详情页面的实例概览区域查看实例标签,然后在服务治理标签路由页签中查看标签路由数据。
    应用列表
  5. 服务治理标签路由页签中单击暂无数据,前往标签路由
  6. 标签路由页面单击创建标签路由
  7. 创建标签路由页面设置参数,然后单击确定
    创建标签路由-Dubbo

    标签路由参数说明:

    参数 说明
    路由名称 标签路由规则名称,例如test-dubbo
    描述 规则描述。
    应用标签 在左侧列表中选择cartservice,然后在右侧列表中选择在ACK中为应用设置的标签,例如tag2。选择完成后,会在下方应用实例区域显示cartservice应用中设置了该标签的应用实例的IP及端口。
    是否链路传递 如果需要使用全链路流控,请打开是否链路传递开关。
    流量规则
    框架类型 包含Spring CloudDubbo,根据应用实际框架选择。
    • Spring Cloud:仅支持设置URL的Path,例如/getIp
    • Dubbo:支持选择服务和接口。
    条件模式 包含同时满足下列条件满足下列任一条件,根据实际需求选择。
    条件列表 根据应用实际的参数、参数值获取表达式设置。例如:
    • Parameter:name=xiaoming
    • Cookie:hello = "world" 或 "world2"

    当Dubbo的方法参数为结构体时,可以通过参数表达式用于获取参数的某个属性,例如:

    • 留空:表示直接取当前参数的值
    • .name:表示取参数的 name 属性,相当于 args0.getName()
    • .isEnabled():表示取参数的 enabled 属性,相当于 args0.isEnabled()
    • [0]:表示当前参数应是一个数组,取数组的第一个值,相当于 args0[0],注意开始没有“.”
    • .get(0):表示当前参数应是一个 List,取 List 的第一个值,相当于 args0.get(0)
    • .get("key"):表示当前参数是一个 Map,获取 key 对应的值,相当于 args0.get("key")

结果验证

本文仅通过一个示例介绍如何为应用创建标签路由,您可以为应用参照配置,然后根据实际业务需求进行验证。