name: 12-factor-app description: 十二要素应用方法论,用于构建可扩展、可维护的云原生应用程序。在以下情况下使用:设计后端服务、API、微服务或任何软件即服务应用程序。触发于部署模式、配置管理、进程架构、日志记录和基础设施决策。
社区云原生应用程序最佳实践
构建现代软件即服务应用程序的全面方法论,使其具有可移植性、可扩展性和可维护性。包含12个类别下的51条规则,覆盖从代码库管理到生产操作的整个应用程序生命周期。
何时应用
在以下情况下参考这些指南:
- 设计新的后端服务或API
- 容器化应用程序以用于Kubernetes或Docker
- 设置CI/CD管道
- 跨环境管理配置
- 实施日志记录和监控
- 规划应用程序扩展策略
- 调试部署或环境问题
按优先级分类的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 代码库与版本控制 | 关键 | code- |
| 2 | 依赖项 | 关键 | dep- |
| 3 | 配置 | 关键 | config- |
| 4 | 支持服务 | 高 | svc- |
| 5 | 构建、发布、运行 | 高 | build- |
| 6 | 进程与状态 | 高 | proc- |
| 7 | 并发与扩展 | 高 | scale- |
| 8 | 可处置性 | 高 | disp- |
| 9 | 端口绑定 | 中 | port- |
| 10 | 开发/生产一致性 | 中 | parity- |
| 11 | 日志记录 | 中 | log- |
| 12 | 管理进程 | 中 | admin- |
快速参考
1. 代码库与版本控制(关键)
code-single-codebase- 在版本控制中为每个应用程序维护一个代码库code-one-app-one-repo- 强制执行代码库与应用程序之间的一对一关联code-deploys-not-branches- 使用部署而非分支来表示环境code-shared-as-libraries- 将共享代码分解为由依赖管理器管理的库
2. 依赖项(关键)
dep-explicit-declaration- 在清单文件中显式声明所有依赖项dep-isolate-execution- 隔离依赖项以防止系统包泄漏dep-no-system-tools- 绝不依赖隐式系统工具可用dep-deterministic-builds- 使用锁文件进行确定性依赖解析
3. 配置(关键)
config-separate-from-code- 严格将配置与代码分离config-use-env-vars- 将配置存储在环境变量中config-no-env-groups- 将环境变量视为细粒度控制而非分组环境config-validate-on-startup- 在应用程序启动时验证必需配置config-never-commit-secrets- 绝不将秘密或凭证提交到版本控制
4. 支持服务(高)
svc-as-attached-resources- 将支持服务视为附加资源svc-connection-strings- 通过配置中的连接URL引用所有支持服务svc-no-local-vs-remote- 不区分本地和第三方服务svc-detach-attach-without-code- 设计服务以便在不更改代码的情况下可分离和附加
5. 构建、发布、运行(高)
build-separate-stages- 严格分离构建、发布和运行阶段build-immutable-releases- 创建具有唯一标识符的不可变发布build-no-runtime-changes- 绝不修改运行时代码 - 更改需要新发布build-complexity-in-build- 将复杂性推入构建阶段,保持运行阶段最小化build-artifact-per-commit- 每个提交生成一个构建工件,随处部署相同工件
6. 进程与状态(高)
proc-stateless-processes- 将应用程序执行为无状态进程proc-no-sticky-sessions- 绝不使用粘性会话 - 将会话数据存储在支持服务中proc-no-local-filesystem- 绝不假设本地文件系统在请求之间持久化proc-compile-at-build- 在构建时而非运行时执行资产编译和捆绑proc-share-nothing- 设计进程以彼此不共享任何内容
7. 并发与扩展(高)
scale-process-model- 通过进程模型和多进程类型扩展scale-process-types- 将工作负载分配给适当的进程类型scale-no-daemonize- 绝不以守护进程方式运行或写入PID文件,让进程管理器处理scale-horizontal-not-vertical- 设计为水平扩展而非垂直扩展scale-process-formation- 将进程编队定义为声明式配置
8. 可处置性(高)
disp-disposable-processes- 设计进程为可处置,可在任何时刻启动或停止disp-fast-startup- 最小化启动时间以支持快速扩展和恢复disp-graceful-shutdown- 在SIGTERM上实现优雅关机disp-crash-only- 设计为崩溃仅软件,从突然死亡中恢复disp-idempotent-operations- 使操作具有幂等性,以便在失败后安全重试
9. 端口绑定(中)
port-self-contained- 使应用程序完全自包含,具有嵌入式服务器port-export-via-binding- 通过端口绑定使用PORT环境变量导出服务port-any-protocol- 使用端口绑定导出任何协议,不仅是HTTP
10. 开发/生产一致性(中)
parity-minimize-gaps- 最小化开发和生产环境之间的差距parity-same-backing-services- 在所有环境中使用相同类型和版本的支持服务parity-deploy-frequently- 频繁部署以最小化时间差距parity-developers-deploy- 让开发者参与部署以最小化人员差距
11. 日志记录(中)
log-event-streams- 将日志视为事件流而非文件log-no-routing- 绝不从应用程序内部路由或存储日志log-structured-format- 使用结构化日志记录以生成机器可读的事件流log-unbuffered-stdout- 将日志无缓冲写入stdout以进行实时流传输
12. 管理进程(中)
admin-one-off-processes- 将管理任务作为一次性进程而非特殊脚本运行admin-same-environment- 针对具有相同代码库和配置的发布运行管理进程admin-repl-access- 提供REPL访问以进行调试和数据检查
如何使用
阅读个别参考文件以获取详细解释和代码示例:
参考文件
| 文件 | 描述 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则的模板 |
| metadata.json | 版本和参考信息 |