微服务全链路灰度新能力

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发版依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。

作者:十眠、洵沐


背景


微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发版依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。在发布过程中,我们只需部署服务的灰度版本,流量在调用链路上流转时,由流经的网关、各个中间件以及各个微服务来识别灰度流量,并动态转发至对应服务的灰度版本。如下图:


1.png


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


全链路灰度能力提升了微服务架构带来的快速迭代、稳定性验证的优势,给企业生产环境的系统带来了真真切切的好处。本文将着重介绍 MSE 服务治理基于全链路灰度能力的应用场景与痛点延伸出来了新的能力。


全链路之运行时白屏化能力


在我们生产环境使用全链路灰度的过程中,我们常常会遇到一些问题。


  • 我们配置全链路灰度的流量流向是否符合预期,我们的流量是否按照我们配置的灰度规则进行匹配。


  • 我们灰度的流量出现了大量的慢调用、异常,我该如何确定是我们新版本代码的业务问题还是因为我们在流量灰度过程中考虑不全导致的系统问题,如何快速定位问题,从而实现高效的迭代。


  • 在我们设计灰度系统的过程中,我们需要考虑如何对我们的灰度流量进行打标,有些时候在入口应用、微服务接口出可能难以找到合适的流量特征(参数、headers 等携带的具备业务语义的标识),在这样的场景下我们如何快捷地对我们的流量进行打标。 


基于以上一些列的问题,也是我们在支持云上客户落地全链路灰度的过程中不断碰到的问题。运行时白屏化能力也就是我们在这个过程中抽象设计出来的一个能力。


运行时白屏化的目的是为了帮助我们洞察全链路灰度的流量匹配以及运行的行为。


我们基于流量路由的规则将运行时白屏化规则抽象为如下:


WhiteScreenRule = Taget + Action


2.png


Target:


  • ResourceTarget: 目标接口,支持Web、Rpc 以及自定义方法

3.png


  • WorkloadTarget: 目标实例,可以选择所有机器或指定机器 IP

4.png


  • TrafficCondition: 是否仅针对异常、慢调用、全链路灰度标签


5.png


Action:


  • 相关上下文诊断信息的收集
  • 后续链路进行流量染色
  • 后续链路是否日志打印 


6.png


下面我们来详细看一下如何运用运行时白屏化能力解决我们在全链路灰度过程中遇到的问题。


灰度流量的匹配以及流向是否符合预期


7.png


针对如上场景我们只需配置 Zuul 应用入口的白屏化匹配规则即可:


8.png


我们可以快速观察到全链路中灰度流量的参数、返回值、headers 等特征属性。我们也可以快速发现全链路是否符合预期以及定位不符合预期的原因。


9.png


全链路之配置灰度


除了微服务实例和流量的灰度,微服务应用中的配置项也应该具备相应的灰度能力,以应对灰度应用对特殊配置值的诉求。


微服务应用通常会引入配置中心做配置管理,其提供动态的配置推送能力使得应用无需重启就可以动态地改变运行逻辑。但配置中心的管理维度仅仅是配置项本身,并不能感知到前来获取配置的服务实例的环境信息,即无法区分请求配置的是正式环境的实例还是灰度环境的实例。在这种背景下,如果某项配置在正式环境和灰度环境中需要使用不同值,它们在配置中心中必须作为不同的配置项,我们可能需要写出这样的代码:


...
if (env == "gray") {
    cfg = getConfig("cfg-1");
} else if (env == "gray2") {
    cfg = getConfig("cfg-2");
} else {
    cfg = getConfig("cfg-base");
}
...


这一场景在 A/B 测试中非常常见。随着配置项和灰度环境的增加,这类代码还会重复许多次。此外,一套灰度环境中往往存在多个服务,每个服务都需要独立维护一套类似的代码。最终的解决方案如图所示,同一配置项在不同环境中使用的配置值需要在用户应用中主动进行区分。


10.png


