这是《Spring Boot 与 Spring Cloud 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 部署与发布的目标是让变更可控、可观察、可回滚。微服务环境下,一个功能可能涉及多个服务、数据库脚本、配置、消息契约和前端资源,需要完整的发布流程。
27.1 制品管理
Git commit
-> CI 构建
-> 镜像 / jar
-> 版本号
-> 制品仓库
-> 部署系统
镜像命名:
registry.example.com/order-service:1.8.0
registry.example.com/order-service:1.8.0-abc1234
要求:
- 不可变制品;
- 同一镜像部署所有环境;
- 环境差异用配置注入;
- 记录 commit 和构建信息;
- 镜像签名和扫描;
- 不使用 latest 生产部署。
27.2 CI 流水线
阶段:
Checkout
Compile
Unit Test
Static Analysis
Security Scan
Package
Integration Test
Build Image
Push Registry
Deploy Staging
E2E Test
Maven 示例:
mvn -B clean verify
Gradle 示例:
./gradlew clean check
门禁:
- 测试通过;
- 代码扫描无严重问题;
- 依赖漏洞策略;
- 镜像扫描;
- 契约测试;
- 构建元数据完整。
27.3 数据库变更
原则:
- 向后兼容;
- 先加列后删列;
- 变更脚本可重复执行;
- 大表变更评估锁时间;
- 新旧代码兼容中间态;
- 回滚脚本明确;
- 生产变更备份。
兼容流程:
1. 添加 nullable 新列
2. 旧代码继续读写旧列
3. 新代码双写
4. 迁移历史数据
5. 校验一致
6. 新代码读新列
7. 多个版本后清理旧列
27.4 发布策略
| 策略 | 说明 |
|---|---|
| Rolling | 逐批替换 |
| Blue/Green | 两套环境切流量 |
| Canary | 少量流量验证 |
| Feature Toggle | 代码先上,功能后开 |
| A/B | 按用户分组体验 |
选择:
- 低风险小改动:滚动;
- 大版本或高风险:蓝绿;
- 核心链路:金丝雀;
- 未完成功能:开关控制;
- 数据不可逆变更:特殊审批和演练。
27.5 金丝雀发布
流程:
1. 部署 1 个或 5% 实例
2. 按用户/Header/权重导流量
3. 观察错误率、延迟、业务指标
4. 自动或人工判断
5. 逐批扩大
6. 全量后清理旧版本
观察指标:
error rate
P50 / P95 / P99
QPS
GC pause
DB latency
business conversion
compensation count
必须能一键回滚,且数据库兼容旧版本。
27.6 回滚
回滚内容:
- 应用版本;
- 配置;
- 路由规则;
- 数据修正;
- 消息消费逻辑;
- 前端资源。
注意:
- 数据库 schema 不一定回滚;
- 已产生的消息和事件不会消失;
- 旧版本必须兼容新数据;
- 回滚也要验证和监控;
- 重大事故可先降级再回滚。
27.7 部署检查清单
1. 变更范围和依赖确认
2. 数据库脚本演练
3. 配置中心变更审核
4. 镜像扫描通过
5. 测试和契约测试通过
6. 回滚方案可执行
7. 监控和告警就绪
8. 值班人员明确
9. 发布窗口和暂停条件
10. 用户通知
暂停条件:
- 错误率上升;
- P99 超阈值;
- 核心业务指标下降;
- 日志异常突增;
- 依赖故障;
- 发布系统异常。
27.8 Spring Boot 健康探针
健康组:
management:
endpoint:
health:
probes:
enabled: true
health:
livenessState:
enabled: true
readinessState:
enabled: true
Kubernetes:
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
健康检查不应依赖非关键外部服务,否则下游抖动会导致实例被反复重启或摘流。
27.9 发布平台能力
平台应提供:
- 服务拓扑;
- 版本状态;
- 发布编排;
- 流量控制;
- 一键回滚;
- 变更审计;
- 指标对比;
- 日志查询;
- 审批流程;
- 发布锁。
发布锁用于避免同一服务并发发布、数据库变更和应用发布冲突、重大节假日误发、依赖服务同时变更。
本章小结
部署与发布要把应用、配置、数据库和消息契约作为整体变更管理。生产使用不可变制品和统一镜像,通过 CI 门禁、兼容性数据库变更、金丝雀发布、指标观察和快速回滚控制风险。发布系统的核心能力是可审计、可暂停、可恢复。
思考题
- 为什么生产禁止使用 latest 标签?
- 数据库加列和删列如何安全执行?
- 金丝雀发布观察哪些指标?
- 哪些情况下不能简单回滚?
- 如何设计发布暂停条件?