1 為什么人們將DDD與Microservices兩個(gè)技術(shù)詞語(yǔ)綁定在一起凯傲?
DDD是一種架構(gòu)設(shè)計(jì)設(shè)計(jì)方法杭抠,其想法是讓軟件的實(shí)現(xiàn)與一個(gè)演進(jìn)的架構(gòu)模型保持一致羊始,而這個(gè)演進(jìn)的模型來(lái)自于業(yè)務(wù)需求谱俭。
Martin Flower和James Lewis總結(jié)的能夠持續(xù)演進(jìn)的大型復(fù)雜系統(tǒng)所具備的9大核心特質(zhì)就是Microservices架構(gòu)所擁有的特質(zhì)帮匾。
可見(jiàn)一個(gè)是架構(gòu)設(shè)計(jì)方法啄骇,一個(gè)是架構(gòu),都從業(yè)務(wù)需求出發(fā)瘟斜,試圖讓軟件實(shí)現(xiàn)隨著業(yè)務(wù)多元變化而與時(shí)俱進(jìn)缸夹。它們存在因果聯(lián)系,所以人們經(jīng)常把二者聯(lián)系在一起哼转。
2 從業(yè)務(wù)視角分離復(fù)雜度
面對(duì)高復(fù)雜度時(shí)明未,人們會(huì)做關(guān)注點(diǎn)分離。一般可從業(yè)務(wù)維度或技術(shù)維度進(jìn)行關(guān)注點(diǎn)分離壹蔓。比如技術(shù)維度分離——MVC分層思想,業(yè)務(wù)維度分離——按售前猫态、銷(xiāo)售佣蓉、售后劃分披摄。
Microservices架構(gòu)更強(qiáng)調(diào)從業(yè)務(wù)維度的關(guān)注點(diǎn)分離來(lái)應(yīng)對(duì)高復(fù)雜度。傳統(tǒng)SOA的ESB是一個(gè)典型的從技術(shù)關(guān)注點(diǎn)分離的中間件勇凭。它封裝了大量的業(yè)務(wù)規(guī)則和流程疚膊,成為了復(fù)雜度之源,以至于破壞了SOA架構(gòu)之前承諾的各種優(yōu)勢(shì)虾标。ESB是一種架構(gòu)上的反模式寓盗。
本質(zhì)上作為一種架構(gòu)設(shè)計(jì)方法的DDD和作為一種架構(gòu)風(fēng)格的Microservices都是為了追求高響應(yīng)力目標(biāo)而從業(yè)務(wù)視角去分離復(fù)雜度的手段。
3 業(yè)務(wù)和技術(shù)漸進(jìn)統(tǒng)一的架構(gòu)設(shè)計(jì)
架構(gòu)設(shè)計(jì)簡(jiǎn)化為三個(gè)層面的工作以及它們傳統(tǒng)意義上的負(fù)責(zé)人
- 業(yè)務(wù)架構(gòu)(業(yè)務(wù)人員):根據(jù)業(yè)務(wù)需求設(shè)計(jì)業(yè)務(wù)模塊及交互關(guān)系璧函。
- 系統(tǒng)架構(gòu)(架構(gòu)師/TL):根據(jù)業(yè)務(wù)需求設(shè)計(jì)系統(tǒng)和子系統(tǒng)的模塊傀蚌。
- 技術(shù)架構(gòu)(開(kāi)發(fā)人員):根據(jù)業(yè)務(wù)需求決定采用的技術(shù)及框架。
DDD的核心訴求就是讓業(yè)務(wù)架構(gòu)和系統(tǒng)架構(gòu)形成綁定關(guān)系蘸吓,這樣一來(lái)當(dāng)我們?nèi)ロ憫?yīng)業(yè)務(wù)變化調(diào)整業(yè)務(wù)架構(gòu)時(shí)善炫,系統(tǒng)架構(gòu)的改變也會(huì)隨之發(fā)生。
這個(gè)變化的結(jié)構(gòu)有兩個(gè):
業(yè)務(wù)架構(gòu)的梳理與系統(tǒng)架構(gòu)的梳理是同步漸進(jìn)的库继,其結(jié)果是劃分出的業(yè)務(wù)上下文和系統(tǒng)模塊結(jié)構(gòu)是綁定的箩艺。
技術(shù)架構(gòu)是解耦的,可以根據(jù)劃分出來(lái)的業(yè)務(wù)上下文的系統(tǒng)架構(gòu)選擇最合適的實(shí)現(xiàn)技術(shù)宪萄。
4 跨職能協(xié)作的架構(gòu)設(shè)計(jì)
DDD成功運(yùn)用的基礎(chǔ)就是創(chuàng)造讓業(yè)務(wù)和系統(tǒng)這兩種不同認(rèn)知模型逐步統(tǒng)一的環(huán)境艺谆。
Event Stroming模式化協(xié)作工作坊是一種讓不同背景人協(xié)作起來(lái)進(jìn)行架構(gòu)設(shè)計(jì)的方式。
5 永無(wú)終止的DDD和演進(jìn)的Microservices
成功的DDD方法運(yùn)用時(shí)貫穿系統(tǒng)的整個(gè)生命周期的拜英,這個(gè)過(guò)程中業(yè)務(wù)和技術(shù)的協(xié)作是持續(xù)發(fā)生的擂涛。
[備注]Microservices的9大特質(zhì)
- 組件以服務(wù)形式來(lái)提供:正如其名,微服務(wù)也是面向服務(wù)的聊记。
- 圍繞業(yè)務(wù)功能進(jìn)行組織:微服務(wù)更傾向于圍繞業(yè)務(wù)功能對(duì)服務(wù)結(jié)構(gòu)進(jìn)行劃分撒妈、拆解。這樣的服務(wù)排监,是針對(duì)業(yè)務(wù)領(lǐng)域有著關(guān)完整實(shí)現(xiàn)的軟件狰右,它包含使用接口、持久存儲(chǔ)舆床、以及對(duì)旬的交互棋蚌。因此團(tuán)隊(duì)?wèi)?yīng)該是跨職能的,包含完整的開(kāi)發(fā)技術(shù):用戶體驗(yàn)挨队、數(shù)據(jù)庫(kù)谷暮、以及項(xiàng)目管理。
- 產(chǎn)品不是項(xiàng)目:傳統(tǒng)的開(kāi)發(fā)模式盛垦,是至力于提供一些被認(rèn)為是完整的軟件湿弦。一旦開(kāi)發(fā)完成,軟件將移交給維護(hù)或者實(shí)施部門(mén)腾夯,然后颊埃,開(kāi)發(fā)組就可以解散掉了蔬充。而微服務(wù)要求開(kāi)發(fā)團(tuán)隊(duì)對(duì)軟件產(chǎn)品的整個(gè)生命周期負(fù)責(zé)。這要求開(kāi)發(fā)者每天都關(guān)注軟件產(chǎn)品的運(yùn)行情況班利,并與用戶聯(lián)系的更緊密饥漫,同時(shí)承擔(dān)一些售后支持。越小的服務(wù)粒度越容易促進(jìn)用戶與服務(wù)提供商之前的關(guān)系罗标。Amazon 的理念就是“You build, you run it”庸队,這也正是 DevOps 的文化理念。
- 強(qiáng)化終端及弱化通道:微服務(wù)的應(yīng)用致力松耦合和高內(nèi)聚闯割,它們更喜歡簡(jiǎn)單的REST 風(fēng)格彻消,而不是復(fù)雜的協(xié)議(如WS或者BPEL或者集中式框架)∨耍或者采用輕量級(jí)消息總線(如 RabbitMQ 或 ZeroMQ 等)來(lái)發(fā)布消息证膨。
- 分散治理:這是跟傳統(tǒng)的集中式管理很大區(qū)別的地方。微服務(wù)把整體式框架中的組件鼓黔,拆分成不同的服務(wù)央勒,在構(gòu)建它們時(shí)將會(huì)有更多的選擇。
- 分散數(shù)據(jù)管理:當(dāng)整體式的應(yīng)用使用單一邏輯數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)持久化時(shí)澳化,企業(yè)通常選擇在應(yīng)用的范圍內(nèi)使用一個(gè)數(shù)據(jù)庫(kù)崔步。微服務(wù)讓每個(gè)服務(wù)管理自己的數(shù)據(jù)庫(kù):無(wú)論是相同數(shù)據(jù)庫(kù)的不同實(shí)例,或者是不同的數(shù)據(jù)庫(kù)系統(tǒng)缎谷。
- 基礎(chǔ)設(shè)施自動(dòng)化:云計(jì)算井濒,特別是 AWS 的發(fā)展,減少了構(gòu)建列林、發(fā)布瑞你、運(yùn)維微服務(wù)的復(fù)雜性。微服務(wù)的團(tuán)隊(duì)更加依賴于基礎(chǔ)設(shè)施的自動(dòng)化希痴,畢竟發(fā)布工作相當(dāng)?shù)臒o(wú)趣者甲。近些年開(kāi)始火爆的 Docker 也是一個(gè)不錯(cuò)的選擇(可以參閱《簡(jiǎn)述 Docker》)。
- 容錯(cuò)性設(shè)計(jì):任務(wù)服務(wù)都可能因?yàn)楣?yīng)商的不可靠而故障砌创。微服務(wù)應(yīng)為每個(gè)應(yīng)用的服務(wù)及數(shù)據(jù)中心提供日常故障檢測(cè)和恢復(fù)虏缸。
- 改進(jìn)設(shè)計(jì):由于設(shè)計(jì)會(huì)不斷更改,微服務(wù)所提供的服務(wù)應(yīng)該能夠替換或者報(bào)廢嫩实,而不是要長(zhǎng)久的發(fā)展的刽辙。