作者:卜比

什么是全链路灰度

微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发版依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。

在发布过程中,我们只需部署服务的灰度版本,流量在调用链路上流转时,由流经的网关、各个中间件以及各个微服务来识别灰度流量,并动态转发至对应服务的灰度版本。如下图:

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

基本概念

  • 泳道:一条虚拟的流量路径,比如上图中标签 1 的流量,就属于一个泳道

  • 基线环境:承载所有流量,比如某个服务,没有标签 1 节点,那么就会回退到基线环境

  • 流量回退:某个服务,没有标签 1 节点,那么就会回退到基线环境,这个行为叫流量回退

  • 泳道组:为便于理解,流量涉及应用以及其泳道,称为泳道组。

全链路灰度的应用场景

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

构造日常、开发、项目、测试等多套环境的“泳道”,每个项目环境都有唯一的一个项目标签,流量带上这个项目标签后会路由到该项目环境,否则会去主干环境。如果没有这套机制,开发环境要进行物理隔离,这就需要部署整套微服务架构,成本非常高。

全链路灰度发布

线上所有应用部署灰度版本,灰度流量全部进入灰度版本,正常流量进入生产版本。灰度版本只针对灰度流量验证,有效减少风险。云上客户安 x 就有这样的场景,要灰度发布 N 个应用,想灰度流量在这 N 个应用的灰度版本之间路由。

高可用/临近路由

业务高可用部署后,服务调用如果跨机房,会带来额外的调用延迟。开启同机房优先路由后, 让 Consumer 服务调用优先选择相同机房的 Provider,降低 rt。

全链路压测

直接使用线上环境压测,让压测流量的 DB 操作落库到影子表,Redis 落到影子 KEY,MQ 落到影子 TOPIC。如果没有路由能力,需要搭建一套仿真的线上环境用于压测,成本直线上升。用线上环境配合流量控制能力可以实现 0 机器成本,0 维护成本完成全链路压测。

涉及技术

那么全链路灰度具体是如何实现呢?我们需要解决以下问题:

1.链路上各个组件和服务能够根据请求流量特征进行动态路由 (标签路由)

2.需要对服务下的所有节点按照标签分组,能够区分版本 (节点打标)

3.需要对流量进行灰度标识、版本标识,并向下传递 (标签传递)

  1. 除了对 RPC/HTTP 调用需要按照标签灰度,对 DB、消息、分布式任务也需要按照标签灰度(消息灰度、数据库灰度)

标签路由

在云原生环境下,由于节点的生命周期缩短,IP 变化,导致原来按照 IP 来设置路由规则的方式不再适用。所以,标签是云原生环境下的一等公民。

不论节点、流量、还是消息,都不再通过 IP、节点来标记,运维开发同学只需要关注标签就可以。

在不同的上下文中,有不同的标签值,可以带来不同的业务场景。

比如当标签值是可用区的时候,就可以实现临近路由;当标签值是版本的时候,就可以据此实现金丝雀发布、全链路灰度等。

节点打标

在云原生环境下,尤其是典型的 K8s 部署模式下,我们可以通过 labels 来给一组 pod/workload 打标,这样就能通过标签来标记、查找节点。比如 K8s 的 service 就依赖了 label;阿里云微服务引擎(MSE)也使用 label alicloud.service.tag 来设置节点标签。

当然,业务上肯定也有一些应用不是 K8s 部署的,所以节点打标也需要支持非 K8s 环境。

在非 K8s 环境中,可以通过环境变量、系统参数、文件等方式标记节点的标签,然后把这些标签注册到注册中心,consumer 在调用的时候,可以根据这些标签来实现路由逻辑。

标签传递

在整个的微服务调用中,我们希望流量上的标能够一直传递下去,其一是回溯流量来源,其二是可以在任意节点上依据流量做灰度。

在 OpenTelemetry 之前,可以通过自定义 Header 来实现流量标签透传,比如 MSE 就使用了 x-mse-tag header。

OpenTelemetry 引入了 Baggage 概念,可以通过标准方式来添加 Header。

上述两种技术,都实现了流量标签的传递。

消息灰度、数据库灰度

比如在上图中,以 RocketMQ 为例,C 应用生产消息,A 应用消费消息,那么如何做到 C 应用的 gray 节点的消息,只能被 A 应用的 gray 节点消费。

首先,要给消息打标。gray 节点生产的消息,可以通过 userProperty 特性,添加额外 property 来给消息打标。

