前言

  • 在上家公司,随着业务的不断拓展(从支持单个国家单个主体演变成支持多个国家多个主体),在演化的过程中沉淀出平台(短信,活体,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的地址
        http://192.168.168.96:11007/xxx_live_send/detect/head
      • 人脸比对访问zuul的地址
        http://192.168.168.96:11007/xxx_live_send/live/send
  • 修改业务系统指向配置文件,并监控服务器日志

    • 短信
      • 项目: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
  • 开发确认流量不再进入灰度服务 负责人:开发

    • 查看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

总结

  • 系统是不断演化过来,在不同的阶段解决,痛点是不同的,要抓住主要矛盾