本文參考了我的同事肖然妒蛇、王威和劉尚奇于2017年7月22日在ThoughtWorks北京辦公室所講授的“領(lǐng)域驅(qū)動(dòng)的微服務(wù)架構(gòu)設(shè)計(jì)——實(shí)戰(zhàn)工作坊”的課程內(nèi)容秧廉,同時(shí)參考了我的同事亢江妹在業(yè)務(wù)分析工作中所使用的“拆分API故事”的實(shí)踐方法桅咆,在此表示感謝。
目的
領(lǐng)域驅(qū)動(dòng)的微服務(wù)架構(gòu)設(shè)計(jì)工作坊,能使軟件開發(fā)團(tuán)隊(duì)所有成員在短時(shí)間內(nèi),迅速就新產(chǎn)品或遺留系統(tǒng)的價(jià)值励两、用戶畫像、關(guān)鍵場景囊颅、聚合達(dá)成一致当悔,以便讓團(tuán)隊(duì)快速識別軟件產(chǎn)品的問題域和解決方案域,發(fā)現(xiàn)微服務(wù)之間的API接口契約踢代,并據(jù)此拆分微服務(wù)(或模塊)和團(tuán)隊(duì)盲憎,來開發(fā)新產(chǎn)品或重構(gòu)遺留系統(tǒng)。對于不打算實(shí)踐微服務(wù)的團(tuán)隊(duì)拆分模塊也有參考意義胳挎。
步驟
準(zhǔn)備
1)召集所有相關(guān)領(lǐng)域?qū)<液烷_發(fā)團(tuán)隊(duì)成員(包括:業(yè)務(wù)分析焙畔、開發(fā)、測試串远、DBA等)參加工作坊,準(zhǔn)備大白紙儿惫、6種顏色(深黃-Domain Event澡罚、深藍(lán)-Command、深綠-aggregate肾请、深粉-external system留搔、紫-policy、淺黃-user)報(bào)事貼铛铁、藍(lán)丁膠和黑色三福記號筆隔显。
產(chǎn)品價(jià)值
2)一起創(chuàng)建用戶畫像(姓名、年齡饵逐、職業(yè)括眠、居住地、問題倍权、目標(biāo)掷豺;所見、所聽、所想和所感当船、痛點(diǎn)题画、目標(biāo))
3)用電梯演講一起識別產(chǎn)品的核心賣點(diǎn)(差異化競爭優(yōu)勢)
關(guān)鍵場景
4)繪制Use Case用例圖,識別其中核心賣點(diǎn)用例(粉色)德频、支撐用例(橙色)和通用用例(白色苍息,用例即用戶目標(biāo)),并按時(shí)間順序壹置;注意識別Ubiquitous Language(領(lǐng)域普通話)
命令風(fēng)暴
5)選擇第一個(gè)核心賣點(diǎn)用例竞思,按從左往右的順序用貼深藍(lán)報(bào)事貼的方式畫流程圖,圖中每一步都是值得“埋點(diǎn)”的命令(深藍(lán))
事件風(fēng)暴
6)在流程圖上貼值得記錄日志的業(yè)務(wù)事件(深黃蒸绩,有可能一個(gè)命令觸發(fā)多個(gè)事件衙四,每個(gè)事件單獨(dú)寫一個(gè)報(bào)事貼)
7)在相關(guān)事件處貼該事件所觸發(fā)的業(yè)務(wù)規(guī)則(紫)、該事件所源自的外部依賴系統(tǒng)(深粉)患亿,并在相關(guān)命令處貼該命令所源自的用戶(淺黃)
聚合
8)在每個(gè)事件和命令之間貼聚合根(深綠)传蹈,把具有相同生命周期(有助于維護(hù)業(yè)務(wù)一致性)和必須使用同步更新來實(shí)現(xiàn)數(shù)據(jù)完整性的聚合歸并為同一聚合根之下,并為該聚合根取名
9)選擇核心賣點(diǎn)的下一個(gè)關(guān)鍵場景步藕,重復(fù)第5)~第9)惦界,直到識別并歸并完所有的聚合
問題域和解決方案域
10)將各個(gè)聚合根據(jù)是否為業(yè)務(wù)核心賣點(diǎn)組織為子域,并識別核心子域咙冗、支撐子域和通用子域
11)將各個(gè)子域根據(jù)開發(fā)團(tuán)隊(duì)的約束條件組織為限界上下文(每個(gè)限界上下文可以作為一個(gè)微服務(wù)),并識別各個(gè)限界上下文之間的關(guān)系(partnership, shared kernel, customer-supplier, conformist, anti-corruption layer, open host service, published language)雾消,拍照
微服務(wù)之間的API接口契約
12)在關(guān)鍵場景流程圖下方灾搏,添加若干行,每一行貼一個(gè)深綠報(bào)事貼立润,代表一個(gè)相關(guān)的限界上下文
13)根據(jù)流程圖上的每一個(gè)事件狂窑,識別相應(yīng)限界上下文為實(shí)現(xiàn)該事件所應(yīng)對外提供的接口,拍照
各個(gè)微服務(wù)內(nèi)部的用戶故事和驗(yàn)收條件
14)根據(jù)限界上下文劃分團(tuán)隊(duì)(這樣劃分的每個(gè)團(tuán)隊(duì)就是一個(gè)微服務(wù)團(tuán)隊(duì))桑腮,讓各個(gè)微服務(wù)團(tuán)隊(duì)各自根據(jù)流程圖中所負(fù)責(zé)的事件泉哈,編寫用戶故事和驗(yàn)收條件
15)各個(gè)微服務(wù)團(tuán)隊(duì)識別其所負(fù)責(zé)的限界上下文內(nèi)部的名詞(Aggregate Root, Entity, Value Object, Domain Events)和動(dòng)詞(Services),并繪制實(shí)體關(guān)系圖破讨,進(jìn)行開發(fā)或重構(gòu)
參考資料:
Domain-Driven Design
《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》
領(lǐng)域驅(qū)動(dòng)的微服務(wù)架構(gòu)設(shè)計(jì)——實(shí)戰(zhàn)工作坊
Domain-Driven Design Distilled
Introducing EventStorming