DDD為什么能火起來?和微服務(wù)有啥關(guān)系?
點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)
作者:等不到的口琴
鏈接:www.cnblogs.com/Courage129/p/14839544.html
DDD為什么能火起來?
我們先不討論DDD的定義, 先梳理一下DDD火起來的背景, 根據(jù)我學(xué)習(xí)的套路, 永遠(yuǎn)是為什么為先,再是解決什么問題,是什么東西, 最后如何使用。
我們先看一下三種技術(shù)架構(gòu)的演進(jìn)以及主要區(qū)別:

第一階段是單機(jī)架構(gòu),特征是整個(gè)開發(fā)圍繞著數(shù)據(jù)庫進(jìn)行設(shè)計(jì)和開發(fā)。
微服務(wù)存在的問題
進(jìn)入微服務(wù)之后 , 解決了集中式架構(gòu)的單體應(yīng)用很多問題, 但是新的問題應(yīng)運(yùn)而生 , 微服務(wù)的粒度應(yīng)該多大 ?微服務(wù)如何設(shè)計(jì)呢?微服務(wù)如何拆分 ?微服務(wù)邊界在哪里 ?
很長時(shí)間人們都沒有解決這一問題,就連Martin Fowler在提出微服務(wù)架構(gòu)的時(shí)候也沒有告訴我們這該如何拆分微服務(wù)。
甚至在很長的時(shí)間里人們對微服務(wù)拆分產(chǎn)生了一些誤解, 有人認(rèn)為:"微服務(wù)很簡單,就是將之前的單體應(yīng)用拆分成多個(gè)部署包, 或者將原來的單體應(yīng)用架構(gòu)替換為一套支持微服務(wù)的技術(shù)架構(gòu),就算是微服務(wù)了。" 還有人認(rèn)為微服務(wù)應(yīng)該拆分得越小越好。
鑒于上述情形, 很多項(xiàng)目因?yàn)榍捌诓鸱诌^度, 導(dǎo)致復(fù)雜度過高, 導(dǎo)致后期難以運(yùn)維甚至難以上線。另外,微服務(wù)系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺發(fā)送:面試,可以在線閱讀。
可以得出一個(gè)結(jié)論:微服務(wù)拆分困境產(chǎn)生的根本原因就是不知道業(yè)務(wù)或者微服務(wù)的邊界到底在什么地方。換句話說,確定了業(yè)務(wù)邊界和應(yīng)用邊界,這個(gè)困境也就迎刃而解了。
而DDD就是解決了這個(gè)確定業(yè)務(wù)邊界的問題,可見DDD并不是一種技術(shù)架構(gòu),而是一種劃分業(yè)務(wù)領(lǐng)域范圍的方法論。DDD的興起是由于很多熟悉領(lǐng)域驅(qū)動建模(DDD)的工程師在進(jìn)行微服務(wù)設(shè)計(jì)時(shí), 發(fā)現(xiàn)用DDD的思路進(jìn)行業(yè)務(wù)梳理可以很好規(guī)劃服務(wù)邊界, 可以很好實(shí)現(xiàn)微服務(wù)內(nèi)部和外部的"高內(nèi)聚、低耦合"。于是越來越多的人將DDD作為業(yè)務(wù)劃分的指導(dǎo)思想。
那么,什么是DDD呢?
DDD概述
通過上文的學(xué)習(xí)就可以知道DDD是一種拆解業(yè)務(wù)、劃分業(yè)務(wù)、確定業(yè)務(wù)邊界的方法, 是一種高度復(fù)雜的領(lǐng)域設(shè)計(jì)思想,將我們的問題拆分成一個(gè)個(gè)的域, 試圖分離技術(shù)實(shí)現(xiàn)的復(fù)雜性,主要解決的是軟件難以理解難以演進(jìn)的問題,DDD不是一種架構(gòu), 而是一種架構(gòu)方法論, 目的就是將復(fù)雜問題領(lǐng)域簡單化, 幫助我們設(shè)計(jì)出清晰的領(lǐng)域和邊界, 可以很好的實(shí)現(xiàn)技術(shù)架構(gòu)的演進(jìn)。DDD包括兩部分,戰(zhàn)略設(shè)計(jì)部分和戰(zhàn)術(shù)設(shè)計(jì)部分
戰(zhàn)略設(shè)計(jì)主要從業(yè)務(wù)視角出發(fā),建立業(yè)務(wù)領(lǐng)域模型,劃分領(lǐng)域邊界,建立通用語言的限界上下文,限界上下文可以作為微服務(wù)設(shè)計(jì)的參考邊界。
戰(zhàn)術(shù)設(shè)計(jì)則從技術(shù)視角出發(fā),側(cè)重于領(lǐng)域模型的技術(shù)實(shí)現(xiàn),完成軟件開發(fā)和落地,包括:聚合根、實(shí)體、值對象、領(lǐng)域服務(wù)、應(yīng)用服務(wù)和資源庫等代碼邏輯的設(shè)計(jì)和實(shí)現(xiàn)。最新面試題整理好了,點(diǎn)擊Java面試庫小程序在線刷題。
DDD戰(zhàn)略設(shè)計(jì)會建立領(lǐng)域模型, 這四個(gè)字放一起會讓人覺得很高深, 其實(shí)是紙老虎, 通俗來說就是模擬某個(gè)領(lǐng)域的的一種模型, 這個(gè)模型比較抽象, 但便于人們交流, 舉個(gè)例子:公園有一棵桃樹, 如果我們想好好研究桃樹該怎么研究 ?
桃子好吃嗎?貴不貴?品種?怎么種植?種在什么地方 ?做成桃木劍?桃子樹葉藥用價(jià)值?
你看, 這樣研究每一個(gè)問題都很有道理, 但是又很混亂,再回憶一下初中生物書上是這么研究的?
先將植物根據(jù)大家的理解分成多個(gè)器官組成, 像桃子、桃葉、桃花等等, 然后將每一個(gè)器官再根據(jù)功能細(xì)分成組織, 再根據(jù)這個(gè)組織中各個(gè)細(xì)胞的形態(tài)等作用分成不同的細(xì)胞, 你看看這是不是一種很有條理的分析方法。

