为保证整个系统中某个服务升级,但不影响正常使用,列出以下要求。

📌 术语定义

  • **

🔗 规范约束

发布流程

snapshot 自测版本

  1. 开发人员提交源代码至 git 服务器,触发 CI 的 普通 CICD 流程

  2. CI 服务器根据 自动测与部署流程 配置进行以下操作

    1. 自动编译构构建代码

    2. 部署 dev 版本至 内测环境

    3. 执行单元测试

    4. 执行自动化测试

  3. 开发人员在内测平台进行自测

release.pre 预发布版本

  1. 开发完毕后提交代码,msg中附带 release test预发布版 标识性关键词,触发 CI 的 预发布流程

    1. 自动编译构构建代码

    2. 部署 release 版本至 预发布环境

    3. 执行单元测试

    4. 执行自动化测试

  2. 开发、测试人员在预发布平台进行测试

release 发布版本

  1. 开发完毕后提交代码,msg中附带 release发布版 标识性关键词,触发 CI 的 自动发布流程

    1. 自动编译构构建代码,将生成的 jar 发布到仓库

    2. 根据 Dockerfile 生成 docker 镜像,打 TAG ,发布到镜像仓库

  2. 触发 正式发布流程,进行 滚动升级

  3. 开发、测试人员在预发布平台进行测试

正式发布注意点

优雅停机

触发进程关闭方式:

  • kill <pid>、 Ctrl+C

  • java 代码:System.exit()

  • spring:getApplicationContext().close(); 触发

  • spring boot actuator: POST /actuator/shutdown

  • 系统事件:用户注销或关闭系统

  • …​.

延申: Kill 参数
  • kill -15 【默认,推荐】终止信号,优雅退出:给进程决策如何退出,可能实际未退出

  • kill -9 强制关闭,直接删除进程,可能有的资源不会自动释放;程序无法感知;导致数据丢失,尤其是一些web应用,定时任务或者包含长事务的应用中,尽量不要使用。

  • kill -2 中断信号,同 ctrl C,关闭前台进程,触发中断

  • kill -3 退出信号,同 ctrl / 触发退出

Java 一些常见的技术中实现方式
  1. Tomcat / Spring(Tomcat stop脚本)

    • 该实现为 Tomcat 收到信号,触发勾子,等待内部servlet关闭,等待一段时间(5s)则整体关闭。

    • 其中内部 servlet 关闭会走到 spring 生命周期内,按照bean加载顺序逆向注销

      • Spring Bean 注销钩子:AutoCloseable、配置 destroy 策略 DisposableBean

弊端:可能因如 ThreadPoolBeanA 和 MqConsumerBean 无依赖顺序,ThreadPoolBeanA 先结束,导致 MqConsumerBean 继续消费消息时触发 ThreadPoolBeanA is Closed 错误。这时需要忽略该错误,并让该消息设置为未处理,需重试。

  1. Spring Boot

与 Tomcat 相反,由Spring Boot 驱动关闭 Tomcat,而非Tomcat关闭Spring。收到停止信号后再有请求则会返回503。

  1. K8S (K8S 优雅关闭 POD 的机制)

向内部发 kill -15 等30s,还没停则 kill -9

Java 优雅关闭关注点

处理 InterruptedException

发布过程

  • 配置文件备份

    • 如 nginx.conf 文件,修改前备份,并放置在安全易查找的位置,以便于升级后服务异常,便于快速回滚。

  • 数据库修改后置

    • 若升级需要修改数据库数据,最好放置在升级完成后进行。

  • 尽量保证预发布环境与正式环境的一致性(数据库尽量)

部署方案

  • 中间件集群部署,保证高性能、高可用(至少至少3个节点)

  • 数据库至少高可用部署,具体方案与业务量有关(至少2个节点,主备VIP)

  • 微服务至少2个节点(至少两个节点)

发布类型

  • 停机发布 (不推荐)

    • 流量低谷发布,会有 404,不推荐。

  • 滚动发布

    • 每次只执行一个或一批服务,升级完成后加入系统,成本低。

  • 灰度发布(金丝雀发布、A/B发布)

    • 启动需要更新的服务,部分流量先迁移,如果没问题则全部迁移,主流。

  • 蓝绿发布

    • 运行整个新系统,运行后直接切换到新系统。稳定,成本大。

平滑升级