- 由Heroku创始人Adam Wiggins在2012年发布。
- 是一个开发服务器应用的方法论。开发运行一个服务器程序,应该考虑这些方面。
- 使用于任意语言和后端服务开发的应用程序。
- 最佳阅读人员:服务器开发和运维人员。
- 中心思想是隔离。
1.基准代码
1个模块只有1份基准代码,多个模块组成的是一个分布式系统。基准代码应该用版本管理工具加以控制,每个基准代码应该独占1个库,同属1个系统的多个基准代码库可以加入组。
2.依赖
- 显示声明依赖。
- 通过依赖隔离工具来确保程序不会调用系统种存在但清单中未声明的依赖项。这种做法应该统一应用到开发和生产环境。
3.配置
- 与代码分离。
- 推荐保存到环境变量。
4.后端服务
- 把后端服务当做附加资源。如数据库,MQ,SMTP,缓存等。
- 应该保证应用在不改动任何代码的情况下,将本地mysql换成第三方服务(如Amazon RDS)
5.构建,发布,运行
严格分离构建和运行
基准代码转换成一份部署需要三个阶段:
1)构建阶段:将代码转化成可执行包的过程。构建时会使用指定版本的代码,获取和打包依赖项,编译成二进制文件和资源文件
2)发布阶段:将构建结果和当前部署所需配置相结合,并能够立即在运行环境中投入使用
3)运行阶段:只针对选定的发布版本,在执行环境中启动一系列运行程序进程
6.进程
- 系统可以有1个或多个进程,进程必须无状态且无共享,任何需要持久化的数据都存储在后端服务中(比如数据库)。
- 内存和磁盘可以作为进程在进行某种事务型操作时的缓存(比如下载一个很大的文件)。不考虑这些缓存的内容是不是可以保留给之后的请求使用。
- 如果需要在内存中保存数据,优先考虑使用redis等内存数据库。
7.端口绑定
- 使用端口提供服务。
8.并发
- 应该更多考虑水平扩展的可能。
- 不需要自己设置守护进程,而应交给其他进程托管系统。
9.易处理
- 可以瞬间开启或停止,有利于快速、弹性的伸缩应用
- 进程接收到终止信号会优雅的终止。对网络进程,优雅就是停止监听服务的端口,拒绝信的请求,并执行当前已接收到的请求,然后退出。对worker进程,优雅终止就是当前任务退出队列。任务都应该可重复,使重复操作幂等实现。
- 应该可以处理 意外的、不优雅的终止。
10.开发环境与线上环境等价
尽可能保持开发、预发布、线上环境相同
开发环境和线上环境的差异有:
- 时间差异:开发的代码可能几天,几周才会上线
- 人员差异:开发人员编写代码,运维人员部署代码
- 工具差异: 开发人员或许使用nginx,sqlite, osx,线上环境使用apache,mysql,linux
11.日志
把日志当做事件流。
日志使应用程序运行的动作变得透明。服务器环境中,日志通常被写在文件中,但这只是一种输出格式。
日志应该是事件流的汇总,将所有运行中进程和后端服务的数据流按照时间顺序收集起来。
应用本身不应考虑存储自己的数据流,不应该试图去写或管理日志文件,都应该直接输出的标准输出(stdout)。最后汇总到统一的日志处理系统中。
12.管理进程
后台管理任务当做一次性进程运行。