其次,要按照标签消费消息。gray 节点消费消息的时候,可以通过 SQL92 Filter 特性,只筛选特定标签的消息。

使用 Shenyu 网关,实现全链路灰度

部署 Apache Shenyu 网关

Apache Shenyu 网关分为 shenyu-admin(用于规则管控)和 shenyu-bootstrap(用于处理流量)。

  1. 按照 Apache Shenyu 的说明文档 [ 1] ,依次创建 shenyu 命名空间、shenyu-cm ConfigMap。

  2. 按照 Apache Shenyu 说明文档,依次创建 shenyu-admin-svc Service 和 shenyu-admin Deployment。

  3. 由于我们需要再安装 Spring Cloud 插件,所以采用手动部署模式:

  • 创建 spring-boot 项目,名字叫 shenyu-bootstrap [ 2] ,添加 shenyu-spring-boot-starter-plugin-springcloud 等相关依赖。

  • 在 application.yaml 中配置,shenyu.sync.websocket.urls 为 ws://shenyu-admin-svc:9095/websocket,接收 shenyu-admin 的配置。

  1. 访问 shenyu-admin,打开 Spring Cloud 插件。

部署微服务 demo

mse-simple-demo 分为 A、B、C三个应用,依次调用各自目录下的 build.sh 构建镜像。

然后创建 values.example.yaml,在其中配置好镜像地址、注册中心地址后,执行 helm 命令安装部署:

helm3 upgrade mse-simple-demo1 helm/mse-simple-demo \--namespace shenyu --create-namespace \--install \--values helm/mse-simple-demo/values.example.yaml

按照 demo 部署好后,可以在 shenyu-admin 上,看到 sc-A 已经注册到网关了:

此时默认没有任何流量规则,A->B->C 调用链路默认都走基线环境:

设置规则

首先,创建 shenyu-demo 泳道组,选择 shenyu-bootstrap 作为流量入口,A、B、C 作为泳道组应用。

接下来配置规则,例如有参数 name=xiaoming 的,我们认为是灰度流量,走 gray 标签的泳道:

验证

然后我们访问网关,带上 name=xiaoming,发现 A 应用和 B 应用都走到了 gray 节点,C 应用因为没有 gray 节点,走到了基线节点:

OpenSergo 开源微服务治理标准

随着微服务架构的普及,微服务治理的概念也越来越被更多人认知,微服务治理的标准化、治理数据面的多样性、多语言支持等也越来越迫切。

我们观察到了这个趋势,发起了 OpenSergo [ 3] 项目,致力于制定微服务治理的标准及参考实现。

其中,全链路灰度作为基本能力,目前 OpenSergo 也在制定相关标准,包括如何给机器打标、给流量打标、如何路由等。

总结

MSE 全链路灰度能力,提供了全链路隔离流量泳道能力,企业和开发这可以通过全链路灰度能力,提供端到端的稳定基线环境、流量一键动态切流、全链路的可观测能力。

此外,MSE 微服务治理具备无倾入接入能力,基于 Java Agent 技术,实现无需修改一行业务代码就能接入。具备无损上下线能力,使得业务发布更加丝滑。

接下来,MSE 全链路灰度,将会支持更多基础设施(数据库、消息等),支持更多语言、更多接入模式,为企业和开发者提升开发、运维效率。

相关链接

[ 1] Apache Shenyu 的说明文档:

https://shenyu.apache.org/zh/docs/deployment/deployment-k8s/

[2] shenyu-bootstrap的源码链接:

https://github.com/aliyun/alibabacloud-microservice-demo/tree/apache-shenyu-integration/mse-simple-demo/shenyu-bootstrap

[3] OpenSergo:

https://github.com/opensergo/opensergo-specification/issues/9

