基于Java服务网关实现全链路灰度

通过SAE提供的全链路灰度功能,您可以轻松实现全面的流量控制,而无需更改您的业务代码。本文主要介绍如何配置SAE全链路灰度,以Java服务网关为例,介绍如何实现端到端的灰度部署。

前提条件

已开通MSE微服务治理专业版或企业版。具体操作,请参见开通MSE微服务治理

使用限制

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

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

  • 由于全链路灰度功能整合了标签路由功能(此处指的是MSE微服务治理的标签路由,与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及以上版本

    无。

名词解释

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

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

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

场景示例

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

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

应用

基线应用

灰度应用

灰度应用上的标签

A

sc-a

sc-a-a1

alicloud.service.tag:g1

sc-a-a2

alicloud.service.tag:g2

B

sc-b

sc-b-b1

alicloud.service.tag:g2

C

sc-c

sc-c-c1

alicloud.service.tag:g1

sc-c-c2

alicloud.service.tag:g2

Jave服务网关

sc-gw

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

image

正常流量调用链路:

Java服务网关 -> 应用sc-a -> 应用sc-b -> 应用sc-c。

标签流量调用链路:

  • t=g1流量:Java服务网关 -> 应用sc-a-a1 -> 应用sc-b -> 应用sc-c-c1。

  • t=g2流量:Java服务网关 -> 应用sc-a-a2 -> 应用sc-b-b2 -> 应用sc-c-c2。

步骤一:搭建微服务应用的基线应用

SAE控制台部署使用镜像部署sc-a、sc-b、sc-c、sc-gw(Java服务网关)这四个基线应用,。

  1. 登录Serverless 应用引擎控制台。

  2. 在左侧导航栏,单击应用管理,然后单击微服务应用

  3. 应用列表页面,单击创建应用

  4. 创建应用页面,根据下表的说明完成应用部署。

    配置区域

    配置项

    说明

    基础信息设置区域

    应用名称

    自定义应用名称。名称为1~36个字符,可包含数字、字母以及中划线(-),必须以字母开头。

    应用描述

    介绍应用的基本情况。

    命名空间类型

    可选择的类型有以下两种:

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

    • 选择已有命名空间:从下拉列表选择已创建的自定义命名空间交换机 vSwitch安全组

    应用部署方式

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

    2. 在弹出的设置镜像面板中,请按照以下说明进行部署。

      1. 技术栈语言:选择目标语言。

      2. 语言环境:在下拉框中选择对应语言的应用运行环境。

      3. 镜像服务版本:选择镜像服务个人版或镜像服务企业版

      4. 单击镜像仓库命名空间,选择镜像仓库命名空间。

      5. 单击目标镜像仓库名称选择镜像版本列的下拉框,选择镜像版本。

    3. 单击确定

    容量设置

    单实例规格

    设置单实例的CPU和内存,取值范围为[1,50]。默认值为2。

    实例数

    设置实例个数,取值范围为[1,50]。默认值为2。

  5. 单击下一步:高级设置,进行高级配置。具体步骤,请参见高级配置

  6. 单击创建应用

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

重要

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

  1. 登录Serverless 应用引擎控制台。

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

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

    image

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

    • 开启微服务治理需要1~2分钟,请您耐心等待。

步骤三:基于基线环境创建灰度应用

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

  1. 登录Serverless 应用引擎控制台。

  2. 在左侧导航栏,单击微服务应用,然后在顶部菜单栏选择目标地域。

  3. 在应用列表页面,单击目标应用操作列的image图标,然后单击创建灰度应用

  4. 创建灰度应用页面,按照下表的说明完成应用的创建。

    设置区域

    设置项

    说明

    基础信息设置

    应用名称

    自定义应用名称。名称为1~36个字符,可包含数字、字母以及中划线(-),必须以字母开头。

    应用描述

    自定义应用的基本情况。

    命名空间类型

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

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

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

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

    • 安全组:选择安全组。

    应用部署方式

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

    灰度标签

    名称

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

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

    容量设置

    单实例规格

    设置CPU和内存,取值范围为[1,50]。默认值为2。

    实例数

    设置实例个数,取值范围为[1,50]。默认值为2。

  5. 单击下一步:高级设置,进行高级配置。具体步骤,请参见高级配置

  6. 单击创建应用

步骤四:创建泳道组

  1. 登录Serverless 应用引擎控制台。

  2. 在左侧导航栏单击微服务治理,然后单击全链路灰度

  3. 全链路灰度页面,在页面顶部单击目标命名空间,然后单击创建泳道组及泳道

  4. 在弹出的创建泳道组面板,根据下表说明设置泳道组相关参数,然后单击确定

    配置项

    说明

    泳道组名称

    自定义泳道组名称。

    入口类型

    选择Java 服务网关

    泳道组流量入口

    选择您的流量入口。

    泳道组涉及应用

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

    image

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

步骤五:创建泳道

  1. 全链路灰度页面,在页面下方单击点击创建第一个分流泳道,如果您选择的微服务空间内已经创建过泳道,则单击创建泳道

  2. 在弹出的创建泳道页面,按照下表说明完成泳道的创建,然后单击确定

    配置项

    说明

    泳道名称

    自定义泳道名称。

    泳道标签

    选择需要加入同一条泳道的应用对应灰度版本的alicloud.service.tag标签。

    Path

    选择匹配路径,若为空则代表匹配所有路径。

    灰度模式

    按照控制台提示选择灰度模式:

    • 按内容灰度

    • 按比例灰度

    说明

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

    灰度条件

    灰度条件指定了请求内容的灰度匹配方式。当请求内容满足下列条件时,会被打上先前指定的泳道标签:

    • 以下条件同时满足

    • 以下条件任意满足

    说明

    可以选择的条件类型:

    • 参数类型

    • 参数

    • 条件

步骤六:基线应用及灰度应用流量验证

按内容灰度流量验证

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

    #测试命令
    curl 8.130.XX.XX/A/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命令测试灰度流量:

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

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

按比例灰度流量验证

使用curl命令测进行验证:

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

命令中的 8.130.XX.XX是服务网关暴露的IP地址。

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

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

说明

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

image

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

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

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