12-Factor App

构建现代 SaaS 应用的 12 条设计原则,云原生应用开发的方法论基础。

#type / concept #status / growing #tech / ops

[!info] related notes

12-Factor App

一句话定义

12-Factor App 是一套用于构建现代、可扩展、可维护 SaaS 应用的方法论,由 Heroku 联合创始人 Adam Wiggins 于 2011 年提出。它定义了 12 条设计原则,是云原生应用开发的基石。


12 条因素

1. Codebase — 一份代码,多份部署

一份代码(tracked in version control)对应多个部署(dev、staging、prod)。不同环境的差异通过配置(因素 3)体现,而不是不同的代码分支。

2. Dependencies — 显式声明依赖

所有依赖必须显式声明,不能隐式依赖系统级包。

  • Node.js: package.json
  • Go: go.mod
  • Python: pyproject.toml / requirements.txt

3. Config — 配置存于环境变量

应用在不同环境间变化的配置(数据库地址、API Key、外部服务 URL)应存储在环境变量中,而非代码里硬编码。

原则:代码不变,配置变。

4. Backing Services — 视后端服务为附加资源

数据库、消息队列、SMTP、缓存等后端服务,应通过 URL(统一资源定位符)连接,与本地文件一样对待。切换服务只需改 URL,不改代码。

5. Build/Release/Run — 严格分离构建和运行

  • Build 阶段:代码 → 可执行包(如 Docker 镜像)
  • Release 阶段:可执行包 + 配置 → 唯一发布版本
  • Run 阶段:在目标环境运行发布版本

每个 Release 有唯一版本号,支持快速回滚。

6. Processes — 进程无状态

进程不存储任何本地状态。会话、缓存、任务队列等都应存入外部服务(Redis、数据库、对象存储)。进程可以随时销毁和重建。

7. Port Binding — 通过端口绑定提供服务

应用通过绑定端口来对外提供 HTTP 服务,而非依赖外部 Web 服务器注入。应用自包含,可以被其他应用作为后端服务使用。

8. Concurrency — 通过进程模型扩展

通过增加进程数量来扩展(水平扩展),而非增大单进程(垂直扩展)。不同类型的进程可以独立扩展。

9. Disposability — 快速启动,优雅停机

  • 快速启动:进程可以在几秒内启动,适合弹性扩缩容
  • 优雅停机:收到 SIGTERM 后,处理完当前请求,关闭连接,然后退出
  • 不会因为突然退出导致数据损坏

10. Dev/Prod Parity — 保持开发/生产环境尽可能一致

缩小开发环境与生产环境之间的差异:

  • 时间差异:代码提交后尽快部署
  • 人员差异:开发者参与部署和运维
  • 工具差异:开发和生产使用相同的技术栈

Docker 容器化是实现这一点的关键手段。

11. Logs — 视日志为事件流

应用不管理日志文件,只将日志作为事件流输出到 stdout/stderr。由运行环境负责收集、路由、存储和分析日志。

12. Admin Processes — 后台管理任务作为一次性进程

数据库迁移、脚本任务等管理操作,应作为一次性进程运行,与应用进程共享代码库和配置。


与云原生的关系

12-Factor App 是云原生应用设计的方法论基础。它描述的不是具体技术,而是设计原则。Kubernetes、Docker、CI/CD 等云原生技术栈,本质上都是为了让这些原则更容易落地。


相关 MOC

创建于 2026/7/4 更新于 2026/7/15