这是《Spring Boot 与 Spring Cloud 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 多环境的目标不是拥有 dev、test、prod 三个名字,而是让配置、数据、权限、发布和验证流程有清晰边界,同时尽量保持生产相似度。
30.1 环境分层
| 环境 | 目标 |
|---|---|
| local | 开发自测 |
| dev | 联调 |
| test / qa | 功能和集成 |
| staging / pre-prod | 生产预演 |
| prod | 线上服务 |
| dr | 灾备 |
核心要求:
- 命名规范统一;
- 配置隔离;
- 数据隔离;
- 权限隔离;
- 流量隔离;
- 监控隔离;
- 发布策略不同。
30.2 配置策略
application.yml 公共默认
application-dev.yml 开发差异
application-test.yml 测试差异
application-prod.yml 生产差异
配置中心 namespace 环境隔离
原则:
- 默认值面向安全,不是面向生产;
- 生产必需键显式配置;
- 环境地址来自环境变量;
- 密钥不落仓库;
- 配置变更可回滚;
- 每个配置有 owner。
30.3 数据策略
| 环境 | 数据 |
|---|---|
| local | 本地容器或内嵌模拟 |
| dev | 结构化假数据 |
| test | 可重建测试数据 |
| staging | 脱敏生产相似数据 |
| prod | 真实数据 |
禁止:
- 测试环境连接生产库;
- 生产数据未脱敏复制;
- 共享 Redis namespace;
- 测试 topic 和生产 topic 混用;
- 定时任务跨环境写同一数据源。
30.4 权限治理
| 环境 | 开发权限 |
|---|---|
| local | 完全 |
| dev | 较高 |
| test | 按需 |
| staging | 有限 |
| prod | 审批和审计 |
生产权限:
- 最小化;
- 审批;
- 审计;
- 时间窗口;
- 操作录像或命令记录;
- 禁止通用共享账号。
30.5 环境漂移
漂移来源:
- 手工改配置;
- 生产 hotfix 未回流;
- 数据库脚本遗漏;
- 环境资源不一致;
- 中间件版本不同;
- 依赖版本不同。
治理:
- 配置 Git 化;
- IaC 管环境;
- 数据库版本工具;
- 环境巡检;
- 制品同源;
- 版本矩阵;
- 自动 diff。
30.6 冒烟与环境验证
staging 发布后验证:
1. 健康检查
2. 核心接口
3. 登录流程
4. 支付沙箱
5. 消息收发
6. 数据库迁移
7. 回滚演练
8. 监控和告警
自动化冒烟应接入发布流水线,失败自动阻断或暂停。
30.7 环境监控
每个环境都需要基础监控,但告警级别不同:
| 环境 | 告警 |
|---|---|
| dev | 低噪声 |
| test | 阻断测试时通知 |
| staging | 严格,模拟生产 |
| prod | 全量关键告警 |
staging 与生产监控指标应保持一致,方便发布前对比。
30.8 多机房与区域
Region
|-- Zone A
| |-- Service instances
| |-- DB primary
|-- Zone B
|-- Service instances
|-- DB replica
治理点:
- 流量就近;
- 数据复制延迟;
- failover 策略;
- 配置中心可用性;
- 服务发现跨机房视图;
- 发布按区域灰度;
- 故障演练。
跨机房写一致性和本机房读性能往往需要权衡。
30.9 环境成本
优化方式:
- 非生产环境定时启停;
- 测试数据保留周期;
- 日志采样;
- trace 采样;
- 复用云资源;
- 按需创建 preview 环境;
- 清理孤儿资源。
preview 环境适合分支联调,但必须自动回收,避免资源泄漏。
本章小结
多环境治理要保证配置、数据、权限、流量和监控隔离,同时让 staging 尽量接近生产。治理环境漂移比增加环境数量更重要。生产权限和变更必须审批审计,非生产资源要有生命周期管理。
思考题
- staging 和 test 的差异是什么?
- 如何避免环境配置漂移?
- 哪些数据不能直接复制到测试环境?
- 多机房流量就近有哪些代价?
- 如何治理 preview 环境资源泄漏?