12-Factor App 是 Cloud Based 軟體開發的方法。它最初由 Heroku 的共同創辦人 Adam Wiggins 於 2011 年提出,總結當時在該平台上開發與部署應用程式後所獲得的寶貴經驗。2010 年代,系統正在從傳統伺服器,轉向 PaaS 與 SaaS。Heroku 的工程團隊整理出這套規範,讓開發者能建構出更具 Scalability 及 Portability 易於維護的應用程式。
方法的目標:
標準化
以宣告方式 declarative,建立自動配置,減輕新的開發人員初次參與專案的時間與成本
可移植性
有clean contract 明確的定義,確認作業系統,並能提供在不同執行環境運作的最大彈性
可部署在 cloud platforms
適合部署在先進的雲端系統,減少伺服器與系統的管理問題
持續部署
減少開發與正式環境的差異,能夠持續部署,以達成 agility 最大化
scale up
不需要改變工具、架構、開發環境,就能快速因應大流量
1. Codebase
One codebase tracked in revision control, many deploys
一份在 vevision control 管理的程式碼,可部署在多個執行環境
2. Dependencies
Explicitly declare and isolate dependencies
明確地宣告及隔離相依性
3. Config
Store config in the environment
在執行環境中儲存設定配置,不要寫在程式裡面
4. Backing services
Treat backing services as attached resources
把DB,Cache, MQ,SMTP 等等外部資源,透過 URI 的方式存取
5. Build, release, run
Strictly separate build and run stages
嚴格分離 Build, Release, Run 階段
build 是編譯成服務元件
release 是將元件發佈到 registry,提供給外部執行環境下載
run 是在執行環境取得元件,搭配部署設定執行該元件
6. Processes
Execute the app as one or more stateless processes
以一到多個無狀態程序執行app
7. Port binding
Export services via port binding
透過 service port binding 對外提供服務
8. Concurrency
Scale out via the process model
透過 process model 水平擴充
每一個 service app 都是獨立的 process,可啟動多個 thread 分散 process 性能壓力
同一個 service app 也可以啟動多個 instances
9. Disposability
Maximize robustness with fast startup and graceful shutdown
快速啟動/優雅終止 app,最大化系統穩定度
10. Dev/prod parity
Keep development, staging, and production as similar as possible
盡可能保持dev、pre-release、prod環境相同
11. Logs
Treat logs as event streams
將 logs 視為事件串流
微服務應該建立統一的服務來管理日誌(ELK、Graylog、Cloudwatch...)
每個運行的微服務都直接透過Stdout和Stderr來輸出日誌。開發時期透過console來查看時間排序下的Event log。正式環境,則是透過 log 管理服務,來收集、聚合、索引、分析這些Log
12. Admin processes
Run admin/management tasks as one-off processes
把維護/管理任務當作一次性process執行
例如 db migration, db snapshot, schema/table更動,定期renew憑證等等
把這些一次性作業寫成腳本或是Shell,當成一般程式來執行,也進到Git做版控
References
[12 Factor原則簡介