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