基于MSE云原生网关实现全链路灰度

在微服务场景中,应用间的调用是随机的。当您部署的Spring Cloud应用或Dubbo应用存在升级版本时,可能会导致无法将具有一定特征的流量路由到应用的目标版本。通过SAE提供的全链路灰度能力,您无需修改业务代码,就可以实现端到端的全链路流量控制。泳道可以将应用的相关版本隔离成一个独立的运行环境。通过设置泳道规则,可以将满足规则的请求流量路由到目标版本的应用。本文介绍如何在SAE通过MSE云原生网关实现端到端的全链路灰度。

名词解释

  • MSE云原生网关:MSE云原生网关是兼容K8s Ingress标准的下一代网关产品,支持ACK容器和Nacos等多种服务发现方式,支持多种认证登录方式快速构建安全防线。更多信息,请参见云原生网关概述

  • 泳道:为相同版本应用定义的一套隔离环境。只有满足了流控路由规则的请求流量才会路由到对应泳道里的打标应用。一个应用可以属于多个泳道,一个泳道可以包含多个应用,应用和泳道是多对多的关系。

  • 泳道组:泳道的集合。泳道组的作用主要是为了区分不同团队或不同场景。

  • 基线环境:未打标的应用属于基线环境,是其他环境的兜底环境。

场景示例

本文通过模拟真实的调用链路为您演示全链路灰度功能。您无需修改任何业务代码,只需要给入口应用设置流量规则,该流量的标签会通过链路透传到下一个应用中。在每个应用的调用过程中,符合规则的流量会优先调用到对应的灰度应用,如果没有对应的灰度应用则会自动切换回基线应用。

各测试应用部署如下表所示:

测试应用:全链路灰度演示程序.zip,其中包含A、BC三个后端应用,这三个后端应用既可以用作基线应用的部署,也可以用作灰度应用的部署。

后端应用

基线应用

灰度应用

灰度应用上的标签

A

sae-a

sae-a-a1

alicloud.service.tag:g1

sae-a-a2

alicloud.service.tag:g2

B

sae-b

sae-b-b2

alicloud.service.tag:g2

C

sae-c

sae-c-c1

alicloud.service.tag:g1

sae-c-c2

alicloud.service.tag:g2

流量分发示意图如下所示:

image

调用链路如下:

  • 正常流量调用链路

    MSE云原生网关->应用sae-a -> 应用sae-b -> 应用sae-c。

  • 标签流量调用链路

    • t=g1流量:MSE云原生网关->应用sae-a-a1 -> 应用sae-b -> 应用sae-c-c1。

    • t=g2流量:MSE云原生网关->应用sae-a-a2 -> 应用sae-b-b2 -> 应用sae-c-c2。

前提条件

重要

MSE云原生网关实例和基线应用可以使用同一个VPC,也可以使用不同的VPC。如果这些实例不在同一个VPC中,您需要自行配置网络,确保它们之间能够互相通信,例如,您可以使用阿里云的云企业网或其他网络连接产品来实现跨VPC通信。

使用限制

  • 全链路灰度仅适用于20231108日起新建的微服务应用。

  • 全链路灰度功能仅支持在新版控制台使用。

  • 由于全链路灰度功能整合了标签路由功能(此处指的是MSE微服务治理的标签路由,与MSE云原生网关的标签路由无关),因此不推荐已经加入全链路灰度的应用配置金丝雀发布和标签路由规则。

    限制项与限制值

    限制项

    限制值

    备注

    网关服务来源类型

    SAE内置NacosMSE Nacos

    基于MSE云原生网关的全链路灰度目前只支持SAE内置NacosMSE Nacos两种来源。

    MSE云原生网关版本

    大于等于2.0.6版本

    2.0.6以下版本需要升级至最新版本。如何升级版本,请参见升级MSE云原生网关版本

    Spring Cloud版本

    Spring Cloud Edgware及以上版本

    无。

    Dubbo版本

    2.5.3~2.7.8

    Dubbo 3.0及以上版本当前处于灰度中,如有场景需求,请提工单联系MSE技术支持。

    客户端类型

    • Resttemplate

    • Spring Cloud OpenFeign

    无。

    Java应用JDK版本

    目前支持JDK 6、7、8版本应用接入

    JDK 11版本当前处于灰度中,如有场景需求,请提工单联系MSE技术支持。

    负载均衡类型

    • Ribbon 2.0.x及以上版本

    • LoadBalancer 3.0.x及以上版本

    无。

    Spring Cloud Gateway版本

    Spring Cloud Gateway 2.1.0.RELEASE及以上版本

    无。

1. 部署基线应用并为其开通微服务治理功能

1.1 部署基线应用

