前言
從13年接觸DDD之后開始做應用架構已經整整四個年頭.
四年里關於DDD的感觸良多,慢慢有了一些心得.
關於DDD的介紹已經有很多的文章和書籍,這里我推薦三本最重要的書籍.
《領域驅動設計-軟件核心復雜性應對之道》(DDD)
《實現領域驅動設計》(IDDD)
《領域驅動設計模式,原理與實踐》(PPPDDD)
具體的DDD介紹這三本書已經很清楚了,但是學完這些之后我認為DDD才剛剛開始.
DDD給我更多的是一種設計啟發,無論是里面的戰術設計,還是戰略設計都可以展開到很多點.
書籍里面很多時候只是一些設計原則,和一些簡單的demo,但是基於這些原則作為出發點,可以展開很多的設計.
架構有時候就是一個生長的,當我基於DDD為起點,不斷演進架構.這時候架構仿佛也有了生命力,不斷地成長,到最后可能是最開始完全想想不到的樣子,我想這大概就是架構的魅力.但是無論如何,DDD都是一個起點.
下面是我總結的基於DDD發散的一些知識體系
下面會有簡單的描述
倉儲
DDD中倉儲將持久化這個技術復雜性保持在領域模型之外.
具體來說有以下在具體實踐中有以下幾點:
1.隔離領域模型和數據模型:衍生出來就是隔離內存里面的模型和持久化模型.這個點會在EAV的設計中體現的淋漓盡致.
2.技術復雜度的封裝:倉儲負責如何組織模型存儲.
靜態分庫:按照領域上下文(或者模塊)分庫,所謂縱向分庫,在程序啟動的時候就決定了某個實體該放到那個數據庫,所以稱之為靜態.
動態分庫:當某個庫的數據量很大時候,這時候要對表數據做切割,所謂橫向分庫.在程序運行時候,針對某個實體的某條數據才能決定放到那個庫,所以稱之為動態.
3.規則橫切. 將一些面向切面編程的邏輯放到倉儲中.具體來說倉儲主要控制的就是CRUD
軟刪除:那么只要在刪除和查詢的時候稍作處理即可實現軟刪除.
數據權限:只要在操作的時候判斷,查詢時候拼接條件即可實現數據的篩選.
應用程序服務
應用程序在我設計的時候我傾向於把契約和實現放到不同的項目中,基於這個偏好.慢慢演化出了如下思路
- Abp中有個方式直接把應用程序服務暴露出可以http訪問的api
- 客戶端用動態代理的方式+ioc即可實現訪問契約,但是實際通過http請求調用
- 實現幾個host方式,例如 IIS,Owin的Windows Service
- 基於Host動態加載程序集
從1-4是一個遞進的過程,並非一簇而就或者一次性想到,而是不斷重構優化產生的結果.
基於以上四步就已經接近一個應用程序容器.
PS: 這里其實還是剛剛起步 ,后續還有很多工作要做 ,目前還在實踐演化中.
PS:應用程序容器是從單體架構到微服務的一個重要的重構手段.
領域上下文
在DDD中涉及到領域上下文這部分,是在宏觀戰略層面的部分,偏重於業務架構層面.
在微觀中,涉及到的時候對某個類,或者某幾個類的抽象和設計.
在宏觀中,有時候需要把部分通用的功能進行抽離,即DDD中的支撐域.
另外上下文之間的通信也是這里要解決的問題.
- 微服務:這部分網上很多資料不細說
- 微應用:如果一個應用既有界面又有服務,我稱之為微應用.
- 上下文通信:這部分涉及內部消息總線,外部消息隊列,另外結合之前應用服務容器中的動態代理部分的通信方式.
- 戰略設計: 其實就是部分支撐域的設計.雖然DDD中說更加看重核心域,但是在實際工作中發現,其實讓團隊成員集中精力
對業務進行設計,抽離一部分公有業務會減輕程序員很大一部分負擔.
戰略設計
ACS
這部分重點有就是ACS(權限控制系統).其中按照不同層級分為
- 應用級別權限:控制應用和應用之間的訪問權限
- 用戶級別權限:控制用戶賬戶對系統的訪問權限
- 功能級別權限:控制用戶對某個功能的訪問權限
- 數據級別權限:控制用戶對某條數據的訪問權限
基於功能級別的權限又演化出來一個邏輯應用的概念,實際應用是隔閡的,邏輯應用將多個系統功能合並成一個新的應用.
統計系統
基於每個系統都會產生統計的需要,這里引用CQRS的思想,將部分復雜的統計作為查詢統一設計.
這個里面最核心的部分就是動態查詢的設計.具體點就是將SQL和數據結構關聯.作為SQL設計器的基礎.
組件服務
- 計划任務:有部分定時任務會用windows service的方式host.並用調用應用的接口來實現定時觸發.
- 通知中心:將站內,短信,郵箱,微信,移動端,推送做抽象.
- 附件:將附件的存儲和獲取與具體技術做隔離,並提供斷點續傳的功能.
聚合
其實這一部分發散開就是對業務邏輯的理解和設計.今年年初公司開始導入敏捷,感覺又打開一片新的天地.
DDD說領域驅動設計,很多時候只是提了一個原則,但是具體該如何來.慢慢接觸到如下切入點:
- BDD(行為驅動設計)
- 實例化需求
- 用戶故事
在宏觀的業務需求梳理和分析的時候接觸到《用戶故事地圖》.
基於敏捷接觸到持續集成,慢慢接觸到DevOps.
基於DevOps還設計了一個自動化測試工具.
敏捷和devops,是今年一年重點在學習的地方,也在不斷的實踐.
當然目前還是有很多問題急需解決.
總結
距離上一次發文已經很久了,有些知識經常不用就會忘記.
從這篇開始,會陸續有以上心得的分享,權當自我總結復習,歡迎大家討論拍磚.
因為很多是源於公司的經驗和業務,可能不會有全部的源碼,但是重點部分會有的.
我一直覺得現並不重要,重要的是設計.
但是現在很多人都是更加注重某行代碼怎么寫.
現在互聯網這么發達,這些具體技術點一般都很容易找到解決方案.
但是創新的設計思路卻是找不到的,這些我覺得才是一個程序員的靈魂.