在云计算时代,应用的整个生命周期将在数据中心里度过,这跟传统软件模式极大不同。
云应用实际上意味着:代码 + 配置 + 运行时环境。
Heroku (一家 PaaS 服务提供者,2010 年被 Salesforce 收购)平台创始人 Adam Winggins 提出了推荐的应用十二风格,对我们设计和实现云时代(特别是 PaaS 和 SaaS 上)高效的应用都有很好的参考意义。
下面结合实践经验进行解读。
One codebase tracked in revision control, many deploys
每个子系统都用独立代码库管理,使用版本管理,实现独立的部署。
即拆分系统为多个分布式应用,每个应用使用自己的代码库进行管理。多个应用之间共享的代码用依赖库的形式提供。
Explicitly declare and isolate dependencies
显式声明依赖,通过环境来严格隔离不同依赖。所依赖的跟所声明的要保持一致。并且声明要包括依赖库的版本信息。
Store config in the environment
在环境变量中保存配置信息,而避免放在源码或配置文件中。
Treat backing services as attached resources
后端服务(数据库、消息队列、缓存等)作为可挂载资源来使用,这样系统跟外部依赖尽量松耦合。
Strictly separate build and run stages
区分不同生命周期的运行环境,包括创建(代码编译为运行包)、发布(多个运行包和配置放一起打包,打包是一次性的,每次修改都是新的 release)、运行,各个步骤的任务都很明确,要相互隔离。例如,绝对不允许在运行时去改代码和配置信息(见过太多工程师直接 SSH 到生产环境修 bug 了)。
Execute the app as one or more stateless processes
以一个或多个无状态的进程来运行应用,即尽量实现无状态,不要在进程中保存数据。尽量通过数据库来共享数据。
Export services via port binding
通过端口绑定来对外提供服务。
可以是 HTTP、XMPP、Redis 等协议。多个应用之间通过 URL 来使用彼此的服务。
Scale out via the process model
通过进程控制来扩展,即尽量以多进程模型进行扩展。
Maximize robustness with fast startup and graceful shutdown
快速启动(秒级响应),优雅关闭(收到 SIGTERM 信号后结束正在处理请求,然后退出),并尽量鲁棒(随时 kill,随时 crash 都不应该导致问题)。
Keep development, staging, and production as similar as possible
尽量保持从开发、演练到生产部署环境的相似性。
这点很不容易,真正要求工程师懂研发,还得懂运维。
Treat logs as event streams
将日志当作事件流来进行统一的管理和维护(使用 Logstash 等工具)。
应用只需要将事件写出来,例如到标准输出 stdout,剩下的由采集系统处理。
Run admin/management tasks as one-off processes
将管理(迁移数据库、查看状态等)作为一次性的系统服务来使用。
管理代码跟业务代码要放在一起进行代码管理。
转载请注明:http://blog.csdn.net/yeasy/article/details/40457885。