DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)-DDD開(kāi)源框架xtoon-boot

開(kāi)源地址:https://gitee.com/xtoon/xtoon-boot

官網(wǎng):http://xtoon-boot.xiangtoon.com

在線演示:http://xtoon-boot.demo.xiangtoon.com

如果有什么問(wèn)題或建議可以加群(QQ:130950009),交流技術(shù),分享經(jīng)驗(yàn)。

微服務(wù)版xtoon-cloud(推薦):https://gitee.com/xtoon/xtoon-cloud

為何開(kāi)源

項(xiàng)目初期或MVP階段建議用DDD的單體框架開(kāi)發(fā)應(yīng)用,后期根據(jù)領(lǐng)域的不同彈性需求是再改造成微服務(wù)版。
個(gè)人不建議開(kāi)始就上微服務(wù),服務(wù)拆分的很細(xì),這只會(huì)增加開(kāi)發(fā)成本和風(fēng)險(xiǎn),個(gè)人認(rèn)為應(yīng)該選擇合理的框架和方案,確保后期能快速的、低成本的從單體過(guò)度為微服務(wù)。
這正是我們開(kāi)源基于DDD的xtoon框架的初衷,目前單體應(yīng)用版和微服務(wù)版都已發(fā)布正式版,希望給踐行DDD和微服務(wù)的開(kāi)發(fā)者們帶來(lái)一些價(jià)值,謝謝!

為何選擇xtoon-boot

  • 解決編寫(xiě)過(guò)程式和事務(wù)代碼,造成后期維護(hù)邏輯混亂、維護(hù)成本高的痛點(diǎn);
  • 拋棄MVC框架,擁抱更適合復(fù)雜業(yè)務(wù)的開(kāi)發(fā)框架;
  • 網(wǎng)上基本講的都是DDD的理論很少有講怎么落地,xtoon-boot提供了完整落地方案和實(shí)踐;
  • 可以快速開(kāi)發(fā),框架提供了系統(tǒng)管理和組織架構(gòu)等核心模塊;
  • 支持多租戶的SaaS平臺(tái);

為何開(kāi)源

工作中一直有個(gè)困惱:為什么身邊很多項(xiàng)目后期維護(hù)時(shí)業(yè)務(wù)邏輯變的混亂不堪,service層代碼變的龐大難以修改,維護(hù)成本也越來(lái)越高,有沒(méi)有好的解決方式的?
后來(lái)接觸到Eric Evans的DDD(Domain-Driven Design 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)),發(fā)現(xiàn)這正是為了解決復(fù)雜業(yè)務(wù)而提出的思想。 但后來(lái)并沒(méi)找到一套基于DDD應(yīng)用的開(kāi)源框架,因此決定自己從0開(kāi)始投入研發(fā)。
現(xiàn)在1.0版本終于上線了,我們把這套框架開(kāi)源出來(lái)想跟大家探討并一起維護(hù),希望今后有更多的項(xiàng)目和產(chǎn)品能使用這套框架。

技術(shù)選型

  • Springboot
  • Apache Shiro
  • Mybatis-plus
  • Alibaba Druid
  • Element-ui

主要模塊

  1. 登錄注冊(cè):賬號(hào)、手機(jī)號(hào)驗(yàn)證登錄,租戶注冊(cè);
  2. 用戶管理:用戶新增,分配角色,禁用等;
  3. 角色管理:角色新增,查看,維護(hù)菜單等;
  4. 菜單管理:樹(shù)形菜單管理,可配置菜單和按鈕權(quán)限等;
  5. 租戶管理:租戶列表,禁用等;
  6. 操作日志:系統(tǒng)操作日志記錄和查詢;

項(xiàng)目結(jié)構(gòu)

xtoon-boot
├─db                            數(shù)據(jù)庫(kù)SQL腳本
│ 
├─xtoon-common                  公共模塊
│    │ 
│    └─java 
│         ├─domain              領(lǐng)域通用類
│         └─util                工具類
│   
├─xtoon-api                     接口模塊
│    │ 
│    ├─java        
│    │    ├─common              接口通用類
│    │    ├─util                接口工具類
│    │    └─web                 controller類
│    └─resources 
│        ├─static.swagger       swagger文件
│        ├─application.yml      全局配置文件
│        └─logback-spring.xml   日志配置文件
│ 
├─xtoon-sys                     系統(tǒng)子域模塊
│    │ 
│    └─java 
│         ├─application         應(yīng)用層
│         │    └─impl           應(yīng)用接口實(shí)現(xiàn)
│         ├─domain              領(lǐng)域?qū)樱ê诵模?│         │    ├─factory        工廠
│         │    ├─model          領(lǐng)域模型
│         │    ├─repository     資源接口
│         │    ├─service        領(lǐng)域服務(wù)
│         │    ├─specification  規(guī)格校驗(yàn)
│         │    └─external       外部接口(防腐層)
│         ├─infrastructure      基礎(chǔ)設(shè)施層
│         │    ├─repository     mybatis持久化類(應(yīng)該都熟悉就不展開(kāi)了)
│         │    └─external       外部服務(wù)類
│         └─facede              門面類層
│              ├─assembler      DTO轉(zhuǎn)換類
│              ├─dto            DTO
│              └─impl           門面類
│   
├─xtoon-org                     組織架構(gòu)子域模塊
│            

