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

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

前提条件

重要

确保MSE云原生网关与SAE命名空间处于同一地域,且绑定同一个VPC。

使用限制

  • 全链路灰度仅适用于2023年11月08日起新建的微服务应用。

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

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

    限制项与限制值

    限制项

    限制值

    备注

    网关服务来源类型

    SAE内置Nacos和MSE Nacos

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

    MSE云原生网关版本

    1.2.13及以上版本

    1.2.13以下版本需要升级至最新版本。如何升级版本,请参见升级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及以上版本

    无。

名词解释

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

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

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

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

场景示例

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

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

后端应用

基线应用

灰度应用

灰度应用上的标签

A

sc-a

sc-a-a1

alicloud.service.tag:g1

sc-a-a2

alicloud.service.tag:g2

B

sc-b

sc-b-b2

alicloud.service.tag:g2

C

sc-c

sc-c-c1

alicloud.service.tag:g1

sc-c-c2

alicloud.service.tag:g2

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

image

调用链路如下:

  • 正常流量调用链路

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

  • 标签流量调用链路

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

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

步骤一:部署基线应用

本文示例中注册中心选择MSE Nacos企业版,然后在SAE控制台使用镜像部署sc-a、sc-b、sc-c这三个业务应用。

  1. 登录SAE控制台

  2. 在左侧导航栏,选择应用管理 > 微服务应用,在顶部菜单栏选择地域,然后在应用列表页面,单击创建应用

  3. 创建应用页面的应用基本信息配置向导中,配置相关信息,然后单击下一步:高级设置。配置项的更多信息,请参见创建应用

    分类

    配置项

    说明

    基础信息设置

    应用名称

    自定义。

    应用描述

    自定义。

    命名空间类型

    选择命名空间类型。

    • 系统创建:应用会被创建在目标地域下的默认命名空间内,例如cn-shanghai。

    • 选择已有命名空间:从下拉列表选择已创建的自定义命名空间,以及对应的专有网络VPC、交换机vSwitch和安全组。

    重要

    确保MSE云原生网关与SAE命名空间处于同一地域,且绑定同一个VPC。

    应用部署方式

    1. 选择镜像部署,单击设置镜像

    2. 设置镜像面板,进行如下配置,然后单击确定

      1. 技术栈语言:选择Java

      2. Java运行环境SAE支持多种Java运行时环境,您可以根据实际需求选择。

      3. 指定部署应用的镜像文件。

        镜像部署

        • 我的阿里云镜像:选择您的阿里云账号下的且已上传至阿里云容器镜像服务的镜像文件及其版本。

        • Demo镜像:在下拉列表选择Demo镜像的版本。

        • 自定义镜像:输入镜像仓库地址,确保应用能够访问公网。更多信息,请参见配置NAT网关使SAE应用能访问公网

        • 其它阿里云账号私有镜像:选择镜像服务版本镜像类型,并填写相关信息。

    容量设置

    单实例规格

    建议在测试环境中使用0.5 Core 1 GB,在生产环境中依据实际情况选择更高的实例规格。

    实例数

    取值范围为[1,50]。默认值为2。

  4. 创建应用页面的高级设置配置向导中,配置相关信息,然后单击创建应用。如果您需要继续为应用配置启动命令、环境变量、应用健康检查、日志等功能,请参见高级配置

    配置项

    说明

    环境变量

    添加自定义环境变量:从类型下拉列表,选择自定义,并输入变量名称变量值

    单击+添加添加环境变量,输入键值对。

    • 变量:自定义,输入nacos.namespacenacos.host

    • 值:自定义,输入publicmse-7fe****-nacos-ans.mse.aliyuncs.com

    服务注册发现

    展开服务注册发现,在Nacos注册中心服务发现区域选择MSE Nacos企业版

    image

步骤二:开启基线应用的微服务治理功能

重要

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

  1. 登录SAE控制台

  2. 在左侧导航栏,选择应用管理 > 微服务应用,在顶部菜单栏选择地域,然后在应用列表页面,单击目标应用名称。

  3. 在左侧导航栏,选择微服务治理 > 应用概览,单击开启微服务治理

    说明

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

    image

步骤三:基于基线应用部署灰度应用