DDD也是如此, 當(dāng)我們面對桃樹這種復(fù)雜的業(yè)務(wù)的時(shí)候,先根據(jù)固有的認(rèn)識分成多個(gè)器官(領(lǐng)域),然后再在每一個(gè)領(lǐng)域中根據(jù)某些維度(這兒是功能)分為多個(gè)組織(聚合), 而每一個(gè)組織中由很多細(xì)胞(實(shí)體)組成,這就是一種戰(zhàn)略, 有哪些好處呢 ?
可以確保我們討論的邊界, 也就是討論的東西是一個(gè)領(lǐng)域一個(gè)維度的, 對于桃樹來說, 桃子 、桃花、桃葉、樹干都是不同的領(lǐng)域, 劃分不同領(lǐng)域的就是邊界, 我們這兒叫領(lǐng)域邊界, 當(dāng)我們確定好這些領(lǐng)域之后, 就可以確保我們討論的是同一個(gè)領(lǐng)域部分的東西,這樣的好處就是我們可以規(guī)定好一些概念, 或者說術(shù)語, 以后大家討論的時(shí)候就盡可能少的信息丟失。
DDD戰(zhàn)略設(shè)計(jì)會建立領(lǐng)域模型 , 領(lǐng)域模型用來指導(dǎo)微服務(wù)的設(shè)計(jì)和拆分, DDD第一步要做的就是來一個(gè)頭腦風(fēng)暴, 可以理解成一起討論對業(yè)務(wù)的理解 , 主要目的就是盡可能前面不遺漏的分解我們的業(yè)務(wù)領(lǐng)域, 就好比剛剛的桃樹, 最先要做的就是盡可能多的分析, 確保每一個(gè)領(lǐng)域都可以被關(guān)注到。
點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)
在實(shí)踐中 ,往往會采用用例分析、場景分析和用戶旅程分析, 這是一個(gè)發(fā)散的過程,頭腦風(fēng)暴階段會產(chǎn)生很多實(shí)體、命令、事件等領(lǐng)域?qū)ο螅?我們從不同的維度對進(jìn)行聚類形成聚合、限界上下文等邊界,建立領(lǐng)域模型, 這是一個(gè)收斂的過程。
具體來說, 我們可以通過三步來確定領(lǐng)域模型和微服務(wù)邊界。推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice
總結(jié)
這篇文章主要研討了DDD火起來的原因, 解決了什么業(yè)界難題, 知道DDD主要思路 , 以及DDD大概的實(shí)現(xiàn)步驟等 。
留個(gè)小問題:單體應(yīng)用適合DDD嗎?







關(guān)注Java技術(shù)??锤喔韶?/strong>