创建sae-a、sae-bsae-c三个基线应用。本文只介绍关键步骤,具体的操作步骤,请参见应用部署

  1. 登录SAE控制台,在左侧导航栏选择应用管理 > 应用列表,然后选择目标地域和目标命名空间,最后单击创建应用

    xxQdc1LHvq

  2. 应用基础信息向导页,在基础信息设置区域和容量设置区域配置相关信息,然后单击下一步:高级设置

    本示例中,选择通过上传代码包的形式部署sae-a、sae-bsae-c三个基线应用。
  3. 找到并展开服务注册发现区域,Nacos注册中心服务发现选择MSE Nacos专业版,并选择目标MSE Nacos实例命名空间。其余高级配置,请参见高级配置

    Up8Nvvt7ye

    重要

    这三个基线应用均使用同一个MSE Nacos实例和命名空间。

  4. 单击创建应用

1.2 为基线应用开通微服务治理功能

重要

全链路灰度为MSE微服务治理专业版功能,链路中所有涉及应用均需开启微服务治理功能才能使用。

应用列表页面,单击应用名称,在左侧导航栏选择微服务治理 > 应用概览,单击开启微服务治理

说明
  • 应用开通的微服务治理功能的版本与MSE版本保持一致。

  • 如果您的应用未接入MSE商业版,请参见一键升级微服务治理功能文档一键升级微服务治理功能。

  • 开启过程应用的所有实例将触发一次重启,请在业务低峰期进行操作。

3JVeLD4e3p

开启过程需要1~2分钟,请您耐心等待。

2. 部署灰度应用

基于基线应用部署灰度应用:

  • 其中基线应用sae-a部署两个灰度应用,分别为sae-a-a1应用和sae-a-a2应用。

  • 其中基线应用sae-b部署一个灰度应用,为sae-b-b1。

  • 其中基线应用sae-c部署两个灰度应用,分别为sae-c-c1应用和sae-c-c2应用。

具体操作步骤,如下所示。

  1. 应用列表页面,单击基线应用右侧的CBDwvZhrJR图标,然后单击创建灰度应用

    说明

    如果您没有开启基线应用的微服务治理功能,则无法创建灰度应用。开启步骤,请参见为基线应用开通微服务治理功能

  2. 应用基本信息向导页,配置以下信息,然后单击下一步:高级设置

    1. 基础信息设置区域,设置灰度应用名称并选择以镜像或代码包的方式部署灰度应用。具体操作,请参见应用部署

      说明
      • 灰度应用的命名空间配置会自动继承基线应用的相关配置,因此您无需对其进行额外修改。

      • 应用部署方式也会自动继承基线应用的部署方式。在本示例中,您无需重新上传代码包进行部署,但在实际的生产环境中,请根据需要进行相应的配置调整。

    2. 灰度标签区域,设置标签。本示例灰度应用标签的配置,请参见场景示例

      kn0LtwJRWy

    3. 容量设置区域,配置单个实例的资源规格和实例数量。

  3. 高级设置向导页,根据实际需求配置相关功能。具体操作,请参见高级配置

    说明

    灰度应用的服务发现功能会自动继承基线应用的相关配置,因此您无需对其进行额外修改。

  4. 单击创建应用

3. 创建MSE云原生网关路由

  1. 灰度应用创建完成后,返回应用列表页面,单击左侧导航栏的命名空间,然后在命名空间页面,单击基线应用和灰度应用所在的命名空间名称。

  2. 进入目标命名空间后,在左侧导航栏单击网关路由,然后单击创建网关路由

  3. 创建路由页面创建MSE云原生网关路由。本文只介绍关键步骤,详细配置说明,请参见为应用设置路由规则(MSE)

    说明

    本文中的配置仅适用于本示例。在生产环境中,请根据实际需求进行相应的配置调整。

    1. 选择网关类型MSE云原生网关

    2. 网关实例选择在前提条件中已创建的网关实例。

    3. 路径(Path)选择为前缀是/

    4. 服务来源选择MSE Nacos

    5. MSE Nacos实例MSE Nacos命名空间选择与基线应用相同的MSE Nacos实例和命名空间。

      MLdFMKL57f

    6. 使用场景选择单服务场景。

    7. 后端服务应用名称选择为sae-a,服务名称选择为sc-A,服务协议HTTP,服务端口20001

  4. 单击保存

4. 创建泳道组及泳道

4.1 创建泳道组

  1. MSE云原生网关创建成功后,返回命名空间页面,在左侧导航栏选择微服务治理 > 全链路灰度,在全链路灰度页面选择目标命名空间,然后单击创建泳道组及泳道

    wCisG7DnY9

  2. 在弹出的创建泳道组面板,配置以下参数信息,然后单击确定

    1. 自定义泳道组名称

    2. 入口类型选择MSE云原生网关

    3. 泳道组流量入口选择在前提条件中创建的云原生API网关实例。

    4. 泳道组涉及应用选择所有的基线应用。

    Ru0Oh1efle