基于基线应用部署灰度应用,其中sc-a和sc-c应用分别部署两个灰度应用(sc-a-a1,sc-a-a2,sc-c-c1,sc-c-c2),sc-b应用部署一个灰度应用(sc-b-b2)。

  1. 登录SAE控制台

  2. 在左侧导航栏,选择应用管理 > 微服务应用,在顶部菜单栏选择地域,然后在应用列表页面,单击目标应用操作列的image图标,然后单击创建灰度应用

  3. 创建灰度应用页面的应用基本信息配置向导中,配置相关信息,然后单击下一步:高级设置

    设置区域

    设置项

    说明

    基础信息设置

    应用名称

    自定义。

    应用描述

    自定义。

    命名空间类型

    按照控制台的默认配置选择选择已有命名空间以继承基线应用的设置。

    • 命名空间:继承基线应用的配置,不支持修改。

    • 专有网络 VPC:继承基线应用的配置,不支持修改。

    • 交换机vSwitch:选择交换机。

    • 安全组:选择安全组。

    应用部署方式

    默认继承基线应用的设置,您可以根据需求选择覆盖或添加新的配置。

    灰度标签

    名称

    全链路灰度和MSE云原生网关标签路由功能需搭配灰度标签才能使用,且标签名称必须设置为alicloud.service.tag,否则将无法通过标签值识别到该灰度应用。

    自定义标签值。标签值为1-20个字符,只能由字母和数字组成,且字母区分大小写,如grayGRAY是两个不同的标签值。

    容量设置

    单实例规格

    建议在测试环境中使用0.5 Core 1 GB,在生产环境中依据实际情况选择更高的实例规格。

    实例数

    取值范围为[1,50]。默认值为2。

  4. 创建应用页面的高级设置配置向导中,配置相关信息,然后单击创建应用。如果您需要继续为应用配置启动命令、环境变量、应用健康检查、日志等功能,请参见高级配置

    配置项

    说明

    环境变量

    添加自定义环境变量:从类型下拉列表,选择自定义,并输入变量名称变量值

    单击+添加添加环境变量,输入键值对。

    • 变量:自定义,输入nacos.namespacenacos.host

    • 值:自定义,输入publicmse-7fe****-nacos-ans.mse.aliyuncs.com

    服务注册发现

    展开服务注册发现,在Nacos注册中心服务发现区域选择MSE Nacos企业版

    image

