前言
- 在上家公司,随着业务的不断拓展(从支持单个国家单个主体演变成支持多个国家多个主体),在演化的过程中沉淀出平台(短信,活体,push等)能力;
- 抽成通用的能力平台好处是底层一套代码支持多种不同的业务,同时也对平台能力的稳定性有了更高的要求;
- 如何保障平台本身迭代过程中稳定性那?当时我们对灰度发布架构做了升级,极大提高稳定性。
通用业务平台系列
- 通用业务平台设计(一):概览
- 通用业务平台设计(二):扩展多国家业务
- 通用业务平台设计(三):自动化打包平台建设
- 通用业务平台设计(四):灰度发布架构升级
学习完这篇文章你将收获什么
适合哪类人学
- 后端开发(无论你是刚入门小白还是资深开发都能从中有所受益)
- 运维(无论你是刚入门小白还是资深运维都能从中有所受益)
你将收获什么
- 平台化架构如何设计
- 如何通过灰度架构升级保证系统稳定性
全景一张图
升级方案设计
升级前
- 架构图
- 需要灰度发布步骤(以短信服务灰度为例)
- 在外网SLB上将内网nginx0-1入口流量摘掉
- 在SLB2-1上将短信服务3-1的流量摘掉
- 更新短信服务3-1的代码
- 将业务系统1-1中连接短信服务的端口由SLB2-1负载地址改为短信服务3-1的地址
- 配置一个指向业务系统1-1的灰度域名,APP配置一个灰度域名进行测试
- 灰度测试完毕后在SLB2-1中挂上短信服务3-1
- 将业务系统1-1中调用短信的地址由短信服务3-1服务地址改为SLB2-1的服务地址
- 在外网SLB上将nginx0-1的系统挂载上
- 在SLB2-1摘掉短信服务3-2,更新短信服务3-2,在SLB2-1中将短信服务3-2挂上
- 升级前灰度发布优缺点
- 缺点:运维复杂,涉及流程比较多,容易出错
- 优点:系统不用改造
升级后
- 架构图
- 需要灰度发布步骤(以短信服务灰度为例)
- 在Apollo上将短信服务4-1的注册服务名进行更改(动态调整)
- 在Apollo上配置zuul网关开启灰度开关(动态调整)
- 此时正常流量进入短信服务4-2;更新短信服务4-1
- 测试用指定手机号进行测试(测试流量进入 短信服务4-1)
- 在Apollo上将短信服务4-1的注册服务名进行更改(调整回原来),在Apollo上关闭灰度开关
- 在Apollo上将短信服务4-2服务名进行更改,更新短信服务4-2;在Apollo上将将短信服务4-2的服务名更改回来
- 升级后灰度发布优缺点
- 优点:操作步骤简单,减少出错概率
- 缺点:程序需要进行改造;性能稍微有些降低(增加一层zuul网关转发,经压测可以满足业务需求)
综合比对
综合考虑,利大于弊(利:以后升级的成本大大减少,升级的风险可控;弊:系统改造,性能稍微的减少)建议进行灰度改造
升级步骤
启动两台前置的网关 操作人:运维—前置操作
- 项目名称xxx-gateway
- 机器ip 及端口
- 192.168.168.60:10007
- 192.168.168.61:10007
在slb上摘除一台短信和一台活体(摘除机器ip 192.168.168.61)操作人:运维
- 活体
192.168.168.96:11002192.168.168.60:10002、192.168.168.61:10002
修改为
192.168.168.96:11002192.168.168.60:10002 - 短信
192.168.168.96:11005192.168.168.60:10005、192.168.168.61:10005
修改为
192.168.168.96:11005192.168.168.60:10005 - 由运维监控系统日志 负责人:运维
- 活体
更新短信(更新机器的ip 192.168.168.61) 操作人:运维
- 项目名称: xxx-sms-send
- 在Apollo上将xxx-sms-send中的192.168.168.61
spring.application.name = xxx-sms-send
改为
spring.application.name = xxx_sms_send
更新活体
- 项目名称: xxx-live-send
- 在Apollo上将xxx-sms-send中的192.168.168.61
spring.application.name = xxx-live-send
改为
spring.application.name = xxx_live_send
将zuul挂载到新的slb下
- 活体
添加
192.168.168.96:11007192.168.168.60:10007、192.168.168.61:10007 - 短信
192.168.168.96:11007192.168.168.60:10007、192.168.168.61:10007
- 活体
用postman进行测试更新后的短信和活体(机器ip 192.168.168.61)并查看日志和数据库数据 操作人:开发
- 测试更新完短信
- 非自定义短信zuul的地址
http://192.168.168.96:11007/xxx_sms_send/sms/send - 自定义短信访问zuul的地址
http://192.168.168.96:11007/xxx_sms_send/sms/diy/send
- 非自定义短信zuul的地址
- 测试活体
- 人头检测zuul的地址
http://192.168.168.96:11007/xxx_live_send/detect/head - 人脸比对访问zuul的地址
http://192.168.168.96:11007/xxx_live_send/live/send
- 人头检测zuul的地址
- 测试更新完短信
修改业务系统指向配置文件,并监控服务器日志
- 短信
项目:xxx-app、xxx-admin-job、xxx-admin、xxx-admin-job、xxx-provider
http://192.168.168.96:11005/sms/send
改为
http://192.168.168.96:11007/xxx_sms_send/sms/send活体
项目:xxx-app人头检测
http://192.168.168.96:11002/detect/head
改为
http://192.168.168.96:11007/xxx_live_send/detect/head人脸比对
http://192.168.168.96:11002/live/send
改为
http://192.168.168.96:11007/xxx_live_send/live/send
运维监控机器192.168.168.60 上短信和活体的日志,确保没流量再流入
- 短信
等5分钟查看线上日志及数据,同时测试进行印尼活体的和短信的测试 操作人:测试、开发
- 查看短信日志及数据库中数据
- 查看活体的日志及数据库中的数据
- 进行短信和活体的测试
摘除SLB2-1和SLB2-2的短信和活体服务;并监控日志 负责人:运维
- 删除负载
192.168.168.96:11005
192.168.168.96:11002
- 删除负载
更新短信(更新机器的ip 192.168.168.60) 操作人:运维
- 项目名称: xxx-sms-send
- 在Apollo上将xxx-sms-send其中192.168.168.60
spring.application.name = xxx-sms-send
改为
spring.application.name = xxx_sms_send
更新活体(更新机器的ip 192.168.168.60) 操作人:运维
- 项目名称: xxx-live-send
- 在Apollo上将xxx-live-send其中192.168.168.60
spring.application.name = xxx-live-send
改为
spring.application.name = xxx_live_send
灰度演练
将短信服务和活体服务进行灰度 操作人:运维
- 运维在机器ip为192.168.168.61 执行新的短信和活体的更新脚本,新脚本逻辑
- 在eureka上down掉相应服务
- 检查日志不再更新
- 更新项目
- 在Apollo上将短信和活体的 机器ip为192.168.168.61 的服务名改为灰度域名
- xxx-sms-send
由
spring.application.name = xxx_sms_send
改为
spring.application.name = xxx_sms_send_gray - xxx-live-send
由
spring.application.name = xxx_live_send
改为
spring.application.name = xxx_live_send_gray
- xxx-sms-send
- 运维在机器ip为192.168.168.61 执行新的短信和活体的更新脚本,新脚本逻辑
开发确认流量不再进入灰度服务 负责人:开发
- 查看ip为192.168.168.61 短信项目日志是否停止
- 查看ip为192.168.168.61 活体项目日志是否停止
测试使用灰度主体的包进行验证 负责人:测试、开发
- 用灰度主体(test1,test2)的包进行短信和活体验证,并查看数据库数据是否正确
- 在测试过程中 开发监控短信和活体的日志
测试完成后将灰度服务(服务ip 192.168.168.61)还原(在Apollo上放弃灰度)
- xxx-sms-send
由
spring.application.name = xxx_sms_send_gray
改为
spring.application.name = xxx_sms_send - xxx-live-send
由
spring.application.name = xxx_live_send_gray
改为
spring.application.name = xxx_live_send
- xxx-sms-send
总结
- 系统是不断演化过来,在不同的阶段解决,痛点是不同的,要抓住主要矛盾