环境管理、配置与密钥

同一份代码,不同环境用不同「开关」。 开发、测试、预发、生产要隔离(不互相串数据、不误动生产),又要一致(同一制品、同一部署方式,只换配置)。配置用环境变量、配置文件或配置中心区分环境;密钥(数据库密码、API Key)不能进代码库,要单独存、按需注入、轮换与审计。本章讲环境隔离与一致性配置管理(环境变量、配置文件、配置中心)、密钥与敏感信息(不落库、轮换与审计)。

一、开发、测试、预发、生产环境的隔离与一致性

多环境的目的:开发/测试敢试、敢拆,不影响用户;预发(Staging)尽量贴近生产,做发布前验证;生产服务真实用户,稳定第一。隔离指:环境之间网络与数据分离(测试库与生产库分开、不互通)、权限分离(生产仅少数人可操作)、部署与变更独立(发测试不触发生产)。一致性指:同一制品、同一部署方式、同一操作系统与中间件版本,差异只在于配置(连接串、开关、域名等)。这样「在预发过了」才更有信心在生产过;若每环境各起一套不一样的依赖,问题难以复现。

开发 Dev 测试 Test 预发 Staging 生产 Prod
典型四层环境:隔离数据与权限,一致性靠同一制品+配置区分
同一制品,各环境注入不同配置

二、配置管理:环境变量、配置文件、配置中心

配置是「随环境变、不写死进代码」的项:数据库连接串、服务地址、特性开关、日志级别等。环境变量:在进程启动时注入,简单、与 12-Factor 契合,适合少量键值;敏感的不放代码里,由部署或编排层注入。配置文件:如 YAML/JSON,按环境分文件(config.dev.yaml、config.prod.yaml)或由部署时替换;要避免把生产配置误提交到仓库。配置中心(如 Consul、Apollo、Spring Cloud Config):配置集中存、按应用与环境拉取,支持动态更新与审计;适合多服务、配置多的场景。原则:配置与代码分离敏感配置不落库环境间仅配置不同

环境变量
启动时注入,简单、无文件;适合少量键值。敏感项由部署/编排注入,不写进镜像或代码。
配置文件
按环境分文件或部署时替换;避免生产配置进仓库。可配合模板(如 Helm values)按环境生成。
配置中心
配置集中存、按应用与环境拉取;支持动态更新与审计。适合多服务、配置多、需灰度配置的场景。
三种常见配置方式

三、密钥与敏感信息:不落库、轮换与审计

密钥与敏感信息(数据库密码、API Key、证书私钥等)不能出现在代码库、镜像层或日志里;否则一旦泄露,影响面大。不落库:用占位符或「从某处读取」的约定,真实值存在密钥管理服务(如 Vault、云厂商 Secrets Manager、K8s Secret)或部署流水线的受保护变量中,运行时注入。轮换:定期更换密钥,并支持多版本过渡(如新旧 Key 并存一段时间再下线旧 Key)。审计:谁在何时访问或使用了哪条密钥,可查日志;最小权限,仅需要的服务/人有权限取用。

密钥管理要点

  • 不落库:代码与镜像中不包含真实密钥;用密钥管理服务或 CI/CD 受保护变量,运行时注入。
  • 轮换:定期更换;支持多版本过渡,避免换钥即断线。
  • 审计:访问与使用可追溯;最小权限,按需授权。

推荐

  • 密钥存专用服务(Vault、云 Secret Manager、K8s Secret)
  • 部署时或启动时注入,应用只读环境变量或 API
  • 配置与代码分离,敏感项用占位符 + 文档说明来源

禁止

  • 密钥写进代码、配置文件并提交仓库
  • 写在镜像层或日志里
  • 多人共用同一密钥且不轮换、不审计
密钥与敏感信息:推荐 vs 禁止

一句话: 环境要隔离(数据、权限、部署独立)且一致(同一制品、同一方式,只换配置)。配置用环境变量、配置文件或配置中心,与代码分离、敏感不落库。密钥不写进代码与仓库,存密钥管理服务或 CI 受保护变量、运行时注入;要轮换审计,最小权限。

小贴士: 若暂时没有密钥管理服务,至少做到:密钥只放在 CI/CD 的「受保护变量」或运维手里的配置里,应用通过环境变量读取;仓库里只有示例文件(如 .env.example),真实 .env 不进版本控制。

四、小结

环境:开发、测试、预发、生产隔离且一致;同一制品 + 各环境配置。配置管理:环境变量、配置文件、配置中心;配置与代码分离、敏感不落库。密钥:不落库、存专用服务或受保护变量、运行时注入;轮换与审计、最小权限。下一章讲监控、日志与可观测性,把指标、日志、追踪与 On-call 说细。