AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

阿里云 MSE 基于 Apache APISIX 的全链路灰度方案实践

  • 2022-06-08
  • 本文字数:4248 字

    阅读完需:约 14 分钟

阿里云MSE基于Apache APISIX的全链路灰度方案实践

本文整理自 Apache APISIX Summit ASIA 2022 上的分享,更多技术干货,详见内容专题


Apache APISIX 是一个开源的云原生 API 网关,作为 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。你可以使用 Apache APISIX 来处理传统的南北向流量,以及服务间的东西向流量,也可以当做 K8s Ingress controller 来使用。得益于 APISIX 全动态的设计,可以随时进行配置更改并且均不需要重启服务。


阿里云微服务引擎 MSE 提供了非常易用的流量泳道能力,基于 Java Agent 字节码增强的技术实现,无缝支持市面上近 5 年的所有 Spring Cloud 和 Dubbo 的版本,通过极简的配置与无代码侵入的方式,来实现全链路灰度,释放基于 APISIX 的微服务架构的新价值。

全链路灰度方案简介

相关概念

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

  • 基线环境:未打标的应用属于基线稳定版本的应用,即稳定的线上环境。

  • 流量回退:泳道中所部署的服务数量并非要求与基线环境完全一致,当泳道中并不存在调用链中所依赖的其他服务时,流量需要回退至基线环境,进一步在必要的时候路由回对应标签的泳道。

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

业务场景

基于流量泳道的全链路灰度能力,适用于以下业务场景:

  • 日常开发/项目/测试环境隔离;

  • 全链路灰度发布;

  • 高可用同机房优先路由;

  • 全链路压测。

技术原理

如何在实际业务场景中去快速落地全链路灰度呢?目前主要有两种解决方案,基于物理环境隔离和基于逻辑环境隔离。

物理环境隔离

物理环境隔离,其实就是通过增加机器的方式来搭建真正意义上的流量隔离。



 该方案需要为要灰度的服务搭建一套网络隔离、资源独立的环境,并在其中部署服务的灰度版本。由于 与正式环境隔离,正式环境中的其他服务无法访问到需要灰度的服务,所以需要在灰度环境中冗余部署 这些线上服务,以便整个调用链路正常进行流量转发。此外,注册中心等一些其他依赖的中间件组件也需要冗余部署在灰度环境中,保证微服务之间的可见性问题,确保获取的节点 IP 地址只属于当前的网络环境。


该方案一般用于企业的测试、预发开发环境的搭建,对于线上灰度发布引流的场景来说其灵活性不 够。并且微服务多版本的存在在微服务架构中是非常常见的,需要为这些业务场景采用堆机器的方式来维护多套灰度环境。如果应用数目很小,该方式是可以被受的;如果您的应用数目过多的情况下,会造成运维、机器成本过大,成本和代价远超收益。

逻辑环境隔离


另一种方案是构建逻辑上的环境隔离,我们只需部署服务的灰度版本,流量在调用链路上流转时,由经过的网关、各个中间件以及各个微服务来识别灰度流量,并动态转发至对应服务的灰度版本。如下图:



上图可以很好展示这种方案的效果,我们用不同的颜色来表示不同版本的灰度流量,可以看出无论是微服务网关还是微服务本身都需要识别流量,根据治理规则做出动态决策。当服务版本发生变化时,这个调用链路的转发也会实时改变。相比于利用机器搭建的灰度环境,这种方案不仅可以节省大量的机器成 本和运维人力,而且可以帮助开发者实时快速的对线上流量进行精细化的全链路控制。

基于 Apache APISIX 全链路灰度产品实践


全链路灰度是微服务最核心的功能之一,也是云上用户在微服务化深入过程中必须具备的功能。全链路灰度因为涉及到的技术和场景众多,如果企业一一进行自我实现,需要花费大量人力成本对其进行扩展与运维。


MSE 服务治理提供了完整的产品化的全链路灰度解决方案,覆盖 RPC、MQ、可观测性等绝大多数场 景。只要架构是基于 Spring Cloud 或者 Dubbo 框架,应用无需升级或代码改动,即可实现企业级全链路灰度功能。

使用前提

第一步:安装 APISIX 相关组件

  1. 安装 APISIX、apisix-ingress-controller、etcd 等组件。

helm repo add apisix https://charts.apiseven.comhelm repo add bitnami https://charts.bitnami.com/bitnamihelm repo updatekubectl create ns ingress-apisixhelm install apisix apisix/apisix \  --set gateway.type=LoadBalancer \  --set ingress-controller.enabled=true \  --set etcd.persistence.storageClass="alicloud-disk-ssd" \  --set etcd.persistence.size="20Gi" \  --namespace ingress-apisix \  --set ingress-controller.config.apisix.serviceNamespace=ingress-apisixkubectl get service --namespace ingress-apisix
复制代码

 

ingress-apisix 命名空间下可以看到无状态的 APISIX 和 apisix-ingress-controller 应用、以及有状态的 etcd 应用。


  1. 使用 Helm 安装 APISIX Dashboard。

