1、為什麼要分層
- 高内聚:分層的設計可以簡化系統設計,讓不同的層專注做某一子產品的事
- 低耦合:層與層之間通過接口或API來互動,依賴方不用知道被依賴方的細節
- 複用:分層之後可以做到很高的複用
- 擴充性:分層架構可以讓我們更容易做橫向擴充
如果系統沒有分層,當業務規模增加或流量增大時我們隻能針對整體系統來做擴充。分層之後可以很友善的把一些子產品抽離出來,獨立成一個系統。
2、傳統MVC架構
優點:關注前後端分離
缺點:模型層分層太粗,融合了資料處理、業務處理等所有的功能。核心的複雜業務邏輯都放到模型層,導緻模型層很亂
适應場景:後端業務邏輯簡單的服務,比如接口直接提供對資料庫增删改查
3、後端三層架構
定義:
- 表現層:controller
- 邏輯層:service
- 資料通路層:dao
優點:邏輯與資料層分離
缺點:模型層分層比較粗,核心的複雜業務邏輯都放到模型層,導緻模型層很亂
4、阿裡分層架構
架構來源:參照參照阿裡釋出的《阿裡巴巴 Java 開發手冊 v1.4.0(詳盡版)》,将原先的三層架構細化而來
特點:添加了Manager 通用業務處理層。
這一層有兩個作用,一、可以将原先 Service 層的一些通用能力下沉到這一層,比如與緩存和存儲互動政策,中間件的接入;二、也可以在這一層封裝對第三方接口的調用,比如調用支付服務,調用稽核服務等RPC接口。
優點:相比于三層方式,添加了通用處理層對接外部平台。 上下遊對接劃分的比較清晰
缺點:核心業務邏輯層沒有劃分
适應場景:業務邏輯不複雜的常用業務
5、DDD分層架構
(1)特點
- 資料、緩存等都視為基礎層, 可以被所有層調用
- 抽離了領域層,負責核心業務邏輯處理,領域層調用外部依賴全部通過接口,以保證領域層的100%單測覆寫率
- 應用層聚合多個領域層的能力,隻做功能的組合、轉發,不負責具體業務邏輯
優點:相比于三層方式,更關注領域服務,即業務核心邏輯的劃分、收斂
缺點:分層複雜, 如果業務邏輯簡單沒有必要
适應場景:業務複雜的業務
(2)和傳統三層架構的對比
DDD四層架構也基于傳統三層架構的,不同點有以下幾方面:
- 關注點不一樣:三層架構關注請求調用順序;DDD架構關注領域服務。
- 橫向劃分方式不一樣:三層架構主要關注縱向劃分,對橫向劃分沒有約定;DDD架構更關注縱向,即:多個領域層之間劃分及互動方式。
- 對資源的定位不一樣:三層架構把所有依賴的資料都放到資料通路層;DDD架構隻将領域強關聯的資料放到Repository中,其他比如API層緩存、檔案等都當成基礎服務來處理。
6、整潔架構和六邊形架構
整潔架構和六邊形架構都是DDD架構的一種方式,隻不過是視角不同。
(1)整潔架構
特點:整潔架構的層就像洋蔥片一樣,它展現了分層的設計思想
整潔架構最主要的原則是依賴原則,它定義了各層的依賴關系,越往裡依賴越低,代碼級别越高,越是核心能力。外圓代碼依賴隻能指向内圓,内圓不需要知道外圓的任何情況。
(2)六邊形架構
六邊形架構又名“端口擴充卡架構”。追溯微服務架構的淵源,一般都會涉及到六邊形架構。
六邊形架構的核心理念是:應用是通過端口與外部進行互動的。我想這也是微服務架構下API網關盛行的主要原因吧。
也就是說,在下圖的六邊形架構中,紅圈内的核心業務邏輯(應用程式和領域模型)與外部資源(包括APP、Web應用以及資料庫資源等)完全隔離,僅通過擴充卡進行互動。它解決了業務邏輯與使用者界面的代碼交錯問題,很好地實作了前後端分離。六邊形架構各層的依賴關系與整潔架構一樣,都是由外向内依賴。