DDD概念篇

從18年團(tuán)隊(duì)開始轉(zhuǎn)型微服務(wù)架構(gòu),會(huì)想起來,總結(jié)2個(gè)字,就是“生拆”。只要是能夠獨(dú)立的業(yè)務(wù)模塊或是可復(fù)用的組件,都拆成一個(gè)個(gè)微服務(wù)。這樣,原本的單體項(xiàng)目,拆成了23個(gè)微服務(wù),而我們當(dāng)初維護(hù)的團(tuán)隊(duì),僅僅才5~6個(gè)人。
18年底,docker-compose管理3~4個(gè)服務(wù)。
19年中,kubernates管理20+個(gè)業(yè)務(wù)服務(wù),不包括基礎(chǔ)服務(wù)在內(nèi)。
回想起來,一次失敗的嘗試,換來的是坑與、敬畏和不屈。后來極客上了DDD,很早就聽了一遍,有觸動(dòng),但是感覺還是不強(qiáng)烈,從今天開始重學(xué)DDD,拿一個(gè)業(yè)務(wù)模型進(jìn)行拆解設(shè)計(jì),也算是立個(gè)flag。

DDD的概念主要包括:領(lǐng)域、子域、核心域、通用域、支撐域、限界上下文、實(shí)體、值對(duì)象、聚合和聚合根。


image

領(lǐng)域和子域

領(lǐng)域就是指范圍,它是用來限定業(yè)務(wù)邊境的,領(lǐng)域越大,業(yè)務(wù)范圍就越大。領(lǐng)域可以進(jìn)一步進(jìn)行拆分,拆分后的就是“子域”。

子域?qū)?yīng)的一個(gè)更小的問題域或更新的業(yè)務(wù)范圍。

核心域、通用域和支撐域

在領(lǐng)域的劃分過程中,領(lǐng)域會(huì)細(xì)分為不同的子域,子域根據(jù)其重要性和自身的功能特點(diǎn),劃分為3類子域,就是核心域、通用域和支撐域。這3個(gè)概念的主要目標(biāo)就是區(qū)分子域在業(yè)務(wù)中不同的功能屬性和重要程度。

公司的核心競(jìng)爭(zhēng)力是核心域,同時(shí)被多個(gè)子域使用的通用功能子域是通用域,即不是核心域也不是通用域,但是是必須的,就是支撐域。通用域一般沒有太多的個(gè)性化,比如:認(rèn)證、權(quán)限等。支撐域則有企業(yè)特性,但是不具有通用性,例如數(shù)據(jù)字典等。

限界上下文

理論上,限界上下文就可以定義成微服務(wù)。限界上下文是微服務(wù)拆分的主要依據(jù)

實(shí)體

實(shí)體的4種形態(tài)分別是:業(yè)務(wù)形態(tài)、代碼形態(tài)、運(yùn)行形態(tài)和數(shù)據(jù)庫形態(tài)。

  • 業(yè)務(wù)形態(tài),實(shí)體是多個(gè)屬性、操作或行為的載體;
  • 代碼形態(tài),實(shí)體的表現(xiàn)形式是實(shí)體類,這個(gè)類包含了實(shí)體的屬性和方法,通過這些方法實(shí)現(xiàn)實(shí)體自身的業(yè)務(wù)邏輯,特別注意在DDD中,實(shí)體類通常采用的是充血模型
  • 運(yùn)行形態(tài),實(shí)體以領(lǐng)域?qū)ο蟮男问酱嬖?,每個(gè)對(duì)象都有唯一的ID,我們可以對(duì)一個(gè)實(shí)體對(duì)象進(jìn)行多次修改,修改后的數(shù)據(jù)和原來的數(shù)據(jù)可能會(huì)大不相同。但是,由于它們擁有相同的 ID,它們依然是同一個(gè)實(shí)體。
  • 數(shù)據(jù)庫形態(tài),與傳統(tǒng)數(shù)據(jù)模型設(shè)計(jì)優(yōu)先不同,DDD 是先構(gòu)建領(lǐng)域模型,針對(duì)實(shí)際業(yè)務(wù)場(chǎng)景構(gòu)建實(shí)體對(duì)象和行為,再將實(shí)體對(duì)象映射到數(shù)據(jù)持久化對(duì)象。

值對(duì)象

值對(duì)象,通俗的講,就是一個(gè)子對(duì)象和一組屬性集合。它沒有唯一的標(biāo)識(shí),依賴一個(gè)實(shí)體存在。比如用戶的學(xué)歷信息、地址信息都是值對(duì)象。

  • 代碼形態(tài),在代碼中有2種形態(tài)。如果值對(duì)象是單一屬性,就直接定義成實(shí)體類的屬性;如果是屬性集合,就把它設(shè)計(jì)成類,被實(shí)體引用。如下圖


    image
  • 運(yùn)行形態(tài),如上圖所示就寫了。
  • 數(shù)據(jù)庫形態(tài),在數(shù)據(jù)中,值對(duì)象可以是單獨(dú)的數(shù)據(jù)表,也可以采用大字段的方式嵌入到實(shí)體表中。至于數(shù)據(jù)庫是何種設(shè)計(jì)方式,我認(rèn)為是和業(yè)務(wù)博弈的一種結(jié)果,設(shè)計(jì)成大字段,減少了維護(hù)成本和結(jié)構(gòu)復(fù)雜度,但是不利于做一些特有的業(yè)務(wù)操作,比如單個(gè)屬性查詢。

聚合和聚合根

聚合和聚合根感覺抽象一些,等具體落地驗(yàn)證后再補(bǔ)充。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容