helm repo add apisix https://charts.apiseven.comhelm repo updatehelm install apisix-dashboard apisix/apisix-dashboard --namespaceingress-apisix
复制代码

 

  1. 安装完成后,可以绑定一个 SLB。

  2. 通过 {slb-ip}:9000 访问 APISIX Dashboard。



第二步:开启微服务治理


这一步骤中,需要开通 MSE 微服务治理、安装 MSE 服务治理组件(ack-onepilot)并为应用开启微服务治理。具体操作信息可参考阿里云官方教程

第三步:部署 Demo 应用程序


在阿里云容器服务中部署 A、B、C 三个应用,每个应用分别部署⼀个base 版本和⼀个gray 版本;并部署⼀个 Nacos Server 应用,用于实现服务发现。具体可参考此教程完成应用部署:部署Demo 应用程序。部署完成后,你可以通过 APISIX Dashboard 为应用配置 Service 进行上游配置。

应用场景一:按域名进行路由


在部分场景下,可以通过不同的域名来区分线上基线环境和灰度环境。灰度环境有单独的域名可以配置,假设我们通过访问 www.gray.com 来请求灰度环境,访问 www.base.com 走基线环境。



调用链路 Ingress-nginx -> A -> B -> C,其中 A 可以是一个 spring-boot 的应用。

配置 APISIX 路由规则