究其原因,还是来自于配置中心无法感知服务实例的环境信息,使得我们必须在代码中代替配置中心行使这一任务,从而导致了环境信息对业务代码产生了侵入。


针对这一问题,MSE 的配置标签推送功能将配置管理场景下的环境信息的感知下沉到平台侧,由 Agent 负责。用户只需接入 MSE,就可轻松在全链路灰度场景中使用配置推送能力,免去业务代码中繁琐的环境信息检测逻辑。如图所示:


11.png


具体操作步骤可以参考微服务治理实战派:https://help.aliyun.com/practice_detail/447313


步骤一:还原线上场景


我们将部署 spring-cloud-zuul、spring-cloud-a、spring-cloud-b、spring-cloud -c 四个业务应用和注册中心 Nacos Server。其调用链路如下:


12.png


这些应用都是最简单的 Spring Cloud 和 Dubbo 应用,您可以在下方链接获取到项目源码:


https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demo


登录 MSE 治理中心控制台,在左侧导航栏单击应用治理,输入 cfg-spring-cloud-a ,点击搜索图标。选择 cfg-spring-cloud-a 应用卡片,可进入应用详情页面。


接着在左侧导航栏选择应用配置 > 配置列表,点击开关 configValue 前的 + ,可以看到此时 A 应用中基线版本和灰度版本的配置值相同,均为应用中的初始值。


13.png


步骤二:配置应用 spring-cloud-a 的灰度规则


在 cfg-spring-cloud-a 的应用详情页中,选择左侧导航栏的流量治理,点击标签路由如图:


14.png


接着我们为灰度实例配置灰度规则。点击标签 gray >流量规则 > 添加,配置如下的灰度规则,点击确定。


15.png


步骤三:验证配置灰度


接下来我们来验证配置灰度。


1. 对灰度实例执行标签推送


回到 cfg-spring-cloud-a 的应用详情页的应用配置 > 配置列表,选择开关 configValue 后的按标签推送。在弹窗中选择标签 gray,并设置灰度环境中的配置值。


16.png


之后点击下一步:值对比,再点击标签推送,完成推送。此时在控制台上可以看到灰度实例的配置值已经变为了我们刚刚设置的值。


17.png


2. 验证配置灰度生效


登录容器服务控制台,点击左侧导航栏的集群 ,进入部署了应用的集群。在集群详情页中选择网络 > 服务,找到 zuul-slb,点击其外部端点,访问服务调用页面。


输入 /A/a ,可以访问到基线版本的 A 应用,可以看到其配置值仍为初始值。


18.png


输入 /A/a?name=xiaoming ,可以通过刚刚配置的灰度规则访问到灰度版本的 A 应用,可以看到其配置值已经变为了我们刚刚推送的值。


19.png


3. 验证灰度配置值的持久性


标签推送的配置值是持久化的。这意味着即使灰度环境中的应用重启也能自动从 MSE Agent 获取到之前推送的配置值。


登录容器服务控制台,点击左侧导航栏的集群 ,进入部署了应用的集群。在集群详情页中选择工作负载 > 无状态。勾选 spring-cloud-a-gray 负载,点击批量重新部署。您也可以使用 kubectl 工具进行负载重部署,模拟灰度应用重启的过程。


应用重启完成后,重新执行上一步中访问灰度应用的流程,可以发现配置值仍然为之前推送的配置值。


总结


本文介绍了基于全链路灰度延伸出来的运行时白屏化、配置灰度等能力,完善全链路灰度的场景,进一步提升了全链路灰度的易用性。全链路灰度是微服务治理中比较重要的一个场景,MSE 的全链路灰度能力还在随着客户场景的深入而不断扩展与迭代,我们需要持续地投入把这样一个重要的场景做深做透做到更加易用,可以预见的关于全链路灰度能力的打磨我们还有很多的路要持续探索,目前全链路灰度已经有近百家企业使用,我们一直相信只有经过客户持续打磨的产品才会愈发历久弥新。如果您也感兴趣,欢迎使用与体验。


