天天看點

漫談分層架構

1、為什麼要分層

  • 高内聚:分層的設計可以簡化系統設計,讓不同的層專注做某一子產品的事
  • 低耦合:層與層之間通過接口或API來互動,依賴方不用知道被依賴方的細節
  • 複用:分層之後可以做到很高的複用
  • 擴充性:分層架構可以讓我們更容易做橫向擴充

如果系統沒有分層,當業務規模增加或流量增大時我們隻能針對整體系統來做擴充。分層之後可以很友善的把一些子產品抽離出來,獨立成一個系統。

2、傳統MVC架構

優點:關注前後端分離

缺點:模型層分層太粗,融合了資料處理、業務處理等所有的功能。核心的複雜業務邏輯都放到模型層,導緻模型層很亂

适應場景:後端業務邏輯簡單的服務,比如接口直接提供對資料庫增删改查

漫談分層架構

3、後端三層架構

定義:

  1. 表現層:controller
  2. 邏輯層:service
  3. 資料通路層:dao

優點:邏輯與資料層分離

缺點:模型層分層比較粗,核心的複雜業務邏輯都放到模型層,導緻模型層很亂

漫談分層架構

4、阿裡分層架構

架構來源:參照參照阿裡釋出的《阿裡巴巴 Java 開發手冊 v1.4.0(詳盡版)》,将原先的三層架構細化而來

特點:添加了Manager 通用業務處理層。

這一層有兩個作用,一、可以将原先 Service 層的一些通用能力下沉到這一層,比如與緩存和存儲互動政策,中間件的接入;二、也可以在這一層封裝對第三方接口的調用,比如調用支付服務,調用稽核服務等RPC接口。

優點:相比于三層方式,添加了通用處理層對接外部平台。 上下遊對接劃分的比較清晰

缺點:核心業務邏輯層沒有劃分

适應場景:業務邏輯不複雜的常用業務

漫談分層架構

5、DDD分層架構

(1)特點

  1. 資料、緩存等都視為基礎層, 可以被所有層調用
  2. 抽離了領域層,負責核心業務邏輯處理,領域層調用外部依賴全部通過接口,以保證領域層的100%單測覆寫率
  3. 應用層聚合多個領域層的能力,隻做功能的組合、轉發,不負責具體業務邏輯

優點:相比于三層方式,更關注領域服務,即業務核心邏輯的劃分、收斂

缺點:分層複雜, 如果業務邏輯簡單沒有必要

适應場景:業務複雜的業務

漫談分層架構

(2)和傳統三層架構的對比

DDD四層架構也基于傳統三層架構的,不同點有以下幾方面:

  1. 關注點不一樣:三層架構關注請求調用順序;DDD架構關注領域服務。
  2. 橫向劃分方式不一樣:三層架構主要關注縱向劃分,對橫向劃分沒有約定;DDD架構更關注縱向,即:多個領域層之間劃分及互動方式。
  3. 對資源的定位不一樣:三層架構把所有依賴的資料都放到資料通路層;DDD架構隻将領域強關聯的資料放到Repository中,其他比如API層緩存、檔案等都當成基礎服務來處理。
漫談分層架構

6、整潔架構和六邊形架構

整潔架構和六邊形架構都是DDD架構的一種方式,隻不過是視角不同。

(1)整潔架構

特點:整潔架構的層就像洋蔥片一樣,它展現了分層的設計思想

整潔架構最主要的原則是依賴原則,它定義了各層的依賴關系,越往裡依賴越低,代碼級别越高,越是核心能力。外圓代碼依賴隻能指向内圓,内圓不需要知道外圓的任何情況。

漫談分層架構

(2)六邊形架構

六邊形架構又名“端口擴充卡架構”。追溯微服務架構的淵源,一般都會涉及到六邊形架構。

六邊形架構的核心理念是:應用是通過端口與外部進行互動的。我想這也是微服務架構下API網關盛行的主要原因吧。

也就是說,在下圖的六邊形架構中,紅圈内的核心業務邏輯(應用程式和領域模型)與外部資源(包括APP、Web應用以及資料庫資源等)完全隔離,僅通過擴充卡進行互動。它解決了業務邏輯與使用者界面的代碼交錯問題,很好地實作了前後端分離。六邊形架構各層的依賴關系與整潔架構一樣,都是由外向内依賴。

漫談分層架構

7、彙總