开发者学堂课程【微服务治理技术进阶:【直播】基于微服务 MSE 最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1033/detail/15321
【直播】基于微服务 MSE 最佳实践
内容介绍:
一、全链路灰度能力的应用场景
二、如何使用 MSE 全链路灰度
三、基于消息队列 RocketMQ 实现全链路灰度
总结
本节内容讲解 MSE 全链路灰度产品化升级的功能
大纲
1、全链路灰度产品化简介
2、如何使用 MSE 全链路灰度
3、基于消息队列 RocketMQ 实现全链路灰度
总结
一、全链路灰度产品化简介
全链路灰度能力的应用场景
软件其实是以一个持续迭代的方式进行不断演进的,在某种程度上我们并不担心软件不完善,而是担心软件迭代速度太慢从而影响了完善的速度。所以如何快速、安全地验证新的软件版本在分布式软件领域一直是大家所关心并探索的。
泳道概念在分布式软件领域并不陌生,接着讲解基于泳道能力的全链路灰度的产品化升级。基于该能力可以做:
·多环境隔离
·全链路灰度
·关键业务重保
全链路灰度涉及领域
· RPC: 微服务之间的路由(如果是 java 体系涉及到 Double 等主流的微服务框架,多语言涉及到 threemesh,一些例如端云互联的场景以及线上流量的 debug。本地可以通过跳板机或网络通道将本地服务注册到注册中心,同时希望线上的流量当满足路由规则后可以路由到本地的服务。
本地服务对于一些线上流量再进行 debug,不满足线上规则的流量重新回到线上的实例。以及日常环境隔离等场景)
· MQ(例如在全链路压测场景下希望压测流量发送消息到影子的 topic 能压缩流量只订阅影子的 topic。以及在流量隔离全链路灰度的场景下会使用相同的 topic,线上的流量会订阅线上的消息;隔离的流量只订阅隔离的灰度消息。)
· Database(例如全链路压测场景希望压测的流量数据只落到影子表上,以及在高可用切流的场景下希望禁止数据库的操作,以及单元化的场景下如果流量没有单元标希望禁止数据库操作。)
· Redis(全链路压测场景下压测流量缓存落库到影子的 key 上。例如在高可用切流的场景下会禁止缓存操作,单元化下流量没有单元标禁止缓存。)
·分布式任务调度(例如 XXL-JOB,对于任务调度,希望灰度环境提交的任务可以被调度到灰度环境的机器上执行。)
·前端(前端的全链路灰度希望对于不同的客户看到的页面信息不一致,从而实现一个灰度的能力。)
·可观测性(通过可观测性来监控流量的走向,查看流量的逃逸情况,通过可观测来做到一目了然。)
全链路灰度特点
如图是一个全链路灰度产品化的一个简单界面。有以下几点特点:
只要架构基于 spring cloud 应用就无需升级,无需代码改动就可以完成企业级的全链路灰度能力。
·全链路隔离流量泳道(通过流量规则对所需要的流量进行染色,同时染色的流量会自动路由到灰度机器上。灰度流量会携带灰度标从而往下传递形成灰度专属的一个流量泳道。如果没有灰度环境,应用会默认选择一个未达标的基线环境)
·端到端的稳定基线环境(基于条件1后就会有一个端到端的稳定基线环境。如果是没有达标的应用就属于基线稳定版本的应用就是稳定的线上应用。首先发布灰度代码,然后就可以通过配置一些规则从而引入线上的一些特定的流量,从而控制刚才发布的灰度版本的代码的风险。)
·流量一键动态切流(当泳道规则配置后就可以按照需求一键停启,增删改查实时生效,对于引流更加便捷。)
·可观测能力(MSE 的全链路灰度具备一个泳道级别的单应用的可观测能力,同时具备全链路的可观测能力,我们可以从全局的视角来观察流量是否存在逃逸的情况。对于是否灰度的情况做到一目了然。)
·低成本接入,基于 Java Agent 技术实现无需修改一行业务代码(MSE 治理能力会基于 Java Agent 字节码增强的技术实现。对于用户不需要修改一行代码就可使用,不需要改变业务的现有架构,随时做到一个可上可下没有绑定的一个效果。只需要开启 MSE 专业治理服务版,在线配置一些泳道的规则就可以实时生效)
·具备无损上下线能力,使得发布更加丝滑(应用只需要开启 MSE 服务治理后就会自动具备无损上下线能力,即使在大流量的发布、扩容、回滚等场景下,都可以保证流量的无损)
以上是全链路灰度的特点,下面简单介绍全链路灰度的发布方案。
我们可以对线上的流量隔离出10%的流量,从而引入到一个灰度环境中。过程中可以看到,未打标的线上稳定环境如果要发版或者隔离出一个灰度环境需要先给灰度应用打上一个 tag 标,然后在入口 Nginx 层将10%的流量引入到 tag1 环境中,然后只需要对上面的 tag1 环境开启一个泳道从而就能实现一个常态化的流量隔离。这是全链路灰度发布方案的一个模型,基于该模型我们做了一个实现产品化泳道的能力。下面使用一个客户的案例进行简单介绍。
来电科技全面容器化的优势
来电科技是 2014年开始进入一个共享充电领域的,定义并且开创了行业,属于行业内最早的一个共享充电的企业,主要业务覆盖例如像充电宝的自动租借以及定制化商场、导航机开发、广告展示以及一些广告传播的服务。来电科技其实是利用立体化的产品线,到目前为止在已经超过90%的城市实现业务落地,注册用户超过两亿,已经实现了全场景的业务需求。
来电科技发展快,业务的发展导致它的升级,首先在全面容器化的场景下带来了以下优点
1、部署方便,发布效率大大提高
2、秒级扩缩容自动恢复
3、大大节约服务器成本稳定性增强
运维成本大大降低
来电科技微服务治理落地的困局
安全变更三板斧(对于安全生产有一个三板斧的要求):可灰度、可监控、可回滚
安全变更:发布/回滚、监控对比、灰度发布、性能压测、自动化回归、持续集成、GitOps
在该场景下出现的科技有以下痛点:
1、在系统服务的发布工程中如何避免业务流量的损失
2、系统缺少简单有效的灰度能力,每次系统发布都存在一定的稳定性风险
当来电科技调研了 MSE 服务治理后以很低成本帮助它们快速实现了全链路灰度能力,进一步提升了系统的稳定性,让新需求的迭代上线更加安心。
如果直接实现会面临以下问题:
1、投入成本高
2、维护成本高
3、功能较单一,不灵活
4、缺少强大的团队支持
挑战:技术复杂度高、运维成本上升、可定位性变差、快速迭代难以控制风险
在这些场景下使得来电科技最后选择了一个 MSE 全链路灰度的能力。
以下是业务架构的一个场景,与之前的全链路灰度模型十分相近。
可以看到是在 Nginx 层配置一个流量的分流配置,10%的流量进入灰度配置,90%的流量进入未打标的线上正式环境。经过灰度环境的流量会自动被 MSE 染上对应环境的标签,相当于是泳道,从而进行一个全链路的灰度路由,从而保证流量在灰度环境中闭环。
可以看到支付中心没有一个灰度环境的机器,流量就会走线上环境。在下一跳数据中心又存在灰度机器,那么灰度的流量又会回到数据中心的灰度环境中。以上就是一套简单的全链路灰度模型。
二、如何使用 MSE 全链路灰度
原来 MSE 全链路灰度是在控制台或者是在架环境变量黑屏的方式进行的。现在讲解如何通过全链路灰度的模型并且将其产品化。下面进行演示如何通过控制台简单操作将整个全链路灰度产品运行起来。
下面是一个应用 demo 的架构
可以看到有三条微服务 ABC,且每个微服务都有未打标与灰度环境,再往前是一个ingress 网关,再往前是一个前端,通过命令行或 http 请求,并且配置 ingress 的路由规则分别将请求打在 grey 或 base 环境中。可以看到在 grey 环境中 a 的应用的流量会自动寻址到 b 的 grey 应用的实例中。下一条跳是自动找到 c 应用的 grey 实例,从而形成一个泳道的概念。
下面会通过该 demo 来简单演示如何配置这样一个微服务泳道,并且通过泳道的功能向大家展示线上的应用如何通过这些功能玩转起来全链路灰度发布的能力。