AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

阿里云 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:004010

评论

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

Hadoop 企业级生产调优手册 (二)

大数据技术指南

11月日更

不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

为什么要做漏洞扫描呢?

华为云开发者联盟

安全 风险 漏洞 漏洞扫描 安全认证

owasp zap 暴力破解测试

喀拉峻

网络安全 安全 信息安全

Python 可以满足你任何 API 使用需求

华为云开发者联盟

Python API 程序 网络通信 公共数据

技术解析+代码实战,带你入门华为云政务区块链平台

华为云开发者联盟

区块链 华为云 政务 Baas 异构链

Alibaba5轮视频面:同事+组长+主管+项目+HR,收割Java岗offer

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

掌握这些核心算法,拿不到10个offer你来找我,我锤你个不争气的

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

react源码解析2.react的设计理念

buchila11

React React Hooks

网络安全是一门高级学科,如何入门,看这里!

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

“退微信群”谣言背后:总有人用阴谋论湮没常识

脑极体

模块六作业

bob

「架构实战营」

大专毕业的我狂刷29天“阿里内部面试笔记”最终直接斩获十七个Offer

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

智慧警务系统开发,警务通app搭建

电微13828808271

系统架构性能优化思路

五分钟学大数据

11月日更

5年crud经验,三个月啃透888页Java王者级核心宝典,竟翻身阿里p6

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

46道史上最全Redis面试题,面试官能问的都被我找到了(含答案)

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

Go语言学习查缺补漏ing Day9

Regan Yue

Go 语言 11月日更

深入了解Netty原理篇

邱学喆

Netty

写代码的思路

king

五面阿里拿下飞猪事业部offer,2021新鲜出炉阿里巴巴面试真题

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

GitHub标星139K的:“嵌入式Linux系统开发教程”

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

微博评论高性能高可用的设计

云里雾花

质量基础设施“一站式”平台,NQI一站式云平台开发

电微13828808271

数据网格简史

俞凡

架构 数据

基于实践:一套百万消息量小规模IM系统技术要点总结

JackJiang

网络编程 架构设计 即时通讯 IM

比较 Flutter 日期选择器库【Flutter专题6】

坚果

flutter 签约计划第二季

精选2021年大厂高频Java面试真题集锦(含答案),面试一路开挂

热爱java的分享家

Java 架构 面试 程序人生 经验分享

六年Java老鸟,写给1-3年程序员的几点建议,满满硬货指导

热爱java的分享家

Java 架构 面试 程序人生 编程语言

DDD与CQRS的关系

Bruce Talk

领域驱动设计 DDD

Flutter 中的一切都是一个小部件【Flutter专题5】

坚果

flutter 签约计划第二季

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