MSE 支持 Apache Shenyu 网关实现全链路灰度相关推荐

  1. 全链路灰度新功能:MSE上线配置标签推送

    为什么需要配置标签推送 从全链路灰度谈起 在微服务场景中,应用的灰度发布迎来了新的挑战.不同于单体架构中将应用整体打包即可发布测试版本,微服务应用往往由多个服务组合而成.这些服务通常由不同的团队负责, ...

  2. 企业深入使用微服务后会面临哪些问题?云原生全链路灰度给了新思路

    作者:魁予.十眠 如何落地可灰度.可观测.可回滚的安全生产三板斧能力,满足业务高速发展情况下快速迭代和小心验证的诉求,是企业在微服务化深入过程中必须要面对的问题.在云原生流行的当下,这个问题又有了一些 ...

  3. 全链路灰度这样做,新需求迭代上线也能放心干饭

    作者:泮圣伟(十眠) 概要 ​全链路灰度是微服务最核心的功能之一,也一直是云上客户在微服务化深入过程中必须具备的功能.全链路灰度因为涉及到的技术.场景众多,如果云上企业一一自己实现,需要花费大量人力成 ...

  4. 如何用20分钟就能获得同款企业级全链路灰度能力?

    简介:MSE 微服务引擎将推出服务治理专业版,提供开箱即用且完整专业的微服务治理解决方案,帮助企业更好地实现微服务治理能力.如果您的系统也可以像本文描述的那样,快速具备完整的全链路灰度能力,并基于该能 ...

  5. 微服务全链路灰度新能力

    背景 微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发版依赖多个服务同时升级上线.我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网 ...

  6. 深入剖析全链路灰度技术

    作者:扬少 当服务有新版本要发布上线时,通过引流一小部分流量到新版本,可以及时发现程序问题,有效阻止大面积故障的发生.业界上已经有比较成熟的服务发布策略,比如蓝绿发布.A/B 测试以及金丝雀发布,这些 ...

  7. 基于 Istio 的全链路灰度方案探索和实践

    作者|曾宇星(宇曾) 审核&校对:曾宇星(宇曾) 编辑&排版:雯燕 背景 微服务软件架构下,业务新功能上线前搭建完整的一套测试系统进行验证是相当费人费时的事,随着所拆分出微服务数量的不 ...

  8. 通过云效 CI/CD 实现微服务全链路灰度

    作者:卜比 在发布过程中,为了产品整体稳定性,我们总是希望能够用小部分特定流量来验证下新版本应用是否能正常工作. 即使新版本有问题,也能及时发现,控制影响面,保障了整体的稳定性. 整体架构 我们以如下 ...

  9. 分布式全链路灰度发布的探索与实践

    简介:在分布式系统中,由于分布式全链路灰度发布因其链路复杂.技术门槛高.落地难度高逐渐成为金融科技实现全链路灰度发布的难点所在.工行在分布式系统建设方面一直走在同业前列,积极探索分布式全链路灰度发布, ...

  10. 工商银行顾欣:分布式全链路灰度发布的探索与实践

    作者|顾欣 互联网金融时代下,金融产品和服务模式不断创新,金融系统容量需求急剧增长,为进一步满足运维标准提升工作的需求,提升服务连续性水平.中国工商银行(后简称工行)从 2014 年开始分布式架构转型 ...

最新文章

  1. matlab丢失icuuc54,icuuc56.dll下载|
  2. 对par.markdown解析进行完善
  3. 用 TS + Vue 写了一个在 Chrome 中运行 Prettier 格式化的扩展程序
  4. objective-c 中字符串与日期相互转换
  5. java方法重载和重载方法_Java 8的方法参考进一步限制了重载
  6. 状态模式 处理订单状态_将状态机模式实现为流处理器
  7. Shell十三问总结
  8. gson 不忽略空_仅在不为null或不为空的情况下,Gson序列化字段
  9. Python之路--Django--auth认证系统
  10. 时空、维度,以及其他(二)
  11. 比 Navicat 还要好用,功能还很强大的数据库管理工具!
  12. 架构师,你需要了解的git知识都在这里了
  13. 圆透视变换为椭圆,其缩放比例如何求?
  14. 完成你的第一个智能无人机
  15. java堆和栈分别存什么类型_栈、堆、方法区分别存储什么内容
  16. 对计算机系学生的七个建议
  17. 笨办法学习python应该看第几版_笨办法学习python
  18. csp202112-2:序列查询新解 题解
  19. 价格表制作软件使用方法
  20. 华硕fx80ge安装linux,华硕FX80GE火陨版(i7 8750H)笔记本u盘重装系统win8教程

热门文章

  1. 异名一文带你读懂Chrome小恐龙跑酷!
  2. laravel 文档
  3. JS动态添加元素绑定点击事件,触发事件多次执行问题?
  4. 搭建sip软电话环境
  5. 精打视频教程(10)菜鸟电子面单打印与发货
  6. 如何打造成功的数据归档策略
  7. DS18B20温度传感器(STM32F103C8T6)
  8. 三星电脑打开虚拟服务器,三星笔记本进BIOS后怎么开启CPU虚拟化
  9. Web视频上添加文字
  10. p9plus升级鸿蒙,华为P9 Plus(VIE-AL10 EMUI 8.0)手机完美获取root教程,最强root工具,亲测可用!...