核心理念

六邊形理論

image

Alistair Cockburn提出了六邊形架構(gòu),又被稱為端口和適配器架構(gòu)。觀察上圖我們發(fā)現(xiàn),對(duì)于核心的應(yīng)用程序和領(lǐng)域模型來(lái)說(shuō),其他的底層依賴或?qū)崿F(xiàn)都可以抽象為輸入和輸出兩類。組織關(guān)系變?yōu)榱艘粋€(gè)二維的內(nèi)外關(guān)系,而不是上下結(jié)構(gòu)。每個(gè)io與應(yīng)用程序之前均有適配器完成隔離工作,每個(gè)最外圍的邊都是一個(gè)端口。基于六邊形架構(gòu)設(shè)計(jì)的系統(tǒng)是DDD追求的最終形態(tài)。

數(shù)據(jù)驅(qū)動(dòng)和領(lǐng)域驅(qū)動(dòng)對(duì)比

image

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)與之前的系統(tǒng)設(shè)計(jì)開(kāi)發(fā)過(guò)程有很大的不同:

  1. 就在于系統(tǒng)的參與角色,產(chǎn)品、開(kāi)發(fā)、測(cè)試等,需要形成一套通用語(yǔ)言;
  2. 在于方案設(shè)計(jì)不再把db設(shè)計(jì)放在一個(gè)核心問(wèn)題去解決,更加專注于業(yè)務(wù)模型本身,進(jìn)行領(lǐng)域、業(yè)務(wù)聚合的設(shè)計(jì),領(lǐng)域?qū)拥木酆霞皩?shí)體才是整個(gè)系統(tǒng)的核心內(nèi)容;
  3. 真正的面向?qū)ο缶幊?,由過(guò)程式的事務(wù)腳本方式,轉(zhuǎn)變?yōu)檎嬲拿嫦驅(qū)ο蟆?/li>

分層架構(gòu)

image
  • 用戶界面層(或表示層)
    負(fù)責(zé)向用戶顯示信息和解釋用戶指令。這里指的用戶可以是另一個(gè)計(jì)算機(jī)系統(tǒng), 不一定是使用用戶界面的人
  • 應(yīng)用層
    定義軟件要完成的任務(wù),并且指揮表達(dá)領(lǐng)域概念的對(duì)象來(lái)解決問(wèn)題。這一層所負(fù) 責(zé)的工作對(duì)業(yè)務(wù)來(lái)說(shuō)意義重大,也是與其他系統(tǒng)的應(yīng)用層進(jìn)行交互的必要渠道
    應(yīng)用層要盡量簡(jiǎn)單,不包含業(yè)務(wù)規(guī)則或者知識(shí),而只為下一層中的領(lǐng)域?qū)ο髤f(xié)調(diào) 任務(wù),分配工作,使它們互相協(xié)作。它沒(méi)有反映業(yè)務(wù)情況的狀態(tài),但是卻可以具有 另外一種狀態(tài),為用戶或程序顯示某個(gè)任務(wù)的進(jìn)度
  • 領(lǐng)域?qū)?或模型層)
    負(fù)責(zé)表達(dá)業(yè)務(wù)概念,業(yè)務(wù)狀態(tài)信息以及業(yè)務(wù)規(guī)則。盡管保存業(yè)務(wù)狀態(tài)的技術(shù)細(xì)節(jié) 是由基礎(chǔ)設(shè)施層實(shí)現(xiàn)的,但是反映業(yè)務(wù)情況的狀態(tài)是由本層控制并且使用的。領(lǐng)域 層是業(yè)務(wù)軟件的核心
  • 基礎(chǔ)設(shè)施層
    為上面各層提供通用的技術(shù)能力:為應(yīng)用層傳遞消息,為領(lǐng)域?qū)犹峁┏志没瘷C(jī)制, 為用戶界面層繪制屏幕組件,等等。基礎(chǔ)設(shè)施層還能夠通過(guò)架構(gòu)框架來(lái)支持4個(gè)層次 間的交互模式
最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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