虛擬一家類(lèi)似于XX打車(chē)的創(chuàng)業(yè)公司春寿,要開(kāi)展業(yè)務(wù),首先要開(kāi)發(fā)一套網(wǎng)上叫車(chē)的系統(tǒng)忽孽。使用DDD的思想進(jìn)行設(shè)計(jì)堂淡,并用SpringCloud框架進(jìn)行開(kāi)發(fā)。本節(jié)主要講如何通過(guò)業(yè)務(wù)領(lǐng)域驅(qū)動(dòng)微服務(wù)的設(shè)計(jì)
公司名稱(chēng):打車(chē)易公司
公司愿景:讓天下沒(méi)有難打的車(chē)
一扒腕、業(yè)務(wù)領(lǐng)域
1. 業(yè)務(wù)子域
通過(guò)與公司核心團(tuán)隊(duì)一番交談绢淀,我們了解到了主要需求是:客戶(hù)在網(wǎng)上叫車(chē),系統(tǒng)自動(dòng)分配離客戶(hù)最近的車(chē)瘾腰。公司的核心競(jìng)爭(zhēng)力是讓客戶(hù)以最快的速度叫到車(chē)皆的。
和公司業(yè)務(wù)人員調(diào)研后,我們把公司業(yè)務(wù)分成三個(gè)子域:(用戶(hù)/司機(jī))身份認(rèn)證子領(lǐng)域蹋盆、打車(chē)管理子域及報(bào)表子域费薄。
打車(chē)管理子域是核心子域硝全,我們以打車(chē)管理子域?yàn)槔崛【W(wǎng)上叫車(chē)的業(yè)務(wù)術(shù)語(yǔ)。
2. 業(yè)務(wù)術(shù)語(yǔ)表
業(yè)務(wù)規(guī)則:
打車(chē):經(jīng)認(rèn)證的用戶(hù)楞抡,打開(kāi)叫車(chē)應(yīng)用伟众,首先會(huì)定位,會(huì)在地圖上顯示附近的汽車(chē)召廷。用戶(hù)發(fā)起叫車(chē)后凳厢,系統(tǒng)會(huì)自動(dòng)通知離客戶(hù)最近的司機(jī)。用戶(hù)到達(dá)目的地后竞慢,系統(tǒng)自動(dòng)從用戶(hù)關(guān)聯(lián)的賬戶(hù)扣款先紫。
分配司機(jī):系統(tǒng)為用戶(hù)分配一個(gè)最近的司機(jī)
計(jì)費(fèi):系統(tǒng)根據(jù)用戶(hù)所乘車(chē)的當(dāng)前位置進(jìn)行計(jì)費(fèi)
扣款申請(qǐng):用戶(hù)到達(dá)目的地后,系統(tǒng)根據(jù)路程的長(zhǎng)遠(yuǎn)向用戶(hù)的銀行賬戶(hù)發(fā)送扣款申請(qǐng)
打車(chē)管理子域依賴(lài)于身份認(rèn)證子領(lǐng)域筹煮。只用經(jīng)過(guò)認(rèn)證的用戶(hù)和司機(jī)才可以使用打車(chē)管理App遮精,只有有足夠信用額度的用戶(hù)才可以打車(chē)存淫。運(yùn)營(yíng)報(bào)表依賴(lài)于打車(chē)管理子領(lǐng)域璧坟,運(yùn)營(yíng)報(bào)表目前僅需要從打車(chē)管理里提取用戶(hù)的消費(fèi)記錄,后面估計(jì)還會(huì)有其它需求邪媳。
角色和對(duì)象:
以打車(chē)管理限界上下文劫扒,分析參與者
在打車(chē)管理限界上下文里檬洞,有兩個(gè)明顯的角色:用戶(hù)和司機(jī)
用戶(hù):在打車(chē)App有有效的賬號(hào),有足夠的信用粟关,叫車(chē)時(shí)要有精確的位置
司機(jī):需要在打車(chē)App上注冊(cè)的,有有效的身份證明和駕駛證环戈,無(wú)不良記錄闷板。收到用戶(hù)的訂單后,將用戶(hù)從起始點(diǎn)安全地送到目的地院塞。
細(xì)致分析后遮晚,我們發(fā)現(xiàn)還有一個(gè)隱式的對(duì)象:訂單。從業(yè)務(wù)來(lái)看拦止,最終的目的還是為了多拿訂單县遣,從這個(gè)角度來(lái)看,訂單是比比用戶(hù)和司機(jī)都重要的業(yè)務(wù)對(duì)象汹族。
業(yè)務(wù)狀態(tài):
以打車(chē)管理限界上下文萧求,分析業(yè)務(wù)狀態(tài)
用戶(hù)已叫車(chē)、用戶(hù)已上車(chē)顶瞒、用戶(hù)已到達(dá)
二夸政、模型空間
1. 戰(zhàn)略建模:
身份認(rèn)證限界上下文、打車(chē)管理限界上下文榴徐、運(yùn)營(yíng)報(bào)表限界上下文
2. 戰(zhàn)術(shù)建模:
聚合:
訂單:是業(yè)務(wù)的真正關(guān)注點(diǎn)守问。訂單的根實(shí)體是訂單本身匀归、本次計(jì)費(fèi)總額,值對(duì)象為用戶(hù)的路途(起始位置耗帕、終止位置)穆端,關(guān)聯(lián)的實(shí)體包括用戶(hù)和司機(jī)。
用戶(hù):對(duì)于用戶(hù)仿便,在打車(chē)管理這個(gè)限界上下文里体啰,我們只關(guān)注用戶(hù)的ID、銀行賬戶(hù)探越。根實(shí)體是用戶(hù)狡赐,關(guān)聯(lián)實(shí)體是銀行賬戶(hù),包括賬號(hào)钦幔、銀行名稱(chēng)枕屉。用戶(hù)會(huì)發(fā)起叫車(chē)的事件。
司機(jī):在打車(chē)管理限界上下文里鲤氢,我們關(guān)注的是司機(jī)的id搀擂,車(chē)牌號(hào)及司機(jī)當(dāng)前位置。司機(jī)當(dāng)前位置為值對(duì)象卷玉。用戶(hù)上車(chē)后哨颂,司機(jī)會(huì)發(fā)出用戶(hù)已上車(chē)的信號(hào)。到達(dá)終點(diǎn)時(shí)相种,司機(jī)會(huì)發(fā)起已到達(dá)的事件
領(lǐng)域服務(wù):
用戶(hù)定位服務(wù):用戶(hù)打開(kāi)打車(chē)App時(shí)威恼,會(huì)自動(dòng)啟動(dòng)定位服務(wù),并顯示周?chē)乃緳C(jī)
分配司機(jī)服務(wù):收到用戶(hù)叫車(chē)的消息后寝并,為用戶(hù)分配一個(gè)最近的司機(jī)
計(jì)費(fèi)管理服務(wù):用戶(hù)上車(chē)后箫措,會(huì)實(shí)時(shí)搜集司機(jī)當(dāng)前位置,并實(shí)時(shí)計(jì)費(fèi)衬潦。當(dāng)收到已到達(dá)終點(diǎn)的信號(hào)時(shí)斤蔓,自動(dòng)向用戶(hù)管理賬號(hào)發(fā)起扣款申請(qǐng)。
領(lǐng)域事件:
用戶(hù)已叫車(chē)事件:由用戶(hù)發(fā)起
用戶(hù)已上車(chē)事件:由司機(jī)發(fā)起
用戶(hù)已到達(dá)事件:由司機(jī)發(fā)起
三镀岛、微服務(wù)設(shè)計(jì)
1. 打車(chē)管理微服務(wù)的設(shè)計(jì)
微服務(wù)里的微并不是越小越好弦牡。微服務(wù)和分布式架構(gòu)是相關(guān)聯(lián)的。分布式架構(gòu)第一原則是能不做分布式就不要分布式漂羊,對(duì)于微服務(wù)驾锰,是在能滿(mǎn)足業(yè)務(wù)需求的情況下,盡可能的不微走越。所以稻据,對(duì)于新的需求,微服務(wù)的粒度可以和限界上下文一對(duì)一映射。當(dāng)需求逐漸明晰了后捻悯,如果業(yè)務(wù)需要匆赃,微服務(wù)的最小粒度可以放到聚合的級(jí)別。
因?yàn)槭莿?chuàng)業(yè)公司今缚,對(duì)很對(duì)需求了解都還不夠細(xì)算柳,我們微服務(wù)粒度和限界上下文對(duì)應(yīng),現(xiàn)有的版本是V1.0
2. 聚合的設(shè)計(jì)
3. 領(lǐng)域服務(wù)的設(shè)計(jì)
4. 領(lǐng)域事件
5. 資源庫(kù)
定義訂單資源庫(kù)類(lèi)OrderRepository姓言。OrderReporsitory接口目前定義一種方法:findByUserID瞬项,返回和該ID相關(guān)聯(lián)的用戶(hù)的所有訂單
OrderRepository基于Repository接口。在Repository接口里定義三種方法:add何荚、remove囱淋、update。用來(lái)增加餐塘、刪除妥衣、更新訂單
四、總結(jié)
DDD并不是一個(gè)新的架構(gòu)方法戒傻,它在微服務(wù)概念提出之前就已經(jīng)出現(xiàn)了税手。微服務(wù)概念提出后,大家都認(rèn)為很好需纳,但是對(duì)于如何設(shè)計(jì)微服務(wù)當(dāng)時(shí)沒(méi)有給出一個(gè)很好的方法芦倒,后來(lái),大家套用了DDD的理念來(lái)設(shè)計(jì)微服務(wù)不翩,發(fā)現(xiàn)這種方法是可行的兵扬,DDD的很多理念也和微服務(wù)是一致的。
本文中的舉例口蝠,對(duì)業(yè)務(wù)的理解不一定到位器钟,我也相信會(huì)有更好的模型,領(lǐng)域事件的設(shè)計(jì)也偷懶了亚皂,請(qǐng)大家多多指教俱箱。
下一節(jié)国瓮,我們會(huì)基于目前的設(shè)計(jì)灭必,利用Spring Cloud框架開(kāi)發(fā)叫車(chē)管理微服務(wù)。