【编者的话】掌门教育自2014年正式转型在线教育以来,秉承“让教育共享智能,让学习高效快乐”的宗旨和愿景,经历云计算、大数据、人工智能、AR/VR/MR以及现今最火的5G,一直坚持用科技赋能教育。掌门教育的业务近几年得到了快速发展,特别是今年的疫情,使在线教育成为了新的风口,也给掌门1对1新的机遇。随着业务规模进一步扩大,流量进一步暴增,微服务体系下,业务服务新增和迭代频率大大加快,运维和业务人员经常需要熬夜人工上线,疲劳状态下容易产生生产事故,运维成本和业务成本也将大大上升。在此背景下,基础架构部推出可以白天安全上线,流量无损的微服务灰度蓝绿发布智能化系统,并通过强有力的各种监控手段来保证流量的精确制导和调拨,提升技术驱动能力。
Solar作为掌门1对1下一代基础微服务体系,2019年11月开始筹划,2020年1月4日推出第一版,2020年4月15日发布1.2.0 & 2.2.0里程碑稳定版,兼容Spring Cloud Edgware版、Finchley版、Greenwich版、Hoxton版本。基于三层体系而构建:
Solar基于Spring Cloud技术栈,支持Eureka注册中心、Apollo配置中心、Zuul网关、2个限流熔断降级组件(Sentinel、Hystrix)等,Skywalking + Opentracing和CAT的APM调用链监控,Prometheus + Grafana指标监控,Kibana日志监控等,具有企业级的插件引入、开箱即用特征。它包含几大核心模块:
用于端到端的调用访问范畴,一般是往网关到下游若干服务的链路拓扑结构。例如,网关 -> A服务 -> B服务 ->……的调用和访问
灰度发布又名金丝雀发布,指不停机旧版本,部署新版本,低比例流量(例如:5%)切换到新版本,高比例流量(例如:95%)仍走旧版本。通过监控观察确认无问题,逐步扩大范围,慢慢的把所有流量都迁移到新版本上来。
灰度发布的作用:支持白天向生产环境发布新服务,安全平滑的逐步切换流量,保证流量以最小代价实现无损。
全链路灰度发布是指流量在全链路权重分配。如下两条链路,流量必须走“链路1”或者“链路2”,不能出现交叉情形,例如,A服务(1.0版本)不允许去访问B服务(2.0版本),这样方式可以有效避免新旧版本不兼容的情况。
链路1:网关 -> A服务(1.0版本) -> B服务(1.0版本) 链路2:网关 -> A服务(2.0版本) -> B服务(2.0版本)
操作者给“链路1”分配95%的权重流量,给“链路2”分配5%的权重流量。假如“链路2”中任何一个服务出现问题,我们可以直接切掉“链路2”的5%流量,实施流量回滚。下文中提到的版本1.0表示已经上线的旧服务,版本2.0表示即将要上线的新服务。
蓝绿发布即不停机旧版本,部署新版本,将流量切到新版本,便于快速回滚,旧版本待流量为零,可以继续保留较长时间后下线。
蓝绿发布的作用:支持白天向生产环境发布新服务,通过条件方式,实现在两个部署环境快速切换,如果新服务存在问题,可以快速切换到老服务,保证流量以最小代价实现无损。
全链路灰度发布是指流量在全链路条件分配。如下两条链路,流量必须走“链路1”或者“链路2”,不能出现交叉情形,例如,A服务(1.0版本)不允许去访问B服务(2.0版本),这样方式可以有效避免新旧版本不兼容的情况。
链路1:网关 -> A服务(1.0版本) -> B服务(1.0版本) 链路2:网关 -> A服务(2.0版本) -> B服务(2.0版本)
操作者给“链路1”分配一个Http Header值,给“链路2”分配另一个Http Header值,例如:Header中domain=green,选择执行“链路1”,domain=blue,选择执行“链路2”。假如“链路2”中任何一个服务出现问题,直接把domain切换到www,实施流量回滚。
注意:我们实现了对灰度发布和蓝绿发布的糅合,下文提到的“蓝绿发布”有广义性,同时包含狭义的“蓝绿发布”和“灰度发布”的含义。
蓝绿成功的流程:
创建蓝绿计划(Plan) -> 蓝环境部署(Deploy) -> 执行蓝绿(Blue-Green) -> 蓝绿验证(Check) -> 下线绿环境(Offline) -> 完成蓝绿计划(Finish)
蓝绿失败的流程:
创建蓝绿计划(Plan) -> 蓝环境部署(Deploy) -> 执行蓝绿(Blue-Green) -> 蓝绿验证(Check) -> 蓝环境回滚(Rollback)
创建蓝绿计划:
<rule> <strategy> <version>{"solar-service-a":"1.0", "solar-service-b":"1.0"}</version> </strategy> </rule>
部署蓝环境的全链路服务
A新服务和B新服务的机器通过VI启动点火成功并拉入流量(注册到注册中心)之后,进入蓝绿环节。
执行蓝绿
根据用户提交的蓝绿计划,CD平台将自动创建蓝绿策略。注意:下文中提到的XML展现方式,用户是接触不到的,只是为了表达逻辑含义而已。
执行蓝绿条件驱动模式:
通过蓝绿发布计划的配置页面,配置服务版本号,路由链路,以及每条链路的路由条件,下面配置表示为Http Header中domain字段为Green时候走route1的链路,domain字段为Blue时候流量走route2的链路。Header字段可自定义,对于同一网关和BI下不同业务系统的蓝绿发布和路由,可以通过namespace进行隔离,其作用是支持不同业务系统同时实施蓝绿发布方案。
<rule> <strategy-customization> <conditions type="blue-green"> <condition id="condition1" header="#H['domain'] == 'green'" version-id="route1"/> <condition id="condition2" header="#H['domain'] == 'blue'" version-id="route2"/> </conditions> <routes> <route id="route1" type="version">{"solar-service-a":"1.0", "solar-service-b":"1.0"}</route> <route id="route2" type="version">{"solar-service-a":"2.0", "solar-service-b":"2.0"}</route> </routes> </strategy-customization> </rule>
执行蓝绿权重放量模式:
通过蓝绿发布计划的配置页面,配置服务版本号,路由链路,以及每条链路所占的权重百分比,下面配置表示为route1的链路(Green链路)所占的流量百分比为5%,route2的链路(Blue链路)所占的流量百分比为95%。相对于“蓝绿条件驱动模式”,“蓝绿权重放量模式”需要使用者分几次条件蓝绿权重,并进行多次观察,小心放量。
<rule> <strategy-customization> <conditions type=“gray"> <condition id="condition1" version-id="route1=95;route2=5"/> </conditions> <routes> <route id="route1" type="version">{"solar-service-a":"1.0", "solar-service-b":"1.0"}</route> <route id="route2" type="version">{"solar-service-a":"2.0", "solar-service-b":"2.0"}</route> </routes> </strategy-customization> </rule>
蓝绿验证
通过蓝绿验证的工具(例如:Skywalking全链路调用链中验证),验证蓝环境是否有新流量接入,新流量是否会引起业务调用异常和错误。相对于“蓝绿条件驱动模式”,“蓝绿权重放量模式”需要使用者多次执行“全链路侦测”,观测权重百分比概率执行是否准确。
蓝绿成功,执行如下步骤:
蓝绿失败,执行如下流程:
蓝绿验证失败后,执行蓝环境回滚。当全链路中任何一个服务出现问题,就需要回滚。回滚方式,切回基准度低策略,默认指向绿环境。
<rule> <strategy> <version>{"solar-service-a":"1.0", "solar-service-b":"1.0"}</version> </strategy> </rule>
回滚后,对于出问题的服务,进行问题排查,重新上线,再执行蓝绿发布计划。
当同一网关下,不同系统同时并行执行蓝绿发布,为避免冲突(不同系统的全链路蓝绿发布中包含相同的服务,但指向不同的版本匹配),可以通过命名空间(namespace)进行隔离,namespace通过Http Header传入,由Spel表达式进行命中,表达方式如下:
<rule> <strategy-customization> <conditions type="blue-green"> <condition id="condition1" header="#H['namespace'] == 'x-system' && #H['domain'] == 'green'" version-id="route1"/> <condition id="condition2" header="#H['namespace'] == 'y-system' && #H['domain'] == 'blue'" version-id="route2"/> </conditions> <routes> <route id="route1" type="version">{"solar-service-a":"1.0", "solar-service-b":"1.0"}</route> <route id="route2" type="version">{"solar-service-a":"2.0", "solar-service-b":"2.0"}</route> </routes> </strategy-customization> </rule>
注意:上述方式只适用于“蓝绿条件驱动模式”。
在全链路中,由外界传递蓝绿的Header标志值到网关上,来驱动全链路蓝绿发布,例如:上文提到的namespace和domain的Header。外界一般包括界面端,手机端等元素。
在全链路中,外界不传递蓝绿的Header标志值,而是通过在策略中加入对应的Header值,并写入到网关上,来驱动全链路蓝绿发布。表达方式如下:
<rule> <strategy-customization> <conditions type="blue-green"> <condition id="condition1" header="#H['namespace'] == 'x-system' && #H['domain'] == 'green'" version-id="route1"/> <condition id="condition2" header="#H['namespace'] == 'y-system' && #H['domain'] == 'blue'" version-id="route2"/> </conditions> <routes> <route id="route1" type="version">{"solar-service-a":"1.0", "solar-service-b":"1.0"}</route> <route id="route2" type="version">{"solar-service-a":"2.0", "solar-service-b":"2.0"}</route> </routes> <headers> <header key="namespace" value="x-system"/> <header key="domain" value="green"/> </headers> </strategy-customization> </rule>
外界不需要做任何改动,根据蓝绿的Header匹配,确定走route1的路由路径。
注意:上述方式只适用于“蓝绿条件驱动模式”
智能化,包括运维部署智能化和蓝绿驱动智能化。
我们可以通过创建一个发布计划,执行蓝绿发布。一个发布计划可以关联多个服务,即进行全链路的蓝绿发布。
创建完的蓝绿发布计划会进入待审批状态,每个服务至少需要一个Owner审批通过后才可进入发布配置。由于涉及到生产环境上的服务上下线,我们采用了非常严格的权限控制。
审批通过后,进入发布配置页。
发布系统配置
该步骤为运维智能化发布步骤:
完成后进入【堡垒发布】。
堡垒发布
堡垒机的作用是尝试全链路新版本流量的引流,具有流量堡垒、屏障和保护作用。一旦堡垒机流量出现问题,可以快速回滚。
堡垒机发布完成后,生成兜底规则,兜底规则的作用是确保新版本上线过程中,或者快速回滚过程中流量打回到老的稳定版本,下一步进入【蓝绿配置】。
蓝绿策略配置和执行
权重放量模式:
条件驱动模式:
表达式提供用户自主校验功能,可选择对应规则进行校验。表达式分为两种:
校验通过后进入下一步 【开始验证】。
执行验证
蓝绿和兜底规则生效后,可以执行如下功能,进行准确性验证。
蓝绿全链路路由预检测功能,输入路由规则可以查看预检测结果。
路由策略预检测。在符合当前条件下,从网关派发到全链路服务的路由Header Json内容是否准确,是否符合预期。
路由路径预检测。在符合当前条件下,从网关到全链路服务进行智能化侦测,把途径的服务的版本等各类信息打印出来。
跳转定位到Skywalking观察全链路追踪的结果。
从Skywalking的SOLAR Span上,我们可以看到很多关键性的信息:
通过对接Skywalking后台实现流量追踪。
通过掌门监控平台,对接钉钉机器人的通知机制,随时监控蓝绿规则和策略的变更。
执行回滚
执行全量发布
验证通过后,将执行全量发布,蓝绿发布流程结束。
我们将不仅局限在Spring Cloud微服务侧的蓝绿发布,将持续推进前端、网关、Nginx等端到端和各类技术栈的蓝绿发布,实现真正全链路的蓝绿发布,争取把广大业务部门的同学从熬夜的泥潭里早日解放出来,做到白天无损且安全的生产环境发布。
作者介绍:
原文链接: https://mp.weixin.qq.com/s/o_BYQ8Gz_YIykgTVR8yO9A