從13年接觸DDD以後開始作應用架構已經整整四個年頭.
四年裏關於DDD的感觸良多,慢慢有了一些心得.
關於DDD的介紹已經有不少的文章和書籍,這裏我推薦三本最重要的書籍.程序員
《領域驅動設計-軟件核心複雜性應對之道》(DDD)數據庫
《實現領域驅動設計》(IDDD)編程
《領域驅動設計模式,原理與實踐》(PPPDDD)windows
具體的DDD介紹這三本書已經很清楚了,可是學完這些以後我認爲DDD纔剛剛開始.
DDD給我更多的是一種設計啓發,不管是裏面的戰術設計,仍是戰略設計均可以展開到不少點.
書籍裏面不少時候只是一些設計原則,和一些簡單的demo,可是基於這些原則做爲出發點,能夠展開不少的設計.設計模式
架構有時候就是一個生長的,當我基於DDD爲起點,不斷演進架構.這時候架構彷彿也有了生命力,不斷地成長,到最後多是最開始徹底想一想不到的樣子,我想這大概就是架構的魅力.可是不管如何,DDD都是一個起點.api
下面是我總結的基於DDD發散的一些知識體系微信
下面會有簡單的描述數據結構
DDD中倉儲將持久化這個技術複雜性保持在領域模型以外.架構
具體來講有如下在具體實踐中有如下幾點:
1.隔離領域模型和數據模型:衍生出來就是隔離內存裏面的模型和持久化模型.這個點會在EAV的設計中體現的淋漓盡致.
2.技術複雜度的封裝:倉儲負責如何組織模型存儲.微服務
靜態分庫:按照領域上下文(或者模塊)分庫,所謂縱向分庫,在程序啓動的時候就決定了某個實體該放到那個數據庫,因此稱之爲靜態.
動態分庫:當某個庫的數據量很大時候,這時候要對錶數據作切割,所謂橫向分庫.在程序運行時候,針對某個實體的某條數據才能決定放到那個庫,因此稱之爲動態.
3.規則橫切. 將一些面向切面編程的邏輯放到倉儲中.具體來講倉儲主要控制的就是CRUD
軟刪除:那麼只要在刪除和查詢的時候稍做處理便可實現軟刪除.
數據權限:只要在操做的時候判斷,查詢時候拼接條件便可實現數據的篩選.
應用程序在我設計的時候我傾向於把契約和實現放到不一樣的項目中,基於這個偏好.慢慢演化出了以下思路
從1-4是一個遞進的過程,並不是一簇而就或者一次性想到,而是不斷重構優化產生的結果.
基於以上四步就已經接近一個應用程序容器.
PS: 這裏其實仍是剛剛起步 ,後續還有不少工做要作 ,目前還在實踐演化中.
PS:應用程序容器是從單體架構到微服務的一個重要的重構手段.
在DDD中涉及到領域上下文這部分,是在宏觀戰略層面的部分,偏重於業務架構層面.
在微觀中,涉及到的時候對某個類,或者某幾個類的抽象和設計.
在宏觀中,有時候須要把部分通用的功能進行抽離,即DDD中的支撐域.
另外上下文之間的通訊也是這裏要解決的問題.
這部分重點有就是ACS(權限控制系統).其中按照不一樣層級分爲
基於功能級別的權限又演化出來一個邏輯應用的概念,實際應用是隔閡的,邏輯應用將多個系統功能合併成一個新的應用.
基於每一個系統都會產生統計的須要,這裏引用CQRS的思想,將部分複雜的統計做爲查詢統一設計.
這個裏面最核心的部分就是動態查詢的設計.具體點就是將SQL和數據結構關聯.做爲SQL設計器的基礎.
其實這一部分發散開就是對業務邏輯的理解和設計.今年年初公司開始導入敏捷,感受又打開一片新的天地.
DDD說領域驅動設計,不少時候只是提了一個原則,可是具體該如何來.慢慢接觸到以下切入點:
在宏觀的業務需求梳理和分析的時候接觸到《用戶故事地圖》.
基於敏捷接觸到持續集成,慢慢接觸到DevOps.
基於DevOps還設計了一個自動化測試工具.
敏捷和devops,是今年一年重點在學習的地方,也在不斷的實踐.
固然目前仍是有不少問題急需解決.
距離上一次發文已經好久了,有些知識常常不用就會忘記.
從這篇開始,會陸續有以上心得的分享,權當自我總結複習,歡迎你們討論拍磚.
由於不少是源於公司的經驗和業務,可能不會有所有的源碼,可是重點部分會有的.
我一直以爲現並不重要,重要的是設計.
可是如今不少人都是更加註重某行代碼怎麼寫.
如今互聯網這麼發達,這些具體技術點通常都很容易找到解決方案.
可是創新的設計思路倒是找不到的,這些我以爲纔是一個程序員的靈魂.