其中根本緣由在於不知道業務或者微服務的邊界到底在哪裏致使,而DDD就很好的指導人們怎麼去解決這個問題
一種架構設計方法論,戰略設計(業務視角)和戰術設計(技術視角)兩部分數據庫
戰略設計從業務視角出發
,創建業務領域模型、劃分領域邊界、創建通用語言的限界上下文、限界上下文能夠做爲微服務設計的參考邊界戰術設計從技術角度出發
,側重於領域模型的技術實現,完成軟件開發和落地,包括:聚合根、實體、值對象、領域服務、應用服務和資源庫等代碼邏輯的設計和實現
優先創建領域模型架構
事件風暴是創建領域模型的主要方法,它是一個從發散到收斂的過程併發
不一樣的維度
進行聚類,造成聚合、限界上下文等邊界,創建領域模型三步劃定領域模型和微服務邊界運維
業務關聯性
,將業務緊密相關的實體進行組合造成聚合,同時肯定聚合中的聚合根、值對象和實體。聚合之間的邊界是第一層邊界,它們在同一個微服務實例中運行,這個邊界是邏輯邊界,因此用虛線表示
有兩層邊界、微服務的設計就不是難事了(吐槽:難的是要分出這兩層邊界先阿!)
戰略到戰術設計的實施過程當中(落地過程當中)異步
不一樣定位數據庫設計
共同目標分佈式
不一樣關注微服務
DDD不只能夠用於微服務設計,還能夠很好地應用於企業中臺的設計
DDD 戰術設計對設計和開發人員的要求相對較高,實現起來相對複雜。
不一樣企業的研發管理能力和我的開發水平可能會存在差別。
尤爲對於傳統企業而言,在戰術設計落地的過程當中,可能會存在必定挑戰和困難,我建議你和你的公司若是有這方面的想法,就必定要謹慎評估本身的能力,選擇最合適的方法落地 DDD。
概念名詞:(概念總結
)性能
名稱 | 簡要解釋 | |
---|---|---|
領域 | Domain | |
子域 | Sub Domain | |
核心域 | Core Domain | |
通用域 | Common Domain | |
支撐域 | Support Domain | |
通用語言 | Common Language | |
限界上下文 | Bounded Context | |
實體 | Entity | |
值對象 | ValueObject | |
聚合 | Aggregate | |
聚合根 | AggregateRoot |
參與角色:學習
名稱 |
---|
領域專家 |
產品經理 |
項目經理 |
架構師 |
開發經理 |
測試經理 |
領域:是用來肯定範圍,範圍即邊界(DDD設計中不斷強調邊界的緣由)。而在DDD中表明着這個邊界內要解決的業務問題域
業務領域細分 -> 問題範圍限定在特定的邊界內 -> 邊界內創建領域模型 -> 代碼實現領域模型 ->解決相應業務問題
基本思路:
劃分思路類比天然科學研究過程
:
決定產品和公司核心競爭力的子域
,業務成功的主要因素和公司的核心競爭力 通用語言定義上下文含義,限界上下文則定義領域邊界,以確保每一個上下文含義在他特定的邊界內都具備惟一的含義,領域模型則存在於這個邊界以內
概念闡述
不一樣類型不一樣含義
1. 經過事件風暴過程:領域專家、設計、開發人員一塊兒創建領域模型,在領域建模的過程當中會造成通用的業務術語和用戶故事。(事件風暴也是一個項目團隊統一語言的過程) 2. 經過用戶故事分析會造成一個個的領域對象,這些領域對象對應領域模型的業務對象,每一個業務對象和領域對象都有通用的名詞術語,而且一個個映射 3. 微服務代碼模型來源於領域模型,每一個代碼模型的代碼對象跟領域對象一一對應
小方法:設計過程當中能夠用一些表格來記錄事件風暴和微服務設計過程當中產生的領域對象及其屬性
要點
概念闡述
DDD在戰略設計上提出了限界上下文
這個概念,用來肯定語義所在的領域邊界
領域邊界就是經過限界上下文來定義的,而這個邊界定義了模型的適用範圍,使團隊全部成員可以明確地知道什麼應該在模型中實現,什麼不該該在模型中實現
限界上下文和微服務的關係
將限界上下文內的領域模型映射到微服務,就完成了從問題域到軟件的解決方案
疑惑倉儲究竟是什麼實現?
形態表現
充血模型
,與這個實體相關的全部業務邏輯都在實體類的方法中實現,跨多個實體的領域邏輯則在領域服務中實現數據庫形態:領域模型映射到數據模型時,一個實體可能對應0~n個數據庫持久化對象(一般爲1)
值對象:經過對象屬性值來識別的對象,它將多個相關屬性組合成一個概念總體,描述領域的特定方向,並一個沒有標識符的對象
形態表現
業務形態:基礎對象,來源於實踐風暴所構建的領域模型。
本質上,實體是看獲得、摸得着的實實在在的業務對象,實體具備業務屬性、業務行爲和業務邏輯。而值對象只是若干個屬性的集合,只有數據初始化操做和有限的不涉及修改數據的行爲,基本不包含業務邏輯。值對象的屬性集雖然在物理上獨立出來了,但在邏輯上它仍然是實體屬性的一部分,用於描述實體的特徵。
數據庫形態:值對象的屬性值和實體對象的屬性值保存在同一個數據庫實體表中
DDD 引入值對象是但願實現從「數據建模爲中心」向「領域建模爲中心」轉變,減小數據庫表的數量和表與表之間複雜的依賴關係,儘量地簡化數據庫設計,提高數據庫性能。
在領域建模時,咱們能夠將部分對象設計爲值對象,保留對象的業務涵義,同時又減小了實體的數量;在數據建模時,咱們能夠將值對象嵌入實體,減小實體表的數量,簡化數據庫設計。
值對象的優點和侷限:雙刃劍的存在
實體與值對象的關係:
領域模型內的實體和值對象就比如個體,而能讓實體和值對象協同工做的組織就是聚合,它用來確保這些領域對象在實現共同的業務邏輯時,能保證數據的一致性
聚合的組成
業務單一職責
和高內聚原則
,定義聚合內部應該包含哪些實體和值對象,而聚合之間的邊界是鬆耦合。(高內聚、低耦合)聚合運用
充血模型
實現個體業務能力,以及業務邏輯的高內聚若是把聚合比做組織,那聚合根就是這個組織的負責人。聚合根也稱爲根實體,它不只是實體,仍是聚合的管理者
DDD 領域建模一般採用事件風暴,它一般採用用例分析、場景分析和用戶旅程分析等方法,經過頭腦風暴列出全部可能的業務行爲和事件,而後找出產生這些行爲的領域對象,並梳理領域對象之間的關係,找出聚合根,找出與聚合根業務緊密關聯的實體和值對象,再將聚合根、實體和值對象組合,構建聚合。
從衆多的實體中選擇適合做爲對象管理者的根實體(聚合根)。
判斷一個實體是不是聚合根
DDD 的一些通用的設計原則,仍是那句話:「適合本身的纔是最好的。」在系統設計過程時,你必定要考慮項目的具體狀況,若是面臨使用的便利性、高性能要求、技術能力缺失和全局事務管理等影響因素,這些原則也並非不能突破的,總之一切以解決實際問題爲出發點。
以上內容爲在學習「極客時間-歐創新老師-DDD實戰課」過程當中記錄下來的筆記,有興趣的同窗能夠買教程細細研究保證有收穫!