步骤四:创建云原生网关路由

  1. 登录SAE控制台

  2. 在左侧导航栏,单击命名空间,在顶部菜单栏选择地域。

  3. 命名空间页面,单击目标命名空间名称。

  4. 在左侧导航栏,单击网关路由,然后单击创建网关路由

  5. 创建路由页面,配置相关信息,然后单击保存

    配置项

    描述

    路由名称

    路由规则名称,自定义。

    网络类型

    选择待转发请求的网络类型。

    • 公网:通过公网网关转发的请求,按照实际转发流量计费。

    • 私网:通过私网网关转发的请求不计费,仅在当前VPC内部转发。

    网关类型

    选择MSE云原生网关

    网关实例

    网关类型选择MSE云原生网关时需要配置。选择与命名空间同一地域、使用同一VPC的网关实例。如果您需要创建新的网关实例,可以单击创建MSE云原生网关前往MSE网关管理控制台进行创建。

    域名

    选择路由需要匹配的域名,支持选择多个域名。

    如果您需要创建新的域名,可以单击创建域名前往MSE网关管理控制台进行创建。

    路径(Path)

    设置匹配HTTP请求中的Path参数。

    • 相同匹配规则时,Path越长优先级越高。

    • 不同匹配规则时,等于 > 前缀是 > 正则匹配

      • 等于:即完全匹配。例如,Path等于/user

      • 前缀是:以前缀作为匹配条件。例如,Path以/user开头。

      • 正则匹配:以正则表达式作为匹配条件。

    方法(Method)

    设置匹配HTTP请求中的Method参数,不填表示匹配所有参数,支持选择多种HTTP方法。

    请求头(Header)

    设置匹配HTTP请求中的Header参数,相同匹配规则时参数越多优先级越高。

    请求参数(Query)

    设置匹配HTTP请求中的Query参数,相同匹配规则时参数越多优先级越高。

    服务来源

    支持SAE 内置 NacosMSE Nacos两种注册中心。

    服务来源选择MSE Nacos,从下拉列表选择已创建的MSE Nacos实例MSE Nacos命名空间

    说明

    与应用的服务注册发现方式保持一致。

    使用场景

    如果需要实现全链路灰度功能,使用场景选择灰度场景按标签(标签路由

    关于目标服务不同类型的说明,请参见路由方式概述

    后端服务

    选择已关联的后端服务,并指定路由版本(即标签)和权重。

    说明
    • 涉及权重的目标服务流量比例总和要求为100%。

    • 按标签路由只对从网关到后端服务的第一级跳转有效,如果需要作用于整条请求链路上的灰度能力,请配合全链路灰度功能一起使用。

    超时时间(秒)

    输入超时时间。默认为60秒。如果为0,则表示永不超时。

    Fallback

    开启Fallback开关,设置Fallback服务,您需要选择指定的服务。当路由指向的后端服务没有可用节点时,原请求会访问此处指定的Fallback服务。

    说明

    目前仅支持HTTP服务之间的Fallback能力。

    image

步骤五:创建泳道组

  1. 登录SAE控制台

  2. 在左侧导航栏,选择微服务治理 > 全链路灰度,在顶部菜单栏选择地域,然后在全链路灰度页面,单击创建泳道组及泳道。如果您选择的微服务空间内已经创建过泳道组,则单击创建泳道组

  3. 创建泳道组面板,配置相关信息,然后单击确定

    配置项

    说明

    泳道组名称

    自定义泳道组的名称。

    入口类型

    选择MSE云原生网关

    泳道组流量入口

    选择目标云原生网关。

    说明

    仅支持选择与命名空间VPC一致的云原生网关实例。

    泳道组涉及应用

    选择您入口网关所涉及的所有相关应用,可以选择多个。

    说明
    • 仅支持添加已开启MSE微服务治理功能的应用。

    • 应用必须在MSE治理中心的同一个命名空间。

    image

    泳道组创建完成后,在全链路灰度页面的泳道组区域,可以查看您创建的泳道组。如需变更泳道组信息,单击目标泳道组右上角的编辑,可在页面自行修改相关信息。

步骤六:创建泳道

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

  2. 创建泳道面板,配置相关信息,然后单击确定

    创建按内容灰度的泳道

    配置项

    说明

    填写泳道信息

    • 泳道名称:自定义。

    • 泳道标签:选择需要加入同一条泳道的应用对应灰度版本的alicloud.service.tag标签。泳道标签用来给请求打标,当符合灰度条件的请求经过网关应用时,会被打上此处指定的标记。

    • 泳道状态:默认开启。开启泳道状态开关,泳道创建完成后,开启泳道。

    配置路由规则

    设置相应的路由规则条件。

    • 基线路由:在可选路由列表中,选中目标基线路由。

    • 灰度模式:选择按内容灰度

      说明

      灰度模式在整个泳道组内需保持一致,一旦第一条泳道成功创建,后续泳道就不可以再对其进行更改。

    • 灰度条件:指定请求内容的灰度匹配方式。当请求内容以下条件同时满足时,会被打上前面指定的泳道标签,需要填写灰度条件有参数类型参数条件。参数类型支持Header和。

    创建按比例灰度的泳道

    配置项

    说明

    填写泳道信息

    • 泳道名称:自定义。

    • 泳道标签:选择需要加入同一条泳道的应用对应灰度版本的alicloud.service.tag标签。泳道标签用来给请求打标,当符合灰度条件的请求经过网关应用时,会被打上此处指定的标记。

    配置路由规则

    设置相应的路由规则条件。

    • 基线路由:在可选路由列表中,选中目标基线路由。

    • 灰度模式:选择按比例灰度

      说明

      灰度模式在整个泳道组内需保持一致,一旦第一条泳道成功创建,后续泳道就不可以再对其进行更改。

    • 流量比例:为所选路由或Path设置流量比例,在默认情况下,泳道内所有的路由或Path都将使用统一的流量比例。取值范围为[1,100],默认值为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地址。

步骤八:微服务治理可观测

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

说明

监控回放仅支持回放一天内的指标数据。

image

  • 总QPS:该应用总的每秒请求数(QPS)。

  • 异常QPS:该应用出错的每秒请求数(QPS)。

  • 未打标QPS:该应用未打标的流量的每秒请求数(QPS)。