在 APISIX Dashboard 选择路由并单击创建。匹配条件中域名、请求路径选择 /*,选择对应的上游。分别配置如下路由:

  • hostwww.base.com 时,路由到 id 为 401152455435354748 所对应的上游,即 spring-cloud-a-svc

  • hostwww.gray.com 时,路由到 id 为 401163331936715388 所对应的上游,即 spring-cloud-a-gray-svc


然后进行 base 对应的路由配置:

{  "uri": "/*",  "name": "spring-cloud-a",  "methods": [    "GET",    "POST",    "PUT",    "DELETE",    "PATCH",    "HEAD",    "OPTIONS",    "CONNECT",    "TRACE"  ],  "host": "www.base.com",  "upstream_id": "401152455435354748",  "labels": {  "API_VERSION": "0.0.1"  },  "status": 1}
复制代码

 

进行 gray 对应的路由配置:

{  "uri": "/*",  "name": "spring-cloud-a-gray",  "priority": 1,  "methods": [    "GET",    "POST",    "PUT",    "DELETE",    "PATCH",    "HEAD",    "OPTIONS",    "CONNECT",    "TRACE"  ],  "host": "www.gray.com",  "upstream_id": "401163331936715388",  "labels": {    "API_VERSION": "0.0.1"  },  "status": 1}
复制代码


配置 MSE 全链路灰度


你需要配置完成 MSE 的全链路发布,具体操作细节可参考此教程:配置全链路灰度

结果验证


访问 www.base.com 路由到 A 应用的 base 版本:

curl -H"Host:www.base.com" http://47.97.253.177/aA[172.18.144.15] -> B[172.18.144.125] -> C[172.18.144.90]%
复制代码

 

访问 www.gray.com 路由到 A 应用的 gray 版本:

curl -H"Host:www.gray.com" http://47.97.253.177/aAgray[172.18.144.16] -> Bgray[172.18.144.57] -> Cgray[172.18.144.157]%
复制代码

 

应用场景二:按指定请求参数进行路由


有些客户端无法改写域名,希望能访问 www.demo.com 通过传入不同的参数来路由到灰度环境。例如下图中,通过 env=gray 这个请求参数,来访问灰度环境。



调用链路 Ingress-APISIX -> A -> B -> C,其中 A 可以是一个 spring-boot 的应用。

配置 APISIX 路由规则


在 APISIX Dashboard 选择路由并单击创建。匹配条件中新建高级匹配规则、请求路径选择 /*,选择对应的上游。分别配置如下路由:

  • hostwww.demo.com,请求参数 env=gray 时,路由优先匹配 id401163331936715388 所对应的上游,即 spring-cloud-a-gray-svc

  • hostwww.demo.com 时,路由经会匹配 id401152455435354748 所对应的上游,即 spring-cloud-a-svc


然后进行 base 对应的路由配置:

{  "uri": "/*",  "name": "spring-cloud-a",  "methods": [    "GET",    "POST",    "PUT",    "DELETE",    "PATCH",    "HEAD",    "OPTIONS",    "CONNECT",    "TRACE"  ],  "host": "www.demo.com",  "upstream_id": "401152455435354748",  "labels": {    "API_VERSION": "0.0.1"  },  "status": 1}
复制代码

 

进行 gray对应的路由配置,如下图所示:



{  "uri": "/*",  "name": "spring-cloud-a-gray",  "priority": 1,  "methods": [    "GET",    "POST",    "PUT",    "DELETE",    "PATCH",    "HEAD",    "OPTIONS",    "CONNECT",    "TRACE"  ],  "host": "www.demo.com",  "vars": [    [      "arg_env",      "==",      "gray"    ]  ],  "upstream_id": "401163331936715388",  "labels": {  "API_VERSION": "0.0.1"  },  "status": 1}
复制代码

 

配置 MSE 全链路灰度


配置 MSE 全链路灰度步骤与应用场景一的内容一致。

结果验证


此时,访问 www.demo.com 路由到基线环境:

curl -H"Host:www.demo.com" http://47.97.253.177/aA[172.18.144.15] -> B[172.18.144.125] -> C[172.18.144.90]%
复制代码

 

此时,访问 www.demo.com 同时 env=gray 时路由到灰度环境:

curl -H"Host:www.demo.com" http://47.97.253.177/a?env=grayAgray[172.18.144.16] -> Bgray[172.18.144.57] -> Cgray[172.18.144.157]%
复制代码

 

注意:其中 47.97.253.177 为 APISIX 的公网 IP。

总结


基于 Apache APISIX 灵活的路由能力,配合 MSE 全链路灰度能力,可以快速实现企业级的全链路灰度的能力。


APSIX 支持按照 Header、Cookie、Params、域名等多种方式进行路由,只需要在网关侧根据需求将流量路由至不同的“泳道”环境后,流量在对应标签的“泳道”中自动闭环,当泳道中并不存在调用链中所依赖的其他服务时,流量需要回退至基线环境,进一步在必要的时候路由回对应标签的泳道。

2022-06-08 14:003853

评论

发布
暂无评论
发现更多内容

一文搞懂三级管和场效应管驱动电路设计及使用

不脱发的程序猿

28天写作 电路设计 三极管 3月日更 场效应管

一个合格的CloudNative应用:程序当开源软件编写,应用配置外置

华为云开发者联盟

云原生 华为云 Cloud Native CCE CSE

LeetCode题解:213. 打家劫舍 II,动态规划(不缓存偷盗状态),JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

「面试高频」秒杀架构的设计套路,你值得拥有

我爱娃哈哈😍

架构设计 架构设计实战 秒杀架构

GO训练营第10周——日志&指标&链路追踪

Glowry

2021 年要了解的 34 种 JavaScript 简写优化技术

LeanCloud

JavaScript 面试 大前端

MySQL的锁

一个大红包

3月日更

区块链电子发票平台,区块链电子发票优势

13530558032

快点来学吧!Android性能优化面试题集锦,深度解析,值得收藏

欢喜学安卓

android 程序员 面试 移动开发

如何批量下载YouTube视频到本地

科技猫

软件 音视频 经验分享 资源分享 工具分享

【LeetCode】设计停车系统Java题解

Albert

算法 LeetCode 28天写作 3月日更

跟我学ModelArts丨探索ModelArts平台个性化联邦学习API

华为云开发者联盟

AI 联邦学习 API 华为云 modelarts

拍乐云推出“实时标注”,助力少儿编程、在线金融等行业场景实现高效互动

拍乐云Pano

音视频 在线教育 互动白板 实时标注 在线金融

寻找被遗忘的勇气(十九)

Changing Lin

3月日更

论文免费开源:NB-IoT智慧路灯监控系统

不脱发的程序猿

28天写作 论文 3月日更 NB-IoT智慧路灯 大学生毕业

智慧党建信息管理平台系统建设

13530558032

2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)

比伯

Java 编程 架构 面试 程序人生

电子门锁没电的解决办法

孙叫兽

生活 程序人生 电子锁

EGG Network公链技术创新,EFTalk打造高效全能公链

币圈那点事

区块链

冲击大厂!阿里P9纯手打Java面试小抄(21版)在GitHub上已获80万star

Java 程序员 面试

干货 | 万字详解整个数据仓库设计体系

五分钟学大数据

大数据 数据仓库 28天写作 3月日更

Python 生成 QR 二维码

HoneyMoose

使用“零信任”,不惧“内部威胁”!

龙归科技

管理 数据完整性 零信任 内部威胁

源中瑞智慧社区解决方案,社区服务平台

13530558032

Java 和 Python 关于 % 的那些坑

与你一起学算法

Java Python

在线数据迁移,数字化时代的必修课 —— 京东云数据迁移实践

京东科技开发者

数据库 数据迁移

安卓嵌入式底层开发!整理出这份8万字Android性能优化实战解析,已开源

欢喜学安卓

android 程序员 面试 移动开发

【前端面试题】关于一些js的一些面试题(金融行业),我和面试官扯了三个小时

孙叫兽

JavaScript 大前端 金融 笔试题

收藏!Linux常用命令合集

roseduan

Linux

Java面试必看!阿里(嵩山版)分布式核心原理笔记来了

Java架构追梦

Java 阿里巴巴 架构 面试 架构分布式

2B营销路径: 9大步骤自我拆解

boshi

营销数字化 七日更

阿里云MSE基于Apache APISIX的全链路灰度方案实践_语言 & 开发_泮圣伟_InfoQ精选文章