開(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
主要模塊
- 登錄注冊(cè):賬號(hào)、手機(jī)號(hào)驗(yàn)證登錄,租戶注冊(cè);
- 用戶管理:用戶新增,分配角色,禁用等;
- 角色管理:角色新增,查看,維護(hù)菜單等;
- 菜單管理:樹(shù)形菜單管理,可配置菜單和按鈕權(quán)限等;
- 租戶管理:租戶列表,禁用等;
- 操作日志:系統(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)子域模塊
│
核心理念
六邊形理論

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ì)比

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)與之前的系統(tǒng)設(shè)計(jì)開(kāi)發(fā)過(guò)程有很大的不同:
- 就在于系統(tǒng)的參與角色,產(chǎn)品、開(kāi)發(fā)、測(cè)試等,需要形成一套通用語(yǔ)言;
- 在于方案設(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)容;
- 真正的面向?qū)ο缶幊?,由過(guò)程式的事務(wù)腳本方式,轉(zhuǎn)變?yōu)檎嬲拿嫦驅(qū)ο蟆?/li>
分層架構(gòu)

- 用戶界面層(或表示層)
負(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è)層次 間的交互模式