12-Factor 應(yīng)用方法論的開源開發(fā)者指南
12-Factor 應(yīng)用方法論 為在短時間內(nèi)構(gòu)建應(yīng)用程序并使其具有可擴(kuò)展性提供了指導(dǎo)。它由 Heroku 的開發(fā)人員創(chuàng)建,用于軟件即服務(wù)(SaaS)應(yīng)用程序、網(wǎng)絡(luò)應(yīng)用程序以及可能的通信平臺即服務(wù)(CPaaS)。在有效組織項目和管理可擴(kuò)展應(yīng)用程序方面,12 要素應(yīng)用程序方法論對開源開發(fā)具有強(qiáng)大的優(yōu)勢。
12-Factor 應(yīng)用方法論的原則
12-Factor 應(yīng)用方法論的規(guī)則非常嚴(yán)格,也是開發(fā)和部署 SaaS 應(yīng)用程序的基石,并且不受任何編程語言或數(shù)據(jù)庫的限制。
1:一份基準(zhǔn)代碼,多份部署
一個說明圖表:顯示了一個由左邊的綠線代表的代碼庫,引導(dǎo)到右邊由綠色方塊代表的四個部署。橙色方塊代表暫存環(huán)境,而紅色方塊代表生產(chǎn)環(huán)境。
一個說明圖表:顯示了一個由左邊的綠線代表的代碼庫,引導(dǎo)到右邊由綠色方塊代表的四個部署。橙色方塊代表暫存環(huán)境,而紅色方塊代表生產(chǎn)環(huán)境。
每個應(yīng)用程序都應(yīng)該有一個具有多個不同環(huán)境/部署的代碼庫。
開發(fā)人員不應(yīng)僅僅為了在不同環(huán)境中設(shè)置而開發(fā)另一個代碼庫。不同的環(huán)境代表不同的狀態(tài),但這些不同的環(huán)境應(yīng)該共享同一個代碼庫。
在許多開源項目都存儲在 GitLab 這樣的版本控制系統(tǒng)中的情況下,一個環(huán)境可以被視為一個分支。例如,你可以在任何中央版本控制系統(tǒng)中為名為 VoIP-app 的云 VoIP 應(yīng)用程序創(chuàng)建一個單獨的存儲庫,然后創(chuàng)建兩個分支:開發(fā)分支(development
)和暫存分支(staging
),并將主分支(master
)作為發(fā)布分支。
2:明確聲明和隔離依賴關(guān)系
應(yīng)聲明所有依賴關(guān)系。你的應(yīng)用程序可能會依賴外部系統(tǒng)工具或庫,但不應(yīng)對系統(tǒng)工具或庫有任何 隱含的
在代碼庫中包含依賴關(guān)系可能會產(chǎn)生問題,特別是在開源項目中,外部庫的更改可能會將錯誤引入代碼庫。例如,代碼庫可能會使用一個外部庫,但沒有明確聲明該依賴關(guān)系或版本。如果外部庫更新到更新的、未經(jīng)測試的版本,這可能會與你的代碼產(chǎn)生兼容性問題。如果明確聲明了依賴關(guān)系及其正確版本,你的代碼庫就不會出現(xiàn)這種問題。
根據(jù)技術(shù)棧的不同,最好使用軟件包管理器,通過讀取代表依賴庫名稱和版本的依賴庫聲明清單,在各自的系統(tǒng)上下載依賴庫。
3:在環(huán)境中存儲配置
當(dāng)需要支持多個環(huán)境或客戶端時,配置就成了應(yīng)用程序的重要組成部分。不同部署之間的配置應(yīng)存儲在環(huán)境變量中。這樣就可以在部署之間輕松更改配置,而無需更改代碼。
對于閉源應(yīng)用程序來說,這一原則是有益的,因為你不會希望數(shù)據(jù)庫連接信息或其他秘密數(shù)據(jù)等敏感信息被公開。然而,在開放源代碼開發(fā)中,這些細(xì)節(jié)都是公開的。在這種情況下,好處是你不需要反復(fù)修改代碼。你只需這樣設(shè)置變量,只需改變環(huán)境,就能讓代碼完美運行。
4:把后端服務(wù)當(dāng)作附加資源
所有后備服務(wù)(如數(shù)據(jù)庫、外部存儲或消息隊列)都被視為附加資源,由執(zhí)行環(huán)境附加或分離。根據(jù)這一原則,如果這些服務(wù)的位置或連接細(xì)節(jié)發(fā)生變化,仍無需更改代碼。這些細(xì)節(jié)可以在配置中找到。
備份服務(wù)可以從部署中快速附加或分離。例如,如果基于云的電子表格的數(shù)據(jù)庫無法正常工作,開發(fā)人員應(yīng)該能夠創(chuàng)建一個從最近備份恢復(fù)的新數(shù)據(jù)庫服務(wù)器,而無需對代碼庫進(jìn)行任何更改。
5:嚴(yán)格分離構(gòu)建和運行
12-Factor 應(yīng)用方法論要求嚴(yán)格區(qū)分構(gòu)建、發(fā)布和運行階段。
- 第一階段是 構(gòu)建
- 第二階段是 發(fā)布
- 第三個階段是 運行
通過嚴(yán)格區(qū)分這些階段,我們可以避免代碼中斷,使系統(tǒng)維護(hù)更加易于管理。
6:以一個或多個無狀態(tài)進(jìn)程運行應(yīng)用
應(yīng)用程序作為一個或多個進(jìn)程的集合在執(zhí)行環(huán)境中執(zhí)行。這些進(jìn)程是無狀態(tài)的,其持久化數(shù)據(jù)存儲在數(shù)據(jù)庫等后臺服務(wù)中。
這對開源非常有用,因為使用某版本應(yīng)用程序的開發(fā)人員可以在其云平臺上創(chuàng)建多節(jié)點部署,以實現(xiàn)可擴(kuò)展性。數(shù)據(jù)不會在其中持久化,因為如果其中任何一個節(jié)點崩潰,數(shù)據(jù)就會丟失。
7:通過端口綁定提供服務(wù)
你的應(yīng)用程序應(yīng)作為獨立的服務(wù),獨立于其他應(yīng)用程序。它它應(yīng)該能通過URL供其他服務(wù)訪問,以服務(wù)形式存在。這樣,你的應(yīng)用程序就可以在需要時作為其他應(yīng)用程序的資源。利用這一概念,你可以構(gòu)建 REST API。
8:通過進(jìn)程模型進(jìn)行擴(kuò)展
該原則也稱為并發(fā)原則,它表明應(yīng)用程序中的每個進(jìn)程都應(yīng)能夠自我擴(kuò)展、重啟或克隆。
開發(fā)人員可以創(chuàng)建多個進(jìn)程,并將應(yīng)用程序的負(fù)載分配給這些進(jìn)程,而不是將一個進(jìn)程變大。通過這種方法,你可以將每種工作負(fù)載分配給一個進(jìn)程類型,從而構(gòu)建能處理不同工作負(fù)載的應(yīng)用程序。
9:快速啟動和優(yōu)雅終止以增強(qiáng)健壯性
你的應(yīng)用應(yīng)當(dāng)基于簡單的進(jìn)程構(gòu)建,因此開發(fā)者可以放大進(jìn)程的同時還能在發(fā)生問題時重啟它們。這使得應(yīng)用的進(jìn)程易于丟棄。
根據(jù)這一原則構(gòu)建應(yīng)用程序意味著代碼的快速部署、快速彈性擴(kuò)展、更靈活的發(fā)布流程以及穩(wěn)健的生產(chǎn)部署。所有這些在開源開發(fā)環(huán)境中都非常有用。
10:盡可能的保持開發(fā)、預(yù)發(fā)布、生產(chǎn)環(huán)境相同
同一項目的團(tuán)隊?wèi)?yīng)使用相同的操作系統(tǒng)、支持服務(wù)和依賴關(guān)系。這樣可以降低出現(xiàn)錯誤的可能性,減少開發(fā)所需的時間。
由于開源項目的開發(fā)人員分散在各地,他們可能無法就所使用的系統(tǒng)、服務(wù)和依賴關(guān)系進(jìn)行 溝通 ,因此將這一原則付諸實踐對于開源項目來說可能是一個挑戰(zhàn)。減少這些差異的一種可能性是制定開發(fā)指南,建議使用何種操作系統(tǒng)、服務(wù)和依賴關(guān)系。
11:把日志當(dāng)作事件流
日志對于排除生產(chǎn)問題或了解用戶行為至關(guān)重要。但是,12-Factor 應(yīng)用方法論并不適合處理日志的管理。
相反,應(yīng)將日志條目作為事件流,寫入標(biāo)準(zhǔn)輸出,并將其發(fā)送到單獨的服務(wù)進(jìn)行分析和存檔。機(jī)器人流程自動化(RPA)技術(shù)可作為處理和分析日志的第三方服務(wù)。執(zhí)行環(huán)境將決定如何處理該數(shù)據(jù)流。這為反省應(yīng)用程序的行為提供了更大的靈活性和能力。
12:后臺管理任務(wù)當(dāng)作一次性進(jìn)程運行
這一原則實際上與開發(fā)無關(guān),而是與應(yīng)用程序管理有關(guān)。管理進(jìn)程應(yīng)在與應(yīng)用程序常規(guī)長期運行進(jìn)程相同的環(huán)境中運行。在本地部署中,開發(fā)人員可以直接使用應(yīng)用程序簽出目錄內(nèi)的 Shell 命令來執(zhí)行一次性管理進(jìn)程。
結(jié)論
使用 12-Factor 應(yīng)用方法論開發(fā)應(yīng)用程序,可以提高效率,加快發(fā)布速度。在開源開發(fā)中,偏離某些指導(dǎo)原則可能是有意義的,但最好還是盡可能嚴(yán)格遵守這些指導(dǎo)原則。
開源的 12-Factor 應(yīng)用是可能的。一個很好的例子是 Jitsi, (一個開源視頻會議平臺), 在疫情期間擴(kuò)展了 100 倍的規(guī)模,取得了巨大成功,它就是采用 12-Factor 應(yīng)用方法論構(gòu)建的。