專注服務(wù),而非容器
現(xiàn)階段而言,容器聽起來可能很酷,但這種現(xiàn)狀或許不會(huì)持續(xù)太久。可以預(yù)見的是,容器將來也僅僅是一種基礎(chǔ)設(shè)施。經(jīng)驗(yàn)豐富的開發(fā)人員對部署應(yīng)用程序的方法和其它幾種類型的基礎(chǔ)設(shè)施可能已經(jīng)很熟悉了。容器對他們來說沒什么大不了的。
然而,通過容器架構(gòu)應(yīng)用程序,能為基礎(chǔ)設(shè)施帶來新機(jī)遇,并且市場前景巨大,這就是為什么微服務(wù)應(yīng)用程序中的服務(wù)比其運(yùn)行的容器化基礎(chǔ)設(shè)施要重要得多。
模塊化一直是應(yīng)用程序架構(gòu)的目標(biāo),如今,微服務(wù)的設(shè)想已成為可能,如何構(gòu)建這些服務(wù)最終決定了它們將在哪里運(yùn)行以及它們將以何種方式部署。應(yīng)用程序的功能通過服務(wù)滿足用戶需求,其價(jià)值也通過服務(wù)來實(shí)現(xiàn)。
這就是為什么如果你想充分利用容器,那你應(yīng)該考慮的不應(yīng)該僅僅只是容器。你必須關(guān)注服務(wù),因?yàn)樗鼈兪侨萜鲉⒂玫年P(guān)鍵。
服務(wù)和容器
為了便于對話,服務(wù)和容器是可以互換使用的,因?yàn)槿萜骰瘧?yīng)用程序的理想用例是解構(gòu)到服務(wù)中,每個(gè)服務(wù)都被部署為一個(gè)或多個(gè)容器。
但是,策略不盡相同。服務(wù)是一種隱含的基礎(chǔ)設(shè)施,更重要的是應(yīng)用程序體系結(jié)構(gòu)。當(dāng)您談到作為應(yīng)用程序一部分的服務(wù)時(shí),該服務(wù)是持久性的。例如,在沒有登錄頁面或購物車的情況下,你無法臨時(shí)擁有一個(gè)應(yīng)有程序,還指望其進(jìn)展順意。
另一方面,容器的生命周期在設(shè)計(jì)之初就被限定在極短的范圍內(nèi)。理想情況下, 在每次部署或還原時(shí), 一旦新的部署生效并且流量被路由到該容器就被終止。因此容器并不持久。如果交貨鏈正常運(yùn)行,那根本就不重要。只要新部署已存在并且通信流路由到該容器, 就會(huì)立即將其殺死。所以容器不是持久的。如果交付鏈正常運(yùn)行, 即使容器終止也無關(guān)緊要。
微服務(wù),既是一個(gè)應(yīng)用程序,也是一個(gè)基礎(chǔ)設(shè)施術(shù)語,它有一些與之相關(guān)聯(lián)的獨(dú)特元素,從而使它進(jìn)一步分化。
單個(gè)服務(wù)可以部署在多個(gè)區(qū)域。
每個(gè)區(qū)域都可以有多個(gè)版本——例如,A / B測試或Canary版本。
每個(gè)服務(wù)可能具有不同的生命周期。特定于后端的服務(wù)可能比前端服務(wù)部署的要少。
它甚至不一定意味著一個(gè)服務(wù)等于一個(gè)容器或一個(gè)主機(jī)。該服務(wù)是來自應(yīng)用程序中功能的邏輯抽象,并不直接與任何基礎(chǔ)設(shè)施相關(guān)。
以服務(wù)為中心意味著什么?
專注于您的服務(wù)意味著開發(fā)人員不會(huì)花時(shí)間優(yōu)化或修改容器編排或配置。如果最終版本的鏡像已經(jīng)準(zhǔn)備好,開發(fā)者只要關(guān)心提交他們的代碼就可以了。如果開發(fā)人員還需要把容器也納入考慮范圍,那就會(huì)打破某種平衡。
開發(fā)人員只有在開發(fā)環(huán)境中才需要考慮容器相關(guān)的事宜。開發(fā)環(huán)境和生產(chǎn)環(huán)境之間的平衡非常重要。要確保開發(fā)人員正在對正確的Docker鏡像進(jìn)行測試,并能夠訪問其他服務(wù),而左移QA是緩解“它在我的機(jī)器上明明能正常工作”這一問題的唯一途徑。這是通過強(qiáng)大的容器鏡像倉庫實(shí)現(xiàn)的。
然而,即使是開發(fā)環(huán)境也應(yīng)該被放在最末來考慮。
如何實(shí)現(xiàn)以服務(wù)為中心的工作流
我希望我可以說,專注于服務(wù)是一項(xiàng)獨(dú)立的開發(fā)任務(wù),但其實(shí)不是。開發(fā)人員已著眼于正在構(gòu)建的功能,如果他們因容器和業(yè)務(wù)流程而分心,那也是因?yàn)樗麄兪羌夹g(shù)狂人,他們想要修補(bǔ)問題,而不是因?yàn)樗麄冇X得這是他們的主要職責(zé)。
以服務(wù)為中心,是團(tuán)隊(duì)中的每個(gè)人的責(zé)任。包括如何架構(gòu)交付鏈——不僅要快,而且要避免更廣泛的團(tuán)隊(duì)需要與之進(jìn)行交互。因此,“以服務(wù)為中心”需要從管理開始,下放到傳遞鏈(或DevOps),再到工具,最終,開發(fā)人員要么保留基礎(chǔ)設(shè)施包,要么可以自由工作。以下是服務(wù)重點(diǎn)的三個(gè)關(guān)鍵原則:
- 規(guī)范開發(fā)環(huán)境。您可以通過找到一個(gè)強(qiáng)大的容器鏡像倉庫、審查圖像和標(biāo)準(zhǔn)化開發(fā)人員在其框中的工具來執(zhí)行此操作。由于服務(wù)是獨(dú)立開發(fā)的,其中一個(gè)挑戰(zhàn)是在整個(gè)應(yīng)用程序的服務(wù)中看到新的功能。因此,開發(fā)人員每次提交都可以部署的按需集成環(huán)境就顯得尤為重要。
- 保持不可變,不要只是掛在嘴邊。要想要以服務(wù)中心,你必須將“基礎(chǔ)設(shè)施不可變”付諸實(shí)踐,而不僅僅是嘴上說說。這意味著在部署容器后將不得再進(jìn)行更改,只能選擇運(yùn)行或刪除。嚴(yán)格禁止Snowflake鏡像或配置,除了服務(wù)本身所需功能之外,不允許訪問單個(gè)容器。
- 創(chuàng)建可見性?;诜?wù)的應(yīng)用程序確實(shí)有多個(gè)單片應(yīng)用程序的移動(dòng)部件。這意味著創(chuàng)建可見性并為所有涉眾提供訪問權(quán)限至關(guān)重要??梢娦赃€應(yīng)支持基礎(chǔ)設(shè)施和應(yīng)用程序可見性。團(tuán)隊(duì)?wèi)?yīng)該能夠查看整個(gè)應(yīng)用程序及其中的所有服務(wù),并能檢查單個(gè)容器。因此對開發(fā)團(tuán)隊(duì)來說,應(yīng)用程序的可見性是最重要的。
為避免發(fā)生重大故障,DevOps團(tuán)隊(duì)還需要盡可能地減少網(wǎng)絡(luò)和安全性的影響,其目標(biāo)是盡可能多地卸載編排工具。
專注于服務(wù)的目標(biāo)是避免分心,只專注于服務(wù)功能。如果開發(fā)人員專注于構(gòu)建一個(gè)偉大的產(chǎn)品,而DevOps則專注于構(gòu)建***的交付鏈,那么工具鏈和流程將會(huì)隨之就緒以提供支持——如今,這種偉大的產(chǎn)品誕生了,那就是容器和強(qiáng)大的編排工具。
用戶總是傾向于使用更優(yōu)質(zhì)的應(yīng)有程序,這就促使公司更加精益求精、日臻完善,至于達(dá)到這一目標(biāo)的機(jī)制,并非問題的關(guān)鍵所在。因此,下次您再談?wù)摰饺萜鲿r(shí),不妨考慮把重點(diǎn)放在如何構(gòu)建更好的服務(wù)上。