明天來自pivotal的老師要講云原生應(yīng)用的12要素仅政,可惜聽不了了傻唾,今晚自學(xué)一下只酥。
-
一份基準(zhǔn)代碼(Codebase)切揭,多份部署(deploy)
圖片發(fā)自簡書App 顯式聲明依賴關(guān)系( dependency ),比如你的應(yīng)用依賴了哪些第三方庫授霸,要顯示地定義在某個文件里巡验。
代碼和配置嚴(yán)格分離,配置要和代碼完全分離碘耳,不同環(huán)境共享一套代碼显设。推薦將應(yīng)用的配置存儲于 環(huán)境變量 中( env vars, env )。環(huán)境變量可以非常方便地在不同的部署間做修改辛辨,卻不動一行代碼捕捂。
-
把后端服務(wù)(backing services)當(dāng)作附加資源,后端服務(wù)是指程序運行所需要的通過網(wǎng)絡(luò)調(diào)用的各種服務(wù)斗搞,如數(shù)據(jù)庫(MySQL指攒,CouchDB),消息/隊列系統(tǒng)(RabbitMQ僻焚,Beanstalkd)允悦,SMTP 郵件發(fā)送服務(wù)(Postfix),以及緩存系統(tǒng)(Memcached)虑啤。
圖片發(fā)自簡書App -
嚴(yán)格分離構(gòu)建隙弛、發(fā)布和運行。構(gòu)建是指將代碼倉庫轉(zhuǎn)化為可執(zhí)行包的過程咐旧。發(fā)布會將構(gòu)建的結(jié)果和當(dāng)前部署所需配置相結(jié)合驶鹉,并能夠立刻在運行環(huán)境中投入使用绩蜻。運行是指針對選定的發(fā)布版本铣墨,在執(zhí)行環(huán)境中啟動一系列應(yīng)用程序進(jìn)程。
圖片發(fā)自簡書App 以一個或多個無狀態(tài)進(jìn)程運行應(yīng)用办绝,用戶session 是 12-Factor 極力反對的伊约,Session 中的數(shù)據(jù)應(yīng)該保存在諸如 Memcached 或 Redis 這樣的帶有過期時間的緩存中姚淆。
通過端口綁定(Port binding)來提供服務(wù),互聯(lián)網(wǎng)應(yīng)用 通過端口綁定來提供服務(wù) 屡律,并監(jiān)聽發(fā)送至該端口的請求腌逢。比如本地環(huán)境中,開發(fā)人員通過類似http://localhost:5000/的地址來訪問服務(wù)超埋。
通過進(jìn)程模型進(jìn)行擴(kuò)展搏讶,在云原生應(yīng)用中,進(jìn)程是一等公民霍殴。云原生應(yīng)用的進(jìn)程主要借鑒于 unix 守護(hù)進(jìn)程模型 媒惕。開發(fā)人員可以運用這個模型去設(shè)計應(yīng)用架構(gòu),將不同的工作分配給不同的 進(jìn)程類型 来庭。例如妒蔚,HTTP 請求可以交給 web 進(jìn)程來處理,而常駐的后臺工作則交由 worker 進(jìn)程負(fù)責(zé)月弛。
可快速啟動和優(yōu)雅終止的進(jìn)程可最大化健壯性肴盏,云原生應(yīng)用的進(jìn)程是 易處理(disposable)的,意思是說它們可以瞬間開啟或停止帽衙。
盡可能的保持開發(fā)菜皂,預(yù)發(fā)布,線上環(huán)境相同厉萝。
把日志當(dāng)作事件流幌墓,日志應(yīng)該是 事件流 的匯總,將所有運行中進(jìn)程和后端服務(wù)的輸出流按照時間順序收集起來冀泻。盡管在回溯問題時可能需要看很多行常侣,日志最原始的格式確實是一個事件一行。
后臺管理任務(wù)當(dāng)作一次性進(jìn)程運行弹渔,一次性管理進(jìn)程應(yīng)該和正常的常駐進(jìn)程使用同樣的環(huán)境胳施。這些管理進(jìn)程和任何其他的進(jìn)程一樣使用相同的代碼和配置,基于某個 發(fā)布版本 運行肢专。后臺管理代碼應(yīng)該隨其他應(yīng)用程序代碼一起發(fā)布舞肆,從而避免同步問題。