簡介
12-Factor 為構建如下的 SaaS 應用提供了方法論:
- 使用標準化流程自動配置,從而使新的開發者花費最少的學習成本加入這個專案。
- 和作業系統之間儘可能的劃清界限,在各個系統中提供最大的可移植性。
- 適合部署在現代的雲端計算平臺,從而在伺服器和系統管理方面節省資源。
- 將開發環境和生產環境的差異降至最低,並使用持續交付實施敏捷開發。
= 可以在工具、架構和開發流程不發生明顯變化的前提下實現擴充套件。
1、基準程式碼
一份基準程式碼(Codebase),多份部署(deploy)
儘管每個應用只對應一份基準程式碼,但可以同時存在多份部署。每份 部署 相當於執行了一個應用的例項。
2、依賴
顯式宣告依賴關係( dependency )
顯式宣告依賴是為新進開發者簡化了環境配置流程。新進開發者可以檢出應用程式的基準程式碼,安裝程式語言環境和它對應的依賴管理工具,只需通過一個 構建命令 來安裝所有的依賴項,即可開始工作。
3、 配置
在環境中儲存配置
應用的 配置 在不同 部署 (預釋出、生產環境、開發環境等等)間會有很大差異。環境變數可以非常方便地在不同的部署間做修改,卻不動一行程式碼;與配置檔案不同,不小心把它們簽入程式碼庫的概率微乎其微;與一些傳統的解決配置問題的機制(比如 Java 的屬性配置檔案)相比,環境變數與語言和系統無關。
4、後端服務
把後端服務(backing services)當作附加資源。
後端服務是指程式執行所需要的通過網路呼叫的各種服務,如資料庫(MySQL,CouchDB),訊息/佇列系統(RabbitMQ,Beanstalkd),SMTP 郵件傳送服務(Postfix),以及快取系統(Memcached)。
對應用程式而言,通過一個 url 或是其他儲存在配置中的服務定位/服務證照來獲取資料。12-Factor 應用的任意 部署 ,都應該可以在不進行任何程式碼改動的情況下,將本地 MySQL 資料庫換成第三方服務(例如 Amazon RDS)。
5、 構建,釋出,執行
基準程式碼 轉化為一份部署(非開發環境)需要以下三個階段:
- 構建階段 是指將程式碼倉庫轉化為可執行包的過程。構建時會使用指定版本的程式碼,獲取和打包 依賴項,編譯成二進位制檔案和資原始檔。
- 釋出階段 會將構建的結果和當前部署所需配置相結合,並能夠立刻在執行環境中投入使用。
- 執行階段 (或者說“執行時”)是指標對選定的釋出版本,在執行環境中啟動一系列應用程式程式。
6、程式
以一個或多個無狀態程式執行應用
任何需要持久化的資料都要儲存在 後端服務 內,比如資料庫。Session 中的資料應該儲存在諸如 Memcached 或 Redis 這樣的帶有過期時間的快取中。
7、埠繫結
通過埠繫結(Port binding)來提供服務
網際網路應用 通過埠繫結來提供服務 ,並監聽傳送至該埠的請求。本地環境中,開發人員通過類似http://localhost:5000/的地址來訪問服務。線上上環境中,請求統一傳送至公共域名而後路由至繫結了埠的網路程式。
8、併發
通過程式模型進行擴充套件
將不同的工作分配給不同的 程式型別 。例如,HTTP 請求可以交給 web 程式來處理,而常駐的後臺工作則交由 worker 程式負責。
9、易處理
快速啟動和優雅終止可最大化健壯性
12-Factor 應用的程式是易處理(disposable)的,意思是說它們可以瞬間開啟或停止。 這有利於快速、彈性的伸縮應用,迅速部署變化的 程式碼 或 配置 ,穩健的部署應用。
程式應當追求 最小啟動時間。
程式 一旦接收 終止訊號(SIGTERM) 就會優雅的終止 。
10、開發環境與線上環境等價
儘可能的保持開發,預釋出,線上環境相同。
12-Factor 應用想要做到 持續部署 就必須縮小本地與線上差異。 再回頭看上面所描述的三個差異:
- 縮小時間差異:開發人員可以幾小時,甚至幾分鐘就部署程式碼。
- 縮小人員差異:開發人員不只要編寫程式碼,更應該密切參與部署過程以及程式碼線上上的表現。
- 縮小工具差異:儘量保證開發環境以及線上環境的一致性。
11、日誌
把日誌當作事件流
日誌應該是 事件流 的彙總,將所有執行中程式和後端服務的輸出流按照時間順序收集起來。儘管在回溯問題時可能需要看很多行,日誌最原始的格式確實是一個事件一行。
12、 管理程式
後臺管理任務當作一次性程式執行
一次性管理程式應該和正常的常駐程式使用同樣的環境。這些管理程式和任何其他的程式一樣使用相同的 程式碼 和 配置 ,基於某個 釋出版本 執行。後臺管理程式碼應該隨其他應用程式程式碼一起釋出,從而避免同步問題。