应用程序十二要点是Heroku 所提出的一种用于构建软件即服务应用程序的方法学,参见 https://12factor.net, 试着翻译并解读
- 使用标准化流程自动配置,从而使新加入项目的开发者的时间和学习成本最小化;
- 与底层操作系统之间保持简洁的界限和契约, 在执行环境之间提供最大的可移植性;
- 适合在现代云平台上部署,避免对服务器和系统管理的额外需求;
- 最小化开发和生产环境之间的分歧,实现持续部署以实现最大灵活性;
- 无需对工具,架构或开发实践进行重大更改就可以实现纵身和横向扩展。
1. Codebase 代码库
One codebase tracked in revision control, many deploys
用一个代码库进行版本控制和应用程序的多次部署, 代码, 配置, 初始化数据都应该纳入版本管理,在统一的代码库中为代码,配置,数据, 测试和部署脚本都建立独立的项目和模块。
不管是测试环境还是生产环境,都可以使用同一份代码进行发布。
2. Dependencies 依赖
Explicitly declare and isolate dependencies
显式声明和隔离依赖关系, 通过maven , gradle, scons 等构建工具明确声明所需要的够用的依赖项和版本号, 避免版本冲突和循环依赖, 象Java中臭名昭著的依赖黑洞就曾浪费了程序员大量的时间, SpringBoot 的 starter 依赖包就可以大大简化依赖配置
3. Config 配置
Store config in the environment
配置和代码都是应用程序不可或缺的组成部分, 一般存储配置在环境变量中或者与环境相关的配置文件,配置服务中, 比如 application-dev.yml, application-lab.yml, application-bts.yml, application-prod.yml, 这些配置文件不要和代码放在一起, 建议放在不同的代码仓库中, 这里建议把应用的配置存储于环境变量中。
4. Backing services 后端服务
Treat backing services as attached resources
将后端服务作为附加的资源, 不管你的后端数据库是 Oracle, MySQL 还是 PostgreSQL, 消息队列是ActiveMQ, RabbitMQ 或是Kafaka , 你的上层应用程序无需做特殊处理, 底层适配也很容易地切换不同的支持服务资源
5. Build, release, run 构建,发布和运行
Strictly separate build and run stages
严格区分构建, 发布和运行阶段, 开发人员的每次改动都会触发构建, 但是发布是要经过严格的验收测试的, 运行时的代码不允许任何随意修改,遵循构建发布和运行的流程
6. Processes 进程
Execute the app as one or more stateless processes
以一个或多个无状态进程来运行应用程序, 状态应该保存在共享的缓存或数据库中,这样微服务可以任意启停,轻松升级和替换, 也利于水平扩展
7. Port binding 端口绑定
Export services via port binding
通过端口绑定导出服务, 也就是通过暴露独立的端口来提供服务, 比如HTTP的80, HTTS的443, SIP的5060, 不需要依赖于容器
8. Concurrency 并发
Scale out via the process model
通过进程模型横向扩展
9. Disposability 一次性
Maximize robustness with fast startup and graceful shutdown
通过快速启动和优雅退出来最大限度地提高健壮性
10. Dev/prod parity 相似的开发和产品环境
Keep development, staging, and production as similar as possible
保持开发,测试和产品环境尽可能相似
11. Logs 日志
Treat logs as event streams
将日志视为事件流
12. Admin processes 管理过程
Run admin/management tasks as one-off processes
将管理/管理任务作为一次性进程运行