12因素
SaaS(Software-as-a-service):软件即服务.用户通过网络来访问软件的软件分发模型.它把软件当作一种服务来交付,它们被称为网络应用程序.
SaaS服务构建应该满足下面12种因素,这样才能实现:
标准化流程,快速上手
划清服务边界,提供最大的可移植性
适合部署在云平台,节省服务器和系统管理资源
缩减不同环境差异,便于持续交付
可在工具,架构和开发流程不发生明显变化的前提下实现扩展
理解12因素,要基于云服务(容器)的前提来考虑,就会更好理解它们的价值点.
- 1 基准代码
一份基准代码,多份部署
便于代码和应用之间对应
缩减不同环境差异
不同部署的应用版本,代码是否要保留??
release版本是从master中切出去的,大小版本迭代:模块化,维护成本高,接口地址会变多.
模块化:将支付宝拆分为支付,商家,金融不同模块;最终由专门团队聚合;
热修复版本:已发布版本存在bug,互联网产品因为是web应用,只需更新线上版本即可.存在客户端的历史版本需要发布补丁等处理.
- 2 依赖
显示声明依赖
简化环境配置流程
快速运行应用
避免依赖版本冲突;
- 3 配置
在环境变量中存储配置,让配置和代码分离.优点如下:
1 代码更加通用
2 配置与代码分开管理,容易管理,可避免配置误嵌入代码库;
3 不同环境的环境变量天然可以区分,不存在增加配置后,配置文件变多问题;
- 4 后端服务
把后端服务当作附加资源
后端服务是指:应用依赖的通过网络调用的各种服务.如数据库,缓存等;
将后端服务当作附加资源,它不区分本地或第三方服务,只要是网络调用就是后端服务,它的优点:
1 参数化依赖服务 所有的后端服务对于应用就是一个配置项;
2 按需装卸依赖服务 只要修改配置文件,就可以更换后端服务;
- 5 构建,发布,运行
严格分离构建和运行.
部署基准代码分为三个阶段:
构建阶段:将代码仓库转化为可执行包.构建时会使用指定版本的代码,获取和打包依赖项,编译成二进制文件和资源文件;
发布阶段:将构建结果和部署所需的配置结合,生成可运行应用;
运行阶段:运行已发布应用.
阶段分离的优点:
规范发布流程;
便于提起发现应用中异常;
加速应用启动;
- 6 进程
以一个或多个无状态进程运行应用
应用进行必须无状态且无共享.
任何持久化数据都要存储在后端服务内,如数据库.
内存区域或磁盘空间可以作为进程在做某种事务型操作时的缓存,因为它们不会影响应用状态.多进程间,缓存数据不共享;单进程内也会因为容器重新部署而丢弃这部分数据.
session保持通过redis等带有过期时间的缓存来处理.极力反对hash等"粘性session",这会让应用存在状态,同时也存在服务扩展后缓存穿透的问题.
tip:
一致性hash问题,针对于老系统,可能没有考虑会话问题或者文件状态问题,无法通过缓存方式获取会话状态等情况,反而采用一致性hash,可以很好的解决问题,也不用修改业务代码,所以具体原则运用也要考虑具体的场景.
- 7 端口绑定
通过端口绑定来提供服务
应用应完全自我加载,不依赖任何网络服务就可创建一个面向网络的服务.互联网应用通过端口绑定来提供服务.
应用依赖更灵活.任何应用都是一个可配置的参数.
运行更灵活.随起随用
- 8 并发
通过进程模型进行扩展
进程是云应用的基石,它主要基于unix守护进程模型(https://adam.herokuapp.com/past/2011/5/9/applying_the_unix_process_model_to_web_apps/).
进程无共享,水平分区,会让并发更容易添加且更健壮.
- 9 易处理
快速启动和优雅终止可最大化健壮性
进程易处理指:进程具备快速开启和停止的能力.追求最小启动时间.追求快且优雅的停止.还要保证停止时的健壮性.
有利于快速,弹性伸缩应用;
加速产品迭代;
降低停止的影响;
保证意外发生时,可以优雅的退出.
- 10 开发环境和线上环境等价
尽可能保持开发,预发布,线上环境相同
环境差异表现:
时间差异: 开发人员正在编写的代码时间线长;
人员差异: 开发人员编写代码,运维人员部署代码;
工具差异: 开发人员在用nginx,osx,线上环境使用apache,linux;
应用想持续部署必须缩小本地和线上差异.
缩小时间差异: 开发人员可以几小时甚至几分钟就部署代码;
缩小人员差异: 开发人员不知要编写代码,部署和线上服务运行也要参与;
缩小工具差异: 尽量保证开发环境和线上环境的一致性;
反对不同环境使用不同的后端服务.
- 11 日志
把日志当作事件流
应用本身不考虑存储自己的输出流.不应该去管理日志文件,每个运行的进程都会直接的标准输出事件流,将所有运行中的进程和后端服务的输出流按时间顺序收集.
开发环境: 通过这些数据流,实时的在终端看到应用的活动.
生产环境: 输出流汇集后发送给日志处理程序,用于查看或存档.
日志统一管理,便于查看整个调用链情况;
日志管理和应用解耦;
便于后续根据日志进行行为分析;
- 12 管理进程
后台管理任务当作一次性进程运行
进程构成:用来处理应用的常规业务的一组进程.常规业务之外,还有一些管理或维护应用的一次性任务,如:
数据迁移;
运行一个控制台,用于执行一些代码或进行数据检查等;
运行一些一次性脚本等;
这些后台管理任务应该当作一次性进程,它应该和常驻进程使用同样的环境.它应该随其他应用程序代码一起发布,从而避免同步问题.
避免同步问题
参考文档:
12factor https://12factor.net/zh_cn/