Microservices(微服務(wù)架構(gòu))和DDD(領(lǐng)域驅(qū)動設(shè)計)是時下最炙手可熱的兩個技術(shù)詞匯酌呆。在最近兩年的咨詢工作中總是會被不同的團隊和角色詢問沪饺,由此也促使我思考為什么這兩個技術(shù)詞匯被這么深入人心的綁定诵盼,它們之間的關(guān)系是什么呢世曾?
服務(wù)于更高的業(yè)務(wù)響應(yīng)力
從兩個詞匯的發(fā)明來看枷莉,它們是沒有因果關(guān)系的椎扬。
DDD是Eric Evans于2003年出版的書名颅停,同時也是這個架構(gòu)設(shè)計方法名的起源沐兵。DDD的想法是讓我們的軟件實現(xiàn)和一個演進的架構(gòu)模型保持一致,而這個演進的模型來自于我們的業(yè)務(wù)需求便监。這種演進式設(shè)計方法在當(dāng)時看來還是比較有挑戰(zhàn)的扎谎,更為流行的解決架構(gòu)設(shè)計復(fù)雜度的方法是分層:比如數(shù)據(jù)架構(gòu)、服務(wù)架構(gòu)烧董、中間件架構(gòu)等毁靶。MVC在互聯(lián)網(wǎng)應(yīng)用開發(fā)領(lǐng)域也基本成為了標(biāo)配。
時間很快過了10年逊移,Martin Fowler和ThoughtWorks英國架構(gòu)師James Lewis坐下來一起分析了好幾個能夠持續(xù)演進的大型復(fù)雜系統(tǒng)预吆,總結(jié)出了9大核心特質(zhì),然后用Microservices來定義了擁有這些特質(zhì)的架構(gòu)胳泉。之后由于Google拐叉、Netflix、Amazon等一系列明星企業(yè)都對號入座扇商,Microservices開始風(fēng)靡整個軟件業(yè)凤瘦。這時候很多人會問微服務(wù)架構(gòu)是怎么設(shè)計出來的,業(yè)界人士會說DDD是一個好方法案铺,其中也包括微服務(wù)定義者Martin Fowler蔬芥,畢竟DDD原書的序是他給著的;)于是乎DDD開始在被定義10年后火了控汉。
從我個人角度來看笔诵,如果真的需要找到因果關(guān)系,最根本的驅(qū)動力來自于科技時代對軟件系統(tǒng)(數(shù)字化)響應(yīng)力要求的不斷提升姑子,而系統(tǒng)的復(fù)雜度卻隨著業(yè)務(wù)的多元化而與日俱增乎婿。如何駕馭這樣的高復(fù)雜度成了每個企業(yè)必須面對的挑戰(zhàn),以至于業(yè)界開始把這種模型總結(jié)為響應(yīng)力企業(yè)街佑,而模型中總結(jié)的大部分原則都是為了更好的適應(yīng)環(huán)境不確定性帶來的高復(fù)雜度谢翎。
從業(yè)務(wù)視角分離復(fù)雜度
每個人能夠認(rèn)知的復(fù)雜度都是有限的,在面對高復(fù)雜度的時候我們會做關(guān)注點分離舆乔,這是一個最基本的哲學(xué)原則岳服。顯然,在針對復(fù)雜業(yè)務(wù)場景進行建模時希俩,我們也會應(yīng)用此原則吊宋。這個時候去分離關(guān)注點一般可以從兩個維度出發(fā):
- 技術(shù)維度分離,類似MVC這樣的分層思想是我們廣泛接受的。
- 業(yè)務(wù)維度分離璃搜,根據(jù)不同的業(yè)態(tài)來劃分系統(tǒng)拖吼,比如按售前、銷售这吻、售后劃分吊档。
以上兩個維度沒有孰優(yōu)孰劣之分,在處理復(fù)雜問題的時候一定都會用上唾糯,但為了高效響應(yīng)業(yè)務(wù)的變化怠硼,微服務(wù)的架構(gòu)更強調(diào)從業(yè)務(wù)維度的關(guān)注點分離來應(yīng)對高復(fù)雜度。這是顯著區(qū)別于傳統(tǒng)SOA架構(gòu)的特質(zhì)之一移怯,比如誕生于傳統(tǒng)SOA時代的ESB(工業(yè)服務(wù)總線)就是一個典型的從技術(shù)關(guān)注點分離出來的中間件香璃。
隨著業(yè)務(wù)的變化,我們也看到ESB成為了一個架構(gòu)上的反模式舟误,即大量的業(yè)務(wù)規(guī)則和流程被封裝在了ESB里葡秒,讓ESB成為了不可駕馭的復(fù)雜度之源,以至于破壞了SOA架構(gòu)之前承諾的各種優(yōu)勢嵌溢。當(dāng)然Microservices架構(gòu)并非是新一代SOA架構(gòu)這么簡單眯牧,已經(jīng)有不少文章在討論這個話題,本文就不再展開了赖草。
所以從本質(zhì)上作為一種架構(gòu)設(shè)計方法的DDD和作為一種架構(gòu)風(fēng)格的Microservices都是為著追求高響應(yīng)力目標(biāo)而從業(yè)務(wù)視角去分離復(fù)雜度的手段学少。
如果這個時代你還覺得自己的架構(gòu)不需要這種響應(yīng)力,建議你問問身邊維護3年以上系統(tǒng)的朋友或同事們疚顷,他們會告訴你這是怎樣的一種痛苦旱易。實際上很多企業(yè)對這種響應(yīng)力的追求已經(jīng)很“瘋狂”了,這可能也是微服務(wù)的兩位定義者都始料未及的腿堤。
他們在定義文章中帶著很強警告語氣讓大家慎用,但在這個科技時代如暖,微服務(wù)架構(gòu)實施的可能風(fēng)險對比高響應(yīng)力在未來可能帶來的市場機會幾乎可以忽略不計笆檀。一個Netflix的成功就足以讓大部分企業(yè)毫不猶豫的選擇微服務(wù)作為自身的架構(gòu)風(fēng)格。
業(yè)務(wù)和技術(shù)漸進統(tǒng)一的架構(gòu)設(shè)計
如果Microservices和DDD在目標(biāo)上達成了上文的統(tǒng)一盒至,那么在具體做法上和以前有什么不同呢酗洒?
為了解釋清楚這個問題讓我們將架構(gòu)設(shè)計簡化為以下三個層面工作:
- 業(yè)務(wù)架構(gòu):根據(jù)業(yè)務(wù)需求設(shè)計業(yè)務(wù)模塊及交互關(guān)系。
- 系統(tǒng)架構(gòu):根據(jù)業(yè)務(wù)需求設(shè)計系統(tǒng)和子系統(tǒng)的模塊枷遂。
- 技術(shù)架構(gòu):根據(jù)業(yè)務(wù)需求決定采用的技術(shù)及框架樱衷。
顯然這三者在具體一個架構(gòu)設(shè)計活動中應(yīng)該是有先后順序的,但并非一定是孰先孰后酒唉,比如一個簡單的web應(yīng)用矩桂,很多人會說MVC是標(biāo)配了(首先確定了系統(tǒng)架構(gòu)),或者有人說用RoR快(首先確定了技術(shù)架構(gòu))痪伦。在給定的業(yè)務(wù)場景里侄榴,也許這樣的順序是合理的雹锣。
(架構(gòu)設(shè)計工作分層及傳統(tǒng)意義上的負(fù)責(zé)人)
這個時候咱們增加復(fù)雜業(yè)務(wù)需求和快速市場變化這兩個環(huán)境變量,這個順序就變得很有意思了癞蚕。于是我們聽到不少走出初創(chuàng)期的互聯(lián)網(wǎng)服務(wù)平臺開始“重寫”他們的系統(tǒng)(從PHP到Java)蕊爵,很多文章開始反思MVC帶來的僵化(臃腫的展現(xiàn)層)。經(jīng)歷了這樣變遷的架構(gòu)師們都會感同身受的出來為DDD站臺桦山,其原因就是“跳過”(或“后補”)業(yè)務(wù)架構(gòu)顯然表明設(shè)計出來的架構(gòu)關(guān)注點并不在業(yè)務(wù)的響應(yīng)力上攒射,因為業(yè)務(wù)的可能變化點并沒有被分析出來指導(dǎo)系統(tǒng)和技術(shù)架構(gòu)的設(shè)計。
**DDD的核心訴求就是讓業(yè)務(wù)架構(gòu)和系統(tǒng)架構(gòu)形成綁定關(guān)系恒水,這樣一來當(dāng)我們?nèi)ロ憫?yīng)業(yè)務(wù)變化調(diào)整業(yè)務(wù)架構(gòu)時会放,系統(tǒng)架構(gòu)的改變也會隨之發(fā)生。
**
這個變化的結(jié)果有兩個:
- 業(yè)務(wù)架構(gòu)的梳理和系統(tǒng)架構(gòu)的梳理是同步漸進的寇窑,其結(jié)果是劃分出的業(yè)務(wù)上下文和系統(tǒng)模塊結(jié)構(gòu)是綁定的鸦概。
- 技術(shù)架構(gòu)是解耦的,可以根據(jù)劃分出來的業(yè)務(wù)上下文的系統(tǒng)架構(gòu)選擇最合適的實現(xiàn)技術(shù)甩骏。
第一點顯然也是我們產(chǎn)生微服務(wù)劃分所必須遵循的窗市,因為微服務(wù)追求的是業(yè)務(wù)層面的復(fù)用,所以設(shè)計出來的系統(tǒng)必須是跟業(yè)務(wù)一致的饮笛。第二點更是微服務(wù)架構(gòu)的特質(zhì):“去中心化”的治理技術(shù)和數(shù)據(jù)管理咨察。
作為架構(gòu)設(shè)計的方法,DDD的各種實踐福青,包括最近流行的Event Storming(事件風(fēng)暴)實際上都是促進業(yè)務(wù)和系統(tǒng)架構(gòu)梳理的漸進式認(rèn)知摄狱。
在一次DDD工作坊中,一位同事給出了“你們連業(yè)務(wù)故事都講不清楚无午,還有必要繼續(xù)做架構(gòu)設(shè)計嗎媒役?”這樣的經(jīng)典評論。而DDD的整個方法也沒有涉及具體的技術(shù)架構(gòu)實現(xiàn)宪迟,這個選型的權(quán)利很多時候被“下放”給了真正的開發(fā)團隊酣衷。
值得一提的是采用DDD這種架構(gòu)設(shè)計方法并不一定就產(chǎn)生Mircoservices這種架構(gòu)風(fēng)格,往往會推薦用大顆粒度的服務(wù)來包含業(yè)務(wù)分析過程中發(fā)現(xiàn)的不確定點次泽,以避免拆分后變化過度頻繁帶來的雙向修改成本穿仪。
跨職能協(xié)作的架構(gòu)設(shè)計
業(yè)務(wù)和系統(tǒng)的漸進認(rèn)知改變了很多之前的架構(gòu)工作模式,在采用DDD的過程中意荤,很容易感受到業(yè)務(wù)專家的重要性啊片。而如果還有人寄希望讓業(yè)務(wù)能夠一次性給架構(gòu)師講清楚需求,那我建議抱有這樣希望的同學(xué)去親身參加一次自己不熟悉業(yè)務(wù)領(lǐng)域的架構(gòu)設(shè)計討論玖像。你會很容易得出結(jié)論“原來業(yè)務(wù)也不懂他要什么”紫谷。當(dāng)然業(yè)務(wù)人員聽說要參加某種(軟件)架構(gòu)設(shè)計方法時心里也一定是抵觸的。
DDD成功運用的基礎(chǔ)就是創(chuàng)造讓業(yè)務(wù)和系統(tǒng)這兩種不同認(rèn)知模型逐步統(tǒng)一的環(huán)境。
(業(yè)務(wù)架構(gòu)和系統(tǒng)架構(gòu)設(shè)計)
所以“不幸”的是如果你不能建立一個跨業(yè)務(wù)和技術(shù)的新型架構(gòu)設(shè)計小組碴里,你的DDD實踐就沒有成功的基礎(chǔ)沈矿,繼而采用微服務(wù)架構(gòu)可能就會是一場災(zāi)難。幸運的是這種跨職能組織結(jié)構(gòu)已經(jīng)是前文中“采用”微服務(wù)架構(gòu)企業(yè)(如Amazon)的標(biāo)配咬腋,你不必再論證這件事情的可實施性羹膳。剩下的關(guān)鍵就是如何能夠讓不同背景的人們協(xié)作起來。這也是大家可以看到DDD領(lǐng)域的下一個熱點根竿,類似Event Storming這樣的模式化協(xié)作工作坊會更多的出現(xiàn)在大家的視線里陵像。
永無終止的DDD和演進的Microservices
DDD是容易上癮的,當(dāng)大家發(fā)現(xiàn)原來通過這個建模過程業(yè)務(wù)專家更了解服務(wù)劃分(系統(tǒng)模塊)寇壳,架構(gòu)設(shè)計更懂業(yè)務(wù)需求醒颖,這種協(xié)作會成為常態(tài)。在這個tech@core的時代壳炎,這樣的融合將成為企業(yè)的核心競爭力泞歉。
當(dāng)然剛開始采用DDD方法的時候,請不要認(rèn)為每個系統(tǒng)搞一次所謂的DDD工作坊就能夠找到最佳的服務(wù)劃分了匿辩。業(yè)務(wù)的變化是持續(xù)的腰耙,而每次業(yè)務(wù)架構(gòu)變化必然牽動系統(tǒng)架構(gòu)的變化。良好的領(lǐng)域架構(gòu)綁定了業(yè)務(wù)和系統(tǒng)铲球,讓雙方人員能夠用統(tǒng)一語言交流挺庞,這件事情建立不易,而持續(xù)運作更難稼病。
成功的DDD方法運用是貫穿系統(tǒng)的整個生命周期的选侨,這個過程中業(yè)務(wù)和技術(shù)的協(xié)作是持續(xù)發(fā)生的。
Microservices的最后一個特質(zhì):“演進式”設(shè)計 - 也明確了設(shè)計是一種持續(xù)的活動然走。DDD提供了一種符合這個微服務(wù)特質(zhì)的工作方法援制,讓演進能夠落地。值得一提的是就筆者最近的經(jīng)驗芍瑞,這個演進過程中最難認(rèn)知到變化的就是DDD里最顯而易見的“統(tǒng)一語言”隘谣。當(dāng)大家形成了一個業(yè)務(wù)概念-“客戶”后,少有團隊能夠持續(xù)審視這個“客戶”是否隨著市場的變化而發(fā)生了含義的變遷啄巧。
對比傳統(tǒng)的SOA,微服務(wù)的拆分也是動態(tài)的掌栅,禚嫻靜在自己的文章中描述一個系統(tǒng)采用微服務(wù)架構(gòu)歷程中服務(wù)拆分的演變秩仆。這里不會有一個ESB來以不變應(yīng)萬變,這種幻想在過去的10年里已經(jīng)被數(shù)次打臉猾封。DDD的好處是讓業(yè)務(wù)和技術(shù)人員都能夠在合作中理解這種變化澄耍,而不至于陷入業(yè)務(wù)人員抱怨技術(shù)架構(gòu)不知所謂,技術(shù)人員覺得業(yè)務(wù)人員朝三暮四的尷尬。
你需要成為那個高個子齐莲!
Martin Fowler在Microservies的定義文章中畫了下面的圖痢站,評論“你必須有那個高度”來隱喻微服務(wù)實施的能力要求。就架構(gòu)建模方面來說我認(rèn)為DDD應(yīng)該是一個團隊必須去掌握的选酗,包括這個團隊的業(yè)務(wù)人員和產(chǎn)品設(shè)計人員阵难。
(微服務(wù)前置條件示意)
很有意思的是目前Service Design也是全球用戶體驗設(shè)計領(lǐng)域的一個熱門話題,從用戶視角出發(fā)去設(shè)計整個服務(wù)鏈條芒填。比如時下熱門的共享單車呜叫,一個成功的服務(wù)設(shè)計應(yīng)該是從用戶開始有用車需求觸發(fā)到最后完成騎行繳費離開,而不僅僅是去設(shè)計一輛能夠互聯(lián)網(wǎng)解鎖的自行車殿衰。
我們可以找到很多Service Deisgn和DDD在原則上的相似之處朱庆,比如用戶中心和協(xié)同設(shè)計。借用上面的高個子說法:
在業(yè)務(wù)需求認(rèn)知和跨職能協(xié)作方面你一定需要成為高個子闷祥!