背景

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

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

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

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

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

  • 我们配置全链路灰度的流量流向是否符合预期,我们的流量是否按照我们配置的灰度规则进行匹配。
  • 我们灰度的流量出现了大量的慢调用、异常,我该如何确定是我们新版本代码的业务问题还是因为我们在流量灰度过程中考虑不全导致的系统问题,如何快速定位问题,从而实现高效的迭代。
  • 在我们设计灰度系统的过程中,我们需要考虑如何对我们的灰度流量进行打标,有些时候在入口应用、微服务接口出可能难以找到合适的流量特征(参数、headers 等携带的具备业务语义的标识),在这样的场景下我们如何快捷地对我们的流量进行打标。

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

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

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

WhiteScreenRule = Taget + Action

Target:

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

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

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

Action:

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

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

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

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

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

全链路之配置灰度

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

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


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

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

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

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

步骤一:还原线上场景

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

这些应用都是最简单的 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 应用中基线版本和灰度版本的配置值相同,均为应用中的初始值。

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

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

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

步骤三:验证配置灰度

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

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

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

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

2. 验证配置灰度生效

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

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

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

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

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

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

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

总结

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

作者:十眠、洵沐

原文链接

本文为阿里云原创内容,未经允许不得转载。

微服务全链路灰度新能力相关推荐

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

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

  2. 服务百万商家的系统,发布风险如何规避?微盟全链路灰度实践

    一分钟精华速览 全链路灰度发布是指在微服务体系架构中,应用的新.旧版本间平滑过渡的一种发布方式.由于微服务之间依赖关系错综复杂,一次发布可能会涉及多个服务升级,所以在发布前进行小规模的生产环境验证,让 ...

  3. 微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

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

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

  5. 主流微服务全链路监控系统之战

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料!问题背景随着微服务架构的流行,服务按照不同的维度进行拆分,一次 ...

  6. 异步服务_微服务全链路异步化实践

    1. 背景 随着公司业务的发展,核心服务流量越来越大,使用到的资源也越来越多.在微服务架构体系中,大部分的业务是基于Java 语言实现的,受限于Java 的线程实现,一个Java 线程映射到一个ker ...

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

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

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

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

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

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

最新文章

  1. 事务隔离性与隔离级别
  2. python电商爬虫源码_吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据...
  3. linux下shell显示-bash-4.1$ 不显示路径解决方法
  4. Redis(三):Redis基础知识与常用命令
  5. Lock的tryLock(long time, TimeUnit unit)方法
  6. 拆箱装箱有什么作用JAVA_基础--最简单明了的拆箱装箱解释,带实例
  7. php7安装redis扩展和memcache扩展
  8. TimeLine下载地址
  9. 70 万行代码、历时 20 年,一名程序员写出的史诗般的计算机程序
  10. scara机器人dh参数表_机器人之DH参数例子-SCARA机器人
  11. Mobile Terminal 316s-7 使用技巧
  12. 判断推理——逻辑判断
  13. 无权更改wlan网络android,Jami | F-Droid - Free and Open Source Android App Repository
  14. getMonth()方法
  15. PPT 将图片的白色部分透明化
  16. 如何抢功,甩锅,立于不败之地???
  17. 沃通PDF签名证书 保障电子发票真实有效
  18. new FileReader()
  19. 滑动窗口与双指针的区别
  20. Racket编程指南——20 并行

热门文章

  1. 解放双手,一键自动完成2022京东618任务
  2. nginx 容错机制
  3. 哪个企业邮箱海外收发邮件好用呢?
  4. 【python--教程】二进制运算符
  5. BERT文本分类实战
  6. 10.20-smbus
  7. 移动端web开发技巧 -- 转载
  8. Thread的interrupt()方法排雷
  9. python怎么下载网络歌曲_python 3 网络下载百度歌曲
  10. STM32F103外部中断