12-Factor App是一套为构建 SaaS 应⽤提供行之有效的⽅法论,也适⽤于任意语言和后端服务的开发的应⽤程序
中文文档:https://12factor.net/zh_cn/
基准代码(Codebase)
可使用SVN或Git等版本控制系统加以管理,有且仅有一套基准代码与应用保持⼀一对应的关系。
基准代码有且仅有一套,但可以同时存在多份部署。可以结合不同的配置文件,部署到生产环境、测试环境、开发环境等,或给不同用户搭建集群。
依赖(Dependencies)
应⽤程序必须显式声明依赖关系,可使用maven等工具管理依赖,确切地声明所有groupId 、artifactId,plugins等依赖项。
实际使用时为了防止出现同名类的引用冲突,建议使用扫描工具扫描一下是否存在同名类,是否需要处理。
也可针对应用或定期扫描,或在系统运行时管理依赖,即进行服务治理。
配置(Config)
在环境中活其他存储配置,可在外置于配置文件或使用配置中心维护配置信息。
后端服务(Backing services)
把后端服务当作附加资源,例如数据库或reids缓存,无关存储在本地还是远程。
构建,发布,运⾏(Build, release, run)
每⼀个发布版本必须对应⼀个唯一的发布 ID,每次尽量使用完整的包进行发布,保留发布过程。
12-Facfor 应用严格区分构建、发布、运⾏三个步骤。严格分离构建和运⾏,可使用jenkins自动化构建和打包。部署⼯具通常都提供了发布管理工具。
进程(Processes)
进程必须⽆状态且无共享,以⼀个或多个⽆状态进程运⾏应⽤。方便扩展或重启。
当资源比较昂贵的时候,也可适当存入一些状态,如用户的缓存大对象信息,可以使用用户ID做一些一致性hash的处理,使得用户的请求落到指定的服务器上面。
任何需要持久化的数据都要存储在后端数据库等服务内。
端口绑定(Port Binding)
通过端口绑定提供服务 。tomcat、nginx等容器可用于绑定端口。
并发(Concurrency)
通过进程模型进行扩展。要求程序可以部署在多机房多台机器上共同运行。
易处理(Disposability)
快速启动和优雅终止可最大化健壮性。保证系统高可用。
进程应当追求最小启动时间,⼀旦接收终止信号会优雅的终⽌,在面对突然死亡时保持健壮。
开发环境与线上环境等价(Dev / Prod parity)
灰度、集成测试、上线时。尽可能的保持开发,预发布,线上环境相同。
持续部署必须缩⼩本地与线上差异,后端服务保持开发与线上等价,反对在不同环境间使⽤不同的后端服务。
日志(Logs)
把⽇志当作事件流,如ELK等工具进行日志抓取等,把重要信息尽可能结构化展现和分析。
管理进程(Admin processes)
后台管理任务当作⼀次性进程运⾏。方便运营人员操作。