为Spring Cloud服务配置标签路由

标签路由通过标签将一个或多个服务的提供者划分到同一个分组,从而约束流量只在指定分组中流转,实现流量隔离的目的。标签路由可以作为多版本开发测试、同应用的多版本流量隔离以及A/B Testing等场景的能力基础。本文介绍如何为Spring Cloud服务配置标签路由。

背景信息

标签路由目前仅支持ECS集群中的应用。

应用场景

多版本开发测试

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

使用基于标签路由的全链路流量隔离机制,可以将特定的流量路由到指定的开发环境。例如,在开发环境1中,为应用B(V1.1)和应用D(V1.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

操作流程

假设ECS集群中部署了应用A,该应用有一个默认分组,共包含3个应用实例。

标签路由流程如下:

  1. 创建标签

    1. 为应用A新建两个分组:group1和group2。

    2. 将默认分组下的2个应用实例分别更换到分组group1和group2。

    3. 分别为group1和group2分组创建标签路由中的标签。

  2. 创建标签路由规则:基于group1和group2的标签分别创建标签路由规则。

标签路由创建完成后,当应用B调用应用A时,流量会根据规则被路由到group1和group2。其它不满足group1和group2的路由规则的流量会被路由到默认分组。

创建标签

在应用中新建分组,并为该分组添加实例,然后通过分组的JVM设置为该分组创建标签。

  1. 登录EDAS控制台

  2. 为应用创建应用分组。具体操作,请参见创建分组

  3. 为新建分组添加实例,可以将默认分组中的实例更换到新建分组,也可以对新建分组进行扩容。具体操作,请参见添加实例

    重要

    从默认分组中更换到新建分组的应用实例需要重启才能识别标签。新建分组中扩容的实例无需重启。

  4. 在新建分组右上角单击分组设置,在列表中单击JVM

    分组设置-JVM
  5. 分组设置对话框,单击自定义。在展开的自定义区域,打开自定义开关,并在配置内容的文本框中设置分组标签,然后单击配置JVM参数

    分组标签通过自定义参数设置,格式为-Dalicloud.service.tag=tag1,其中,tag1为标签名称,请根据实际业务需求设置。

    分组设置-JVM-自定义
  6. 重启应用。

    • 方式一:在应用列表页面,选中应用后,单击批量重启,在确认对话框,单击确定

    • 方式二:在应用列表页面,单击应用名称,在基本信息页面右上角,单击停止应用启动应用

    说明

    自定义JVM参数需重启应用才能生效。

创建标签路由规则

标签(即分组)创建完成后,需要分别基于不同标签创建路由规则。

  1. 登录EDAS控制台

  2. 在左侧导航栏,选择流量管理 > 微服务治理 > Spring Cloud

  3. Spring Cloud左侧导航栏,单击标签路由

  4. 标签路由页面,选择微服务空间,然后单击创建标签路由

  5. 创建标签路由面板设置参数,然后单击确定

    创建标签路由

    标签路由参数说明:

    配置项

    说明

    微服务空间

    左侧为地域列表,右侧为微服务空间列表,根据实际情况选择。

    路由名称

    标签路由规则名称,例如label-routing-group1

    描述

    规则描述。

    应用

    在下拉列表中选择应用。

    标签

    在下拉列表中选择标签,即为应用新建分组设置的自定义JVM参数-Dalicloud.service.tag的值。

    选择完成后,在下方应用实例区域会显示该分组下的实例的IP。

    是否链路传递

    如果需要使用全链路流控,请打开是否链路传递开关。

    说明

    由于目前全链路流控处于灰度发布中,所以如需使用该功能,请加入钉钉交流群(群号:31723701),联系EDAS技术支持人员。

    流量规则

    框架类型

    包含Spring CloudDubbo,根据应用实际框架选择。

    • Spring Cloud:仅支持设置URL的Path,例如/getIp

    • Dubbo:支持选择服务和接口。

    Path

    HTTP的相对路径。

    条件模式

    包含同时满足下列条件满足下列任一条件,根据实际需求选择。

    条件列表

    可以分别设置Parameter、Cookie、Header和Body Content四种类型的参数。例如:

    • Parameter:name=xiaoming

    • Cookie:hello = "world" 或 "world2"

结果验证

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

  • 默认100%流量会按照规则,调用到tag1节点。

    image..png
  • 匹配规则的流量,会调用到对应标签的节点。

    image..png