4.2 创建泳道

在整个泳道组内,支持创建基于按内容灰度的泳道和基于按比例灰度的泳道。然而,一旦第一个泳道创建成功,后续创建的泳道将无法更改灰度模式。

以下表格中的示例均为本文场景的配置示例。在实际的生产环境中,请根据具体需求进行相应的调整。

创建基于按内容灰度的泳道

按照以下说明创建两个泳道。

  1. 全链路灰度页面,单击点击创建第一个分流泳道

    重要

    第一个泳道创建完成后,单击创建泳道来创建第二个泳道。

  2. 在弹出的创建泳道面板,配置以下参数信息,然后单击确定

    X34JYON2rm

    配置项

    示例

    说明

    泳道名称

    • 第一个泳道名称:test-1

    • 第二个泳道名称:test-2

    自定义泳道名称,每条泳道名称不能重复。

    泳道标签

    • 第一个泳道的标签:g1

    • 第二个泳道的标签:g2

    在下拉列表中选择需要给请求打标的标签值,此标签为创建灰度应用时配置的标签。

    泳道状态

    两个泳道的状态均为开启。

    泳道状态是默认开启的。

    灰度模式

    两个泳道的灰度模式均选择按内容灰度

    选择按内容灰度,此模式的具体说明,请参见控制台。

    灰度条件

    • 第一个泳道的灰度条件:

      • 以下条件同时满足

      • 参数类型:Header

      • 参数:t

      • 条件:==

      • 值:g1

    • 第二个泳道的灰度条件:

      • 以下条件同时满足

      • 参数类型:Header

      • 参数:t

      • 条件:==

      • 值:g2

    当请求满足所配置的灰度条件时,会被打上前面指定的泳道标签。

    • 支持以下两种筛选条件:

      • 以下条件同时满足:当请求都满足下面的条件时,才会被打上灰度标签。

      • 以下条件任意满足:当请求满足下面的任意一个条件时,都会被打上灰度标签。

    • 支持通过以下几个参数字段进行条件筛选:

      • 参数类型:支持HeaderCookieParameter

      • 参数:支持自定义。

      • 条件:支持==!=in、百分比、正则匹配和前缀匹配。

      • 值:支持自定义。

创建基于按比例灰度的泳道

按照以下说明创建两个泳道。

  1. 全链路灰度页面,单击点击创建第一个分流泳道

    重要

    第一个泳道创建完成后,单击创建泳道来创建第二条泳道。

  2. 在弹出的创建泳道面板,配置以下参数信息,然后单击确定

    8hiyAU8B9d

    配置项

    示例

    说明

    泳道名称

    • 第一个泳道名称:test-1

    • 第二个泳道名称:test-2

    自定义泳道名称,每条泳道名称不能重复。

    泳道标签

    • 第一个泳道的标签:g1

    • 第二个泳道的标签:g2

    在下拉列表中选择需要给请求打标的标签值,此标签为创建灰度应用时配置的标签。

    泳道状态

    两个泳道的状态均为开启。

    泳道状态是默认开启的。

    灰度模式

    两个泳道的灰度模式均选择按比例灰度

    选择按比例灰度,此模式的具体说明,请参见控制台。

    流量比例

    • 第一个泳道的流量比例:50%

    • 第二个泳道的流量比例:50%

    为所选路由或Path设置流量比例,在默认情况下,泳道内所有的路由或Path都将使用统一的流量比例。

5. 结果验证

5.1 灰度流量验证

按内容灰度流量验证

  1. 使用curl命令测试基线流量:

    #测试命令
    curl 8.130.XX.XX/a
    # 测试结果
    A[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C[192.168.XX.XX]
    说明

    命令中的8.130.XX.XX是云原生网关暴露出的公网IP地址。

  2. 使用curl命令测试灰度流量,以参数类型选择Header为例:

    # 测试命令
    curl 8.130.XX.XX/a -H "tag: ${tag}" 
    
    # 测试结果
    A${tag}[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C${tag}[192.168.XX.XX]
    说明

    当参数带上tag: ${tag}时,会命中灰度标签,并向后透传。

按比例灰度流量验证

使用curl命令进行验证。

#测试命令
curl 8.130.XX.XX/a
# 测试结果
A[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C[192.168.XX.XX]
A${tag}[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C${tag}[192.168.XX.XX]
说明

命令中的8.130.XX.XX是云原生网关暴露出的公网IP地址。

5.2 微服务治理可观测

SAE控制台全链路灰度页面,在泳道组及涉及的应用区域单击目标应用,在应用QPS监控区域,可查看对应泳道基线版本和灰度版本的流量情况。选择回放时间,展示所选时间对应的指标数据。

说明

您也可以在应用QPS监控区域单击流量详情,查看更为详细的信息。

image