SpringNotes

第 27 章:部署与发布

zjc 于 2026-01-27 发布

这是《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

要求:

  1. 不可变制品;
  2. 同一镜像部署所有环境;
  3. 环境差异用配置注入;
  4. 记录 commit 和构建信息;
  5. 镜像签名和扫描;
  6. 不使用 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

门禁:

  1. 测试通过;
  2. 代码扫描无严重问题;
  3. 依赖漏洞策略;
  4. 镜像扫描;
  5. 契约测试;
  6. 构建元数据完整。

27.3 数据库变更

原则:

  1. 向后兼容;
  2. 先加列后删列;
  3. 变更脚本可重复执行;
  4. 大表变更评估锁时间;
  5. 新旧代码兼容中间态;
  6. 回滚脚本明确;
  7. 生产变更备份。

兼容流程:

1. 添加 nullable 新列
2. 旧代码继续读写旧列
3. 新代码双写
4. 迁移历史数据
5. 校验一致
6. 新代码读新列
7. 多个版本后清理旧列

27.4 发布策略

策略 说明
Rolling 逐批替换
Blue/Green 两套环境切流量
Canary 少量流量验证
Feature Toggle 代码先上,功能后开
A/B 按用户分组体验

选择:

  1. 低风险小改动:滚动;
  2. 大版本或高风险:蓝绿;
  3. 核心链路:金丝雀;
  4. 未完成功能:开关控制;
  5. 数据不可逆变更:特殊审批和演练。

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 回滚

回滚内容:

  1. 应用版本;
  2. 配置;
  3. 路由规则;
  4. 数据修正;
  5. 消息消费逻辑;
  6. 前端资源。

注意:

  1. 数据库 schema 不一定回滚;
  2. 已产生的消息和事件不会消失;
  3. 旧版本必须兼容新数据;
  4. 回滚也要验证和监控;
  5. 重大事故可先降级再回滚。

27.7 部署检查清单

1. 变更范围和依赖确认
2. 数据库脚本演练
3. 配置中心变更审核
4. 镜像扫描通过
5. 测试和契约测试通过
6. 回滚方案可执行
7. 监控和告警就绪
8. 值班人员明确
9. 发布窗口和暂停条件
10. 用户通知

暂停条件:

  1. 错误率上升;
  2. P99 超阈值;
  3. 核心业务指标下降;
  4. 日志异常突增;
  5. 依赖故障;
  6. 发布系统异常。

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 发布平台能力

平台应提供:

  1. 服务拓扑;
  2. 版本状态;
  3. 发布编排;
  4. 流量控制;
  5. 一键回滚;
  6. 变更审计;
  7. 指标对比;
  8. 日志查询;
  9. 审批流程;
  10. 发布锁。

发布锁用于避免同一服务并发发布、数据库变更和应用发布冲突、重大节假日误发、依赖服务同时变更。

本章小结

部署与发布要把应用、配置、数据库和消息契约作为整体变更管理。生产使用不可变制品和统一镜像,通过 CI 门禁、兼容性数据库变更、金丝雀发布、指标观察和快速回滚控制风险。发布系统的核心能力是可审计、可暂停、可恢复。

思考题

  1. 为什么生产禁止使用 latest 标签?
  2. 数据库加列和删列如何安全执行?
  3. 金丝雀发布观察哪些指标?
  4. 哪些情况下不能简单回滚?
  5. 如何设计发布暂停条件?