目前,一些大型企業(yè)都在AWS的基礎(chǔ)之上部署微服務(wù)架構(gòu)。這一舉措能夠為企業(yè)帶來什么樣的好處呢?
微服務(wù)是一個新興的軟件架構(gòu),就是把一個大型的單個應(yīng)用程序和服務(wù)拆分為數(shù)十個的支持微服務(wù)。一個微服務(wù)的策略可以讓工作變得更為簡便,它可擴展單個組件而不是整個的應(yīng)用程序堆棧,從而滿足服務(wù)等級協(xié)議。
對于大型應(yīng)用程序來說,增加更多的用戶則意味著提供更大型的彈性計算云(EC2)實例規(guī)模,即便只是其中的一些功能擴大了規(guī)模亦是如此。其最終結(jié)果就是企業(yè)用戶只需為支持超過微服務(wù)的那部分需求的EC2實例支付費用。一些大型企業(yè)(如Netflix和Nike等)都在亞馬遜Web服務(wù)(AWS)的基礎(chǔ)之上部署了一個微服務(wù)架構(gòu),從而提高靈活性和以較低的價格來實現(xiàn)應(yīng)用程序的擴展。Netflix橫跨其30個工程團隊設(shè)計部署了500多個微服務(wù)。
在容器和代碼之間進行選擇
微服務(wù)架構(gòu)是把應(yīng)用程序作為獨立可部署服務(wù)組合的一個設(shè)計方法。雖然對于這一概念還沒有確切的定義,但是這些架構(gòu)往往是圍繞業(yè)務(wù)能力、自動化部署以及去中心化管理來組織設(shè)計的。
很多企業(yè)都正在使用容器技術(shù),例如基于亞馬遜EC2容器技術(shù)的Docker,就讓在EC2實例的托管集群上運行應(yīng)用程序成為可能。這樣做就降低了對安裝、運行和擴展集群管理基礎(chǔ)設(shè)施的要求,而這正是部署單個微服務(wù)組件所需要的。但是并不需要為實施微服務(wù)而設(shè)計容器。
諸如AWS Lamba這樣的新服務(wù)讓部署一個微服務(wù)架構(gòu)且無需容器或虛擬機成為了可能。Lambda運行代碼響應(yīng)事件和管理計算資源,從而讓建立響應(yīng)事件或流量的微服務(wù)集合變得更為簡便。開發(fā)人員可以在Lambda上在諸如網(wǎng)站點擊這類毫秒級事件內(nèi)啟動新服務(wù);計費增量以100毫秒計。
簡化至微服務(wù)架構(gòu)的轉(zhuǎn)移
企業(yè)的架構(gòu)師們有大量的最佳實踐可以遵循以便最好地實現(xiàn)至微服務(wù)的轉(zhuǎn)移,具體包括正確選擇存儲設(shè)施、重新思考傳統(tǒng)IT豎井式系統(tǒng)、創(chuàng)建微服務(wù)組件之間的邊界,等等。
為每一個服務(wù)選擇最佳數(shù)據(jù)存儲。微服務(wù)架構(gòu)的優(yōu)點之一就是單個微服務(wù)都是松散耦合的。這樣就能夠讓開發(fā)人員選擇最適合某一特定微服務(wù)的開發(fā)語言和數(shù)據(jù)存儲,而不是對所有的組件都使用一個數(shù)據(jù)庫。
使用微服務(wù)團隊取代“豎井”。對于一個微服務(wù)架構(gòu),軟件開發(fā)團隊必須保持密切協(xié)作和可擴展的態(tài)勢。Conway的Law表示,一個軟件系統(tǒng)的接口結(jié)構(gòu)往往反映了開發(fā)這一軟件系統(tǒng)的組織的體系結(jié)構(gòu)。為了切換至微服務(wù)架構(gòu),企業(yè)需要組織員工成為有組織的生產(chǎn)團隊并使用開發(fā)運營方法。
傳統(tǒng)軟件團隊的組織架構(gòu)條塊分割,形成了涇渭分明的開發(fā)、質(zhì)保以及生產(chǎn)小組。“你需要一個小型團隊來負責它的微服務(wù)——從概念形成、概要設(shè)計、詳細編碼、組織測試到實際部署——然后(據(jù)推測)就是解bug和升級更新,一家應(yīng)用程序交付平臺供應(yīng)商Nginx的產(chǎn)品負責人Owen Garret說。
像對待網(wǎng)絡(luò)應(yīng)用程序一樣看待微服務(wù)。必須在微服務(wù)組件之間建立強邊界。像對待網(wǎng)絡(luò)應(yīng)用程序一樣看待微服務(wù)意味著獨立開發(fā)團隊不需要對不同微服務(wù)的內(nèi)部工作原理有一個透徹的理解。反之,微服務(wù)需要一個可執(zhí)行相關(guān)功能的API。
“你不需要透露你的微服務(wù)的任何內(nèi)部信息,”Garrett補充道。“另一個微服務(wù)的開發(fā)團隊完全不需要了解微服務(wù)的表達方式或者內(nèi)部數(shù)據(jù)是如何對其進行請求的。”只要相關(guān)API與其他微服務(wù)的關(guān)系不被打破,那么這個方法就可以讓開發(fā)人員按需求修改微服務(wù)。
使用聲明合同。程序使用服務(wù)合同的聲明特性,而不是執(zhí)行如何使用其它服務(wù)的程序。使用一個抽象方法來運行需求是更簡便的;一組解釋性的步驟將讓程序變得更為靜態(tài)。這意味著開發(fā)人員可以通過策略實施應(yīng)用程序并向基礎(chǔ)設(shè)施發(fā)送指令。
例如,開發(fā)人員可以不對EC2語義進行編碼,他們可以使用策略把數(shù)據(jù)移至AWS產(chǎn)品。可以把聲明納入到容納微服務(wù)的容器中,或者把聲明嵌入到被用于與AWS產(chǎn)品進行通訊的Lamba代碼中。
使用OODA循環(huán)。因為不同的團隊會開發(fā)不同的微服務(wù),所以企業(yè)必須確保軟件開發(fā)團隊都有著一個共同的工作目標。這樣,使用Netflix的Observe、Orient、Decide、Act(OODA)循環(huán)將會有很大幫助。
在一個OODA循環(huán)中,觀察(Observe)涉及檢查代碼庫的當前狀態(tài)以尋求進行創(chuàng)新的機會;定向(Orient)表示分析指標以了解已觀察到的現(xiàn)象;決定(Decide)則是制定和執(zhí)行項目計劃的過程;而行動(act)是測試解決方案并將其投入生產(chǎn)的過程。