为保证整个系统中某个服务升级,但不影响正常使用,列出以下要求。
🔗 规范约束
发布流程
snapshot 自测版本
-
开发人员提交源代码至
git
服务器,触发 CI 的普通 CICD 流程
-
CI 服务器根据
自动测与部署流程
配置进行以下操作-
自动编译构构建代码
-
部署
dev
版本至 内测环境 -
执行单元测试
-
执行自动化测试
-
-
开发人员在内测平台进行自测
正式发布注意点
优雅停机
触发进程关闭方式:
-
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 一些常见的技术中实现方式
-
Tomcat / Spring(Tomcat stop脚本)
-
该实现为 Tomcat 收到信号,触发勾子,等待内部servlet关闭,等待一段时间(5s)则整体关闭。
-
其中内部 servlet 关闭会走到 spring 生命周期内,按照bean加载顺序逆向注销
-
Spring Bean 注销钩子:AutoCloseable、配置 destroy 策略 DisposableBean
-
-
弊端:可能因如 ThreadPoolBeanA 和 MqConsumerBean 无依赖顺序,ThreadPoolBeanA 先结束,导致 MqConsumerBean 继续消费消息时触发 ThreadPoolBeanA is Closed 错误。这时需要忽略该错误,并让该消息设置为未处理,需重试。
-
Spring Boot
与 Tomcat 相反,由Spring Boot 驱动关闭 Tomcat,而非Tomcat关闭Spring。收到停止信号后再有请求则会返回503。
-
K8S (K8S 优雅关闭 POD 的机制)
向内部发 kill -15 等30s,还没停则 kill -9
发布类型
-
停机发布 (不推荐)
-
流量低谷发布,会有 404,不推荐。
-
-
滚动发布
-
每次只执行一个或一批服务,升级完成后加入系统,成本低。
-
-
灰度发布(金丝雀发布、A/B发布)
-
启动需要更新的服务,部分流量先迁移,如果没问题则全部迁移,主流。
-
-
蓝绿发布
-
运行整个新系统,运行后直接切换到新系统。稳定,成本大。
-
平滑升级
-
新版本能处理旧版本请求,废弃的功能返回固定错误码,由调用发进行不兼容处理
-
旧版本能处理新版本的接口响应,错误码统一
-
版本升级,数据库变动时,以新加字段为主,对于废弃字段,新版本提供默认值处理
-
消息队列中消息附带版本号
-
文件系统中、配置文件等带版本号
-
https://blog.csdn.net/qq_35425070/article/details/106885246 自动生成 changeLog