成小胖學(xué)習(xí)微服務(wù)架構(gòu)·基礎(chǔ)篇
看到最近“微服務(wù)架構(gòu)”這個概念這么火,作為一個積極上進的程序猿,成小胖忍不住想要學(xué)習(xí)學(xué)習(xí)。而架構(gòu)師老王(不是隔壁老王)最近剛好在做公司基礎(chǔ)服務(wù)的微服務(wù)化研究和落地,對此深有研究。
于是成小胖馬上屁顛屁顛的跑過去向老王請教:“王哥,我看微服務(wù)架構(gòu)這么火,我也想學(xué),您給我講講啥是微服務(wù)架構(gòu)唄?”
老王笑了笑說:“要想知道什么是微服務(wù)架構(gòu),你得先知道什么系統(tǒng)架構(gòu)設(shè)計。”
成小胖的理想是成為一名架構(gòu)師,平時積累了不少知識,因此對“系統(tǒng)架構(gòu)設(shè)計”這個概念還是很熟悉的,因此他馬上就給出了答案【1】:
系統(tǒng)架構(gòu)設(shè)計描述了在應(yīng)用系統(tǒng)的內(nèi)部,如何根據(jù)業(yè)務(wù)、技術(shù)、組織、靈活性、可擴展性以及可維護性等多種因素,將應(yīng)用系統(tǒng)劃分成不同的部分,并使這些部分彼此之間相互分工、相互協(xié)作,從而為用戶提供某種特定的價值的方式。
老王滿意的點點頭,繼續(xù)問:“你看最近我在做微服務(wù)的研究和落地,你知道為什么要做這個事情嗎?”
“因為目前的三層架構(gòu)存在很多弊端,不滿足業(yè)務(wù)發(fā)展的需求了唄。”
“對的,我看你對公司目前的架構(gòu)也非常熟悉了,你來仔細說說現(xiàn)在的三層架構(gòu)吧?!?div style="height:15px;">
于是成小胖拿了一張A4紙,圖文并茂地給老王講了他對三層架構(gòu)的理解:
三層架構(gòu)是指在業(yè)務(wù)和技術(shù)的發(fā)展過程中,系統(tǒng)中不同職責(zé)的部分被定義在不同的層次,每一層負責(zé)的功能更加具體化。三層架構(gòu)通常包括表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,層與層之間互相連接、互相協(xié)作,構(gòu)成一個整體,并且層的內(nèi)部可以被替換成其他可以工作的部分,但對整體的影響不大。
以 Web 應(yīng)用程序為例,早期是將所有的表示邏輯、業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯放在一起,這就是一層架構(gòu)。
后來隨著 java、.NET 等高級語言的發(fā)展,提供了越來越方便的數(shù)據(jù)訪問機制,如 java 的 JDBC 和 .NET 的 ADO.NET。這時數(shù)據(jù)訪問部分被分離開來,形成了二層架構(gòu)。
再后來,隨著面向?qū)ο笤O(shè)計、企業(yè)架構(gòu)模式等理念的不斷發(fā)展,表示邏輯和業(yè)務(wù)邏輯也被分離開來,形成了現(xiàn)在的三層架構(gòu)。
三層架構(gòu)的具體內(nèi)容如下:
表示層: 用戶使用應(yīng)用程序時,看到的、聽見的、輸入的或者交互的部分。
業(yè)務(wù)邏輯層: 根據(jù)用戶輸入的信息,進行邏輯計算或者業(yè)務(wù)處理的部分。
數(shù)據(jù)訪問層: 關(guān)注有效地操作原始數(shù)據(jù)的部分,如將數(shù)據(jù)存儲到存儲介質(zhì)(如數(shù)據(jù)庫、文件系統(tǒng))及從存儲介質(zhì)中讀取數(shù)據(jù)等。
老王對這個解釋非常滿意,作了進一步的補充:“你看雖然現(xiàn)在程序被分成了三層,但只是邏輯上的分層,并不是物理上的分層。也就是說,對不同層的代碼而言,經(jīng)過編譯、打包和部署后,所有的代碼最終還是運行在同一個進程中。而這,就是所謂的單塊架構(gòu)?!?div style="height:15px;">
成小胖撓了撓頭:“原來單塊架構(gòu)是這個意思啊~~”
“嗯。根據(jù)你的實際工作經(jīng)驗,你再總結(jié)下單塊架構(gòu)的優(yōu)缺點吧。”
平時勤于總結(jié)的成小胖很快便列出了單塊架構(gòu)的優(yōu)缺點:
優(yōu)點:
易于開發(fā): 開發(fā)方式簡單,IDE 支持好,方便運行和調(diào)試。
易于測試: 所有功能運行在一個進程中,一旦進程啟動,便可以進行系統(tǒng)測試。
易于部署: 只需要將打好的一個軟件包發(fā)布到服務(wù)器即可。
易于水平伸縮: 只需要創(chuàng)建一個服務(wù)器節(jié)點,配置好運行時環(huán)境,再將軟件包發(fā)布到新服務(wù)器節(jié)點即可運行程序(當(dāng)然也需要采取分發(fā)策略保證請求能有效地分發(fā)到新節(jié)點)。
缺點:
維護成本大: 當(dāng)應(yīng)用程序的功能越來越多、團隊越來越大時,溝通成本、管理成本顯著增加。當(dāng)出現(xiàn) bug 時,可能引起 bug 的原因組合越來越多,導(dǎo)致分析、定位和修復(fù)的成本增加;并且在對全局功能缺乏深度理解的情況下,容易在修復(fù) bug 時引入新的 bug。
持續(xù)交付周期長: 構(gòu)建和部署時間會隨著功能的增多而增加,任何細微的修改都會觸發(fā)部署流水線。
新人培養(yǎng)周期長: 新成員了解背景、熟悉業(yè)務(wù)和配置環(huán)境的時間越來越長。
技術(shù)選型成本高: 單塊架構(gòu)傾向于采用統(tǒng)一的技術(shù)平臺或方案來解決所有問題,如果后續(xù)想引入新的技術(shù)或框架,成本和風(fēng)險都很大。
可擴展性差: 隨著功能的增加,垂直擴展的成本將會越來越大;而對于水平擴展而言,因為所有代碼都運行在同一個進程,沒辦法做到針對應(yīng)用程序的部分功能做獨立的擴展。
老王拍了拍成小胖的肩膀,眼睛瞇成了一條縫:“小伙子總結(jié)的很不錯!既然你已經(jīng)對目前的單塊架構(gòu)的優(yōu)缺點有了很好的理解,那現(xiàn)在咱們就可以開始來學(xué)習(xí)微服務(wù)架構(gòu)了。”
老王先從網(wǎng)上搜索“微服務(wù)架構(gòu)”關(guān)鍵字,出來這么一段話:
微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶提供最終價值。每個服務(wù)運行在其獨立的進程中,服務(wù)于服務(wù)間采用輕量級的通信機制互相溝通(通常是基于 HTTP 的 RESTful API)。每個服務(wù)都圍繞著具體業(yè)務(wù)進行構(gòu)建,并且能夠被獨立地部署到生產(chǎn)環(huán)境、類生產(chǎn)環(huán)境等。另外,應(yīng)盡量避免統(tǒng)一的、集中式的服務(wù)管理機制,對具體的一個服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文,選擇合適的語言、工具對其進行構(gòu)建。
成小胖看完了這段話,說:“看著有點暈,云里霧里的感覺……”
老王嘿嘿一笑:“莫慌,現(xiàn)在就給你詳細講講微服務(wù)架構(gòu)的特性?!?div style="height:15px;">
1. 單一職責(zé)
微服務(wù)架構(gòu)中的每個服務(wù),都是具有業(yè)務(wù)邏輯的,符合高內(nèi)聚、低耦合原則以及單一職責(zé)原則的單元,不同的服務(wù)通過“管道”的方式靈活組合,從而構(gòu)建出龐大的系統(tǒng)。
2. 輕量級通信
服務(wù)之間通過輕量級的通信機制實現(xiàn)互通互聯(lián),而所謂的輕量級,通常指語言無關(guān)、平臺無關(guān)的交互方式。
對于輕量級通信的格式而言,我們熟悉的 XML 和 JSON,它們是語言無關(guān)、平臺無關(guān)的;對于通信的協(xié)議而言,通?;?HTTP,能讓服務(wù)間的通信變得標(biāo)準(zhǔn)化、無狀態(tài)化。目前大家熟悉的 REST(Representational State Transfer)是實現(xiàn)服務(wù)間互相協(xié)作的輕量級通信機制之一。使用輕量級通信機制,可以讓團隊選擇更適合的語言、工具或者平臺來開發(fā)服務(wù)本身。
3. 獨立性
每個服務(wù)在應(yīng)用交付過程中,獨立地開發(fā)、測試和部署。
在單塊架構(gòu)中所有功能都在同一個代碼庫,功能的開發(fā)不具有獨立性;當(dāng)不同小組完成多個功能后,需要經(jīng)過集成和回歸測試,測試過程也不具有獨立性;當(dāng)測試完成后,應(yīng)用被構(gòu)建成一個包,如果某個功能存在 bug,將導(dǎo)致整個部署失敗或者回滾。
在微服務(wù)架構(gòu)中,每個服務(wù)都是獨立的業(yè)務(wù)單元,與其他服務(wù)高度解耦,只需要改變當(dāng)前服務(wù)本身,就可以完成獨立的開發(fā)、測試和部署。
4. 進程隔離
單塊架構(gòu)中,整個系統(tǒng)運行在同一個進程中,當(dāng)應(yīng)用進行部署時,必須停掉當(dāng)前正在運行的應(yīng)用,部署完成后再重啟進程,無法做到獨立部署。
有時候我們會將重復(fù)的代碼抽取出來封裝成組件,在單塊架構(gòu)中,組件通常的形態(tài)叫做共享庫(如 jar 包或者 DLL),但是當(dāng)程序運行時,所有組件最終也會被加載到同一進程中運行。
在微服務(wù)架構(gòu)中,應(yīng)用程序由多個服務(wù)組成,每個服務(wù)都是高度自治的獨立業(yè)務(wù)實體,可以運行在獨立的進程中,不同的服務(wù)能非常容易地部署到不同的主機上。
理論上所有服務(wù)可以部署在同一個服務(wù)器節(jié)點,但是并不推薦這么做,因為微服務(wù)架構(gòu)的主旨就是高度自治和高度隔離。
“王哥你真厲害,您這么一說我的思維清晰了很多!”成小胖激動的幾乎要叫起來。
“我之前了解過 SOA,好像跟微服務(wù)架構(gòu)的思想很像啊,您能幫我區(qū)分一下嗎?”成小胖追問到。
老王嘿嘿一笑,拿起成小胖手上的A4紙,翻到另外一面畫了個表格:
SOA實現(xiàn)微服務(wù)架構(gòu)實現(xiàn)
企業(yè)級,自頂向下開展實施團隊級,自底向上開展實施
服務(wù)由多個子系統(tǒng)組成,粒度大一個系統(tǒng)被拆分成多個服務(wù),粒度細
企業(yè)服務(wù)總線,集中式的服務(wù)架構(gòu)無集中式總線,松散的服務(wù)架構(gòu)
集成方式復(fù)雜(ESB/WS/SOAP)集成方式簡單(HTTP/REST/JSON)
單塊架構(gòu)系統(tǒng),相互依賴,部署復(fù)雜服務(wù)能獨立部署
接著老王又畫了一張圖:
成小胖看了之后說:“您這么一畫我倒是大概明白了,但是圖里面的 DevOps 這個概念我不懂誒……”
“這個 DevOps 就說來話長了,有時間你自己先去查查資料了解下吧。”
“好的?,F(xiàn)在我對微服務(wù)架構(gòu)的概念有了了解,您能再深入剖析下它的本質(zhì)嗎?”
“好,你可仔細聽好了哈!”
1. 服務(wù)作為組件
微服務(wù)也可以被認為是一種組件,但是跟傳統(tǒng)組件的區(qū)別在于它可以獨立部署,因此它的一個顯著的優(yōu)勢。另外一個優(yōu)點是,它在組件與組件之間定義了清晰的、語言無關(guān)、平臺無關(guān)的規(guī)范接口,耦合度低,靈活性非常高。但它的不足之處是,分布式調(diào)用嚴重依賴于網(wǎng)絡(luò)的可靠性和穩(wěn)定性。
2. 圍繞業(yè)務(wù)組織團隊
在單塊架構(gòu)中,企業(yè)一般會根據(jù)技能劃分團隊,在這種組織架構(gòu)下,即便是簡單的需求變更都有可能需要跨團隊協(xié)作,溝通成本很高。而在微服務(wù)架構(gòu)中,它提倡以業(yè)務(wù)為核心,按照業(yè)務(wù)能力來組織團隊,團隊中的成員具有多樣性的技能。
3. 關(guān)注產(chǎn)品而非項目
在單塊架構(gòu)中,應(yīng)用基本上是基于“項目模式”構(gòu)建的,即項目啟動時從不同技能資源池中抽取相關(guān)資源組成團隊,項目結(jié)束后釋放所有資源。這種情況下團隊成員缺乏主人翁意識和產(chǎn)品成就感。
在微服務(wù)架構(gòu)中,提倡采用“產(chǎn)品模式”構(gòu)建,即更傾向于讓團隊負責(zé)整個服務(wù)的生命周期,以便提供更優(yōu)質(zhì)的服務(wù)。
4. 技術(shù)多樣性
微服務(wù)架構(gòu)中,提倡針對不同的業(yè)務(wù)特征選擇合適的技術(shù)方案,有針對性的解決具體業(yè)務(wù)問題,而不是像單塊架構(gòu)中采用統(tǒng)一的平臺或技術(shù)來解決所有問題。
5. 業(yè)務(wù)數(shù)據(jù)獨立
微服務(wù)架構(gòu)提供自主管理其相關(guān)的業(yè)務(wù)數(shù)據(jù),這樣可以隨著業(yè)務(wù)的發(fā)展提供數(shù)據(jù)接口集成,而不是以數(shù)據(jù)庫的方式同其他服務(wù)集成。另外,隨著業(yè)務(wù)的發(fā)展,可以方便地選擇更合的工具管理或者遷移業(yè)務(wù)數(shù)據(jù)。
6. 基礎(chǔ)設(shè)施自動化
在微服務(wù)架構(gòu)的實踐過程中,對持續(xù)交付和部署流水線的要求很高,將促進企業(yè)不斷尋找更高效的方式完成基礎(chǔ)設(shè)施的自動化及 DevOps 運維能力的提升。
聽完成小胖忍不住表達了敬佩之意:“老司機就是老司機,噢說錯了……架構(gòu)師就是架構(gòu)師,總結(jié)得這么簡潔又深刻!”
“咳咳,低調(diào)低調(diào)……”
“聽您講解了這么多,我覺得微服務(wù)架構(gòu)解決了很多當(dāng)前三層架構(gòu)的痛點。不過我覺得沒有任何一項技術(shù)或架構(gòu)是完美的?!?div style="height:15px;">
“非常正確。進行微服務(wù)架構(gòu)的落地是存在很多挑戰(zhàn)的?!?div style="height:15px;">1. 分布式系統(tǒng)的復(fù)雜性