1. 程式人生 > >DDD之1微服務設計為什麼選擇DDD

DDD之1微服務設計為什麼選擇DDD

![image.png](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154854033-191971129.png) # 背景 名詞解釋 ![file](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154854453-182952626.jpg) 如果你的團隊目前正是構建微服務架構風格的軟體系統,問自己兩個問題? ![file](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154854769-909135067.jpg) # 軟體架構演進 軟體架構大致經歷了從單機架構,集中式架構,分散式微服架構,程式的層次圖如下所示。 ![image.png](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154855452-237022910.png) ## 單機架構 特點如下: 1, 面向過程的設計方法; 2, 結構為CS; 3,程式的層次分兩層,即UI層和資料庫層; 4, 設計的核心在資料庫和欄位。 ## 集中式架構 特點如下: 1, 面向物件的設計方法; 2,程式層次為經典的3層架構,即業務接入層, 業務邏輯層,資料庫層;  3,部分企業也採用SOA架構風格; 4,集中式的架構缺點:擴充套件性,伸縮性差,系統容易變得臃腫; ## 分散式微服務架構 特點: 1, 基於微服務的理念:分而治之,模組高內聚(獨立團隊,獨立部署,獨立儲存,技術異構),模組之間通過RPC或者HTTP通訊,鬆耦合; 2,模組之間鬆耦合,解決了擴充套件性和伸縮性的問題; ## 架構對比 單體架構和集中式架構,系統分析, 系統設計,系統開發這3個階段是割裂的,即分屬3個不同的人或者小組或者崗位的人負責,這樣的後果是: 1,**系統分析,設計,開發三個階段的資訊不一致,導致上線之後功能跟需求偏差非常大;** 2,**系統的開發無法快速響應需求和業務的變化,錯失發展的良機。** # 微服務的困局 ## 微服務解決的問題 微服務解決了單體架構和集中式架構的問題:擴充套件性,彈性伸縮,敏捷開發快速響應業務變化; 但是微服務並非毫無缺陷。 ## 微服務的挑戰 微服務的粒度應該多大?微服務應該怎麼拆分和設計?微服務的邊界在哪裡? 微服務架構的提出者martin flower 也沒有告訴我們該如何拆分微服務。 微服務拆分的困局: 失敗的例子:微服務就是把單體拆的足夠小能夠獨立部署的技術框架,然後由於拆分的太細,後期服務運維和上線。 問題的本質:** 業務或者微服務的邊界到底是什麼?** 破局之路:2004年DDD釋出,Domain-Driven Design –Tackling Complexity in the Heart of Software,跟蹤軟體的核心複雜度。 核心思想:**通過領域驅動設計方法來定義領域模型,來確定業務和應用的邊界,最後保證業務模型和程式碼模型的一致性。** ** **通過業界的大量實踐證明: 通過DDD的方法來設計領域模型,劃分領域邊界再根據領域邊界從業務的視角來劃分微服務的邊界,通過這些邊界設計出來的微服務都非常合理,可以實現服務的內部高內聚,外部低耦合。** ** ** 所以很多的企業已經把DDD當做微服務設計的主流方法了。 # DDD ## 定義 是一種處理高度複雜的領域設計思想:**圍繞業務概念進行領域建模來控制業務的複雜性,並試圖分離技術實現的複雜性,解決軟體系統難以理解難以演進的複雜性問題;** 不是架構,而是一種架構設計的方法論: **通過邊界劃分把複雜業務領域簡單化,幫助我們設計清晰的領域和應用邊界,容易實現架構的演進。** ## 主要內容 分為戰略設計和戰術設計。 DDD帶了了什麼? ![file](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154856263-737121841.jpg) ### 戰略設計 從業務視角出發,建立業務領域模型,劃分領域的邊界,建立通用語言的限界上下文。限界上下文就是微服務邊界的參考。 領域模型用來指導微服務的設計和拆分。 基礎元素: 領域模型,領域邊界,通用語言限界上下文; 方法: ![file](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154856737-606296670.jpg) ![image.png](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154859150-1705577650.png) 劃定領域模型和微服務邊界的步驟: ![file](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154859750-1232819354.jpg) ### 戰術設計 技術視角出發,側重於領域模型的技術實現,完成軟體的開發和落地。 包含基礎元素: 聚合根、 實體、 值物件、 領域服務、 應用服務和 資源庫 等程式碼邏輯的設計和實現。 把領域模型中的領域物件跟程式碼模型中的物件對應,將業務架構和系統架構進行繫結。當我們調整業務架構和領域模型的時候,系統架構也會發生對映關係的調整; # 微服務和DDD之間的關係 ![file](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154900164-1677986706.jpg) # 小結 ![file](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154900524-694499568.jpg) 主要回答了為什麼微服務的設計和邊界需要使用DDD這種方法論來操作。希望諸位的微服務設計高內聚低耦合,良好的適應業務的變化,具備非常好的擴充套件性,伸縮性。 > 原創不易,關注誠可貴,轉發價更高!轉載請註明出處,讓我們互通有無,共同進步,歡迎溝通交流。 >我會持續分享Java軟體程式設計知識和程式設計師發展職業之路,歡迎關注,我整理了這些年程式設計學習的各種資源,關注公眾號‘李福春持續輸出’,傳送'學習資料'分享給你! ![](https://img2020.cnblogs.com/other/268922/202005/268922-20200530154900875-472501990.jpg)