MSE 云原生网关预付费、MSE 注册配置预付费首购 8 折,首购 1 年及以上 7 折。点击阅读此处,即享优惠!

相关文章
|
Kubernetes 测试技术 数据库
详解微服务应用灰度发布最佳实践
相对于传统软件研发,微服务架构下典型的需求交付最大的区别在于有了能够小范围真实验证的机制,且交付单位较小,风险可控,灰度发布可以弥补线下测试的不足。本文从 DevOps 视角概述灰度发布实践,介绍如何将灰度发布与 DevOps 工作融合,快来了解吧~
33017 19
|
Serverless 应用服务中间件 Nacos
微服务引擎 MSE 全新升级,15 分钟快速体验微服务全栈能力
微服务引擎 MSE 全新发布,从开发态到最终上云运行态,提供了 15 分钟快速入门,免费试用,高效迁移工具,服务自治体系等全方位的支持和解决方案, 让我们一同探索 MSE 的全新特性,开启微服务开发的新篇章!
微服务引擎 MSE 全新升级,15 分钟快速体验微服务全栈能力
|
自然语言处理 Cloud Native 安全
下一代软件架构,如何构建微服务核心能力
下一代软件架构,如何构建微服务核心能力
516 69
|
Serverless 应用服务中间件 Nacos
微服务引擎 MSE 全新升级,15 分钟快速体验微服务全栈能力
微服务引擎 MSE 全新升级,15 分钟快速体验微服务全栈能力
19083 72
|
负载均衡 Java 测试技术
面试官:说说微服务灰度发布的底层实现?
面试官:说说微服务灰度发布的底层实现?
297 1
面试官:说说微服务灰度发布的底层实现?
|
监控 Cloud Native 容灾
下一代软件架构该如何搭建微服务核心能力
随着数字化时代的来临,各种架构设计思想确实如雨后春笋般涌现,给软件开发领域带来了百家齐放的局面,但是软件开发领域也正面临着前所未有的挑战,比如微服务架构、云原生架构、Serverless架构、事件驱动架构、中台架构、容灾架构等,都在不同场景下展现出了独特的优势。尤其是从事云原生领域的开发者来说更有发言权,因为在裁员潮来临的时候,科技公司先要“下手”的就是云原生、容器化等领域。但是话又说回来,传统的单体应用架构已经无法满足现代软件需求的快速变化和高可靠性要求,在这种情况下,微服务架构作为一种分布式系统设计方法,逐渐受到技术圈的关注和应用。那么本文就来简单聊聊下一代软件架构如何搭建微服务的核心能力
134 2
下一代软件架构该如何搭建微服务核心能力
|
自然语言处理 Cloud Native 安全
下一代软件架构,如何构建微服务核心能力
本文整理自阿里云微服务负责人李艳林在 2023 云栖《下一代软件架构,如何构建微服务核心能力》的分享。
54155 10
|
Web App开发 Cloud Native 数据安全/隐私保护
基于云原生网关实现微服务的多版本线上灰度
一起体验云原生网关开箱即用的微服务多样灰度能力,支持容器服务、Nacos、ZooKeeper、Edas等多种服务发现方式。
|
Kubernetes Cloud Native Serverless
基于MSE实现微服务的全链路灰度
本场景提供MSE Ingress网关集群和Kubernates集群,部署Demo服务。您将掌握支持Spring Cloud/Dubbo、云原生网关的全链路灰度方案。
|
运维 供应链 负载均衡
《云原生架构容器&微服务优秀案例集》——03 零售/电商——震坤行 基于云原生高效提升应急供应链管理能力
《云原生架构容器&微服务优秀案例集》——03 零售/电商——震坤行 基于云原生高效提升应急供应链管理能力
195 0
《云原生架构容器&微服务优秀案例集》——03 零售/电商——震坤行 基于云原生高效提升应急供应链管理能力