為什么要分層
- 高內(nèi)聚:分層的設(shè)計可以簡化系統(tǒng)設(shè)計,讓不同的層專注做某一模塊的事
- 低耦合:層與層之間通過接口或API來交互,依賴方不用知道被依賴方的細(xì)節(jié)
- 復(fù)用:分層之后可以做到很高的復(fù)用
- 擴(kuò)展性:分層架構(gòu)可以讓我們更容易做橫向擴(kuò)展
如果系統(tǒng)沒有分層,當(dāng)業(yè)務(wù)規(guī)模增加或流量增大時我們只能針對整體系統(tǒng)來做擴(kuò)展。分層之后可以很方便的把一些模塊抽離出來,獨(dú)立成一個系統(tǒng)。
2、傳統(tǒng)MVC架構(gòu)
優(yōu)點(diǎn):關(guān)注前后端分離
缺點(diǎn):模型層分層太粗,融合了數(shù)據(jù)處理、業(yè)務(wù)處理等所有的功能。核心的復(fù)雜業(yè)務(wù)邏輯都放到模型層,導(dǎo)致模型層很亂
適應(yīng)場景:后端業(yè)務(wù)邏輯簡單的服務(wù),比如接口直接提供對數(shù)據(jù)庫增刪改查
3、后端三層架構(gòu)
定義:
- 表現(xiàn)層:controller
- 邏輯層:service
- 數(shù)據(jù)訪問層:dao
優(yōu)點(diǎn):邏輯與數(shù)據(jù)層分離
缺點(diǎn):模型層分層比較粗,核心的復(fù)雜業(yè)務(wù)邏輯都放到模型層,導(dǎo)致模型層很亂
適應(yīng)場景:后端業(yè)務(wù)邏輯簡單的服務(wù),比如接口直接提供對數(shù)據(jù)庫增刪改查
4、阿里分層架構(gòu)
架構(gòu)來源:參照參照阿里發(fā)布的《阿里巴巴 JAVA 開發(fā)手冊 v1.4.0(詳盡版)》,將原先的三層架構(gòu)細(xì)化而來
特點(diǎn):添加了Manager 通用業(yè)務(wù)處理層。
這一層有兩個作用,一、可以將原先 Service 層的一些通用能力下沉到這一層,比如與緩存和存儲交互策略,中間件的接入;二、也可以在這一層封裝對第三方接口的調(diào)用,比如調(diào)用支付服務(wù),調(diào)用審核服務(wù)等RPC接口。
優(yōu)點(diǎn):相比于三層方式,添加了通用處理層對接外部平臺。 上下游對接劃分的比較清晰
缺點(diǎn):核心業(yè)務(wù)邏輯層沒有劃分
適應(yīng)場景:業(yè)務(wù)邏輯不復(fù)雜的常用業(yè)務(wù)
5、DDD分層架構(gòu)
(1)特點(diǎn)
- 數(shù)據(jù)、緩存等都視為基礎(chǔ)層, 可以被所有層調(diào)用
- 抽離了領(lǐng)域?qū)樱?fù)責(zé)核心業(yè)務(wù)邏輯處理,領(lǐng)域?qū)诱{(diào)用外部依賴全部通過接口,以保證領(lǐng)域?qū)拥?00%單測覆蓋率
- 應(yīng)用層聚合多個領(lǐng)域?qū)拥哪芰Γ蛔龉δ艿慕M合、轉(zhuǎn)發(fā),不負(fù)責(zé)具體業(yè)務(wù)邏輯
優(yōu)點(diǎn):相比于三層方式,更關(guān)注領(lǐng)域服務(wù),即業(yè)務(wù)核心邏輯的劃分、收斂
缺點(diǎn):分層復(fù)雜, 如果業(yè)務(wù)邏輯簡單沒有必要
適應(yīng)場景:業(yè)務(wù)復(fù)雜的業(yè)務(wù)
(2)和傳統(tǒng)三層架構(gòu)的對比
DDD四層架構(gòu)也基于傳統(tǒng)三層架構(gòu)的,不同點(diǎn)有以下幾方面:
- 關(guān)注點(diǎn)不一樣:三層架構(gòu)關(guān)注請求調(diào)用順序;DDD架構(gòu)關(guān)注領(lǐng)域服務(wù)。
- 橫向劃分方式不一樣:三層架構(gòu)主要關(guān)注縱向劃分,對橫向劃分沒有約定;DDD架構(gòu)更關(guān)注縱向,即:多個領(lǐng)域?qū)又g劃分及交互方式。
- 對資源的定位不一樣:三層架構(gòu)把所有依賴的數(shù)據(jù)都放到數(shù)據(jù)訪問層;DDD架構(gòu)只將領(lǐng)域強(qiáng)關(guān)聯(lián)的數(shù)據(jù)放到Repository中,其他比如API層緩存、文件等都當(dāng)成基礎(chǔ)服務(wù)來處理。
6、整潔架構(gòu)和六邊形架構(gòu)
整潔架構(gòu)和六邊形架構(gòu)都是DDD架構(gòu)的一種方式,只不過是視角不同。
(1)整潔架構(gòu)
特點(diǎn):整潔架構(gòu)的層就像洋蔥片一樣,它體現(xiàn)了分層的設(shè)計思想
整潔架構(gòu)最主要的原則是依賴原則,它定義了各層的依賴關(guān)系,越往里依賴越低,代碼級別越高,越是核心能力。外圓代碼依賴只能指向內(nèi)圓,內(nèi)圓不需要知道外圓的任何情況。
(2)六邊形架構(gòu)
六邊形架構(gòu)又名“端口適配器架構(gòu)”。追溯微服務(wù)架構(gòu)的淵源,一般都會涉及到六邊形架構(gòu)。
六邊形架構(gòu)的核心理念是:應(yīng)用是通過端口與外部進(jìn)行交互的。我想這也是微服務(wù)架構(gòu)下API網(wǎng)關(guān)盛行的主要原因吧。
也就是說,在下圖的六邊形架構(gòu)中,紅圈內(nèi)的核心業(yè)務(wù)邏輯(應(yīng)用程序和領(lǐng)域模型)與外部資源(包括App、Web應(yīng)用以及數(shù)據(jù)庫資源等)完全隔離,僅通過適配器進(jìn)行交互。它解決了業(yè)務(wù)邏輯與用戶界面的代碼交錯問題,很好地實現(xiàn)了前后端分離。六邊形架構(gòu)各層的依賴關(guān)系與整潔架構(gòu)一樣,都是由外向內(nèi)依賴。
7、匯總
本文匯總了傳統(tǒng)MVC架構(gòu)、后端三層架構(gòu)、阿里分層架構(gòu)、DDD架構(gòu)以及基于DDD架構(gòu)的整潔架構(gòu)和六邊形架構(gòu)。從前往后越來越復(fù)雜,其他也對應(yīng)著軟件工程的越來越復(fù)雜,架構(gòu)模式也變的越來越復(fù)雜。軟件架構(gòu)領(lǐng)域沒有一招鮮吃遍天的功法,針對的不同的業(yè)務(wù)場景采用不同的架構(gòu),并且隨著業(yè)務(wù)的發(fā)展,不斷調(diào)整架構(gòu)以適應(yīng)業(yè)務(wù)的發(fā)展,以變(架構(gòu)、技術(shù)組件、重構(gòu)等)應(yīng)不變(業(yè)務(wù)發(fā)展、用戶體驗、穩(wěn)定性等)才是一個合格的軟件工程師應(yīng)追求的境界。
原文鏈接:https://juejin.cn/post/6907828643062513671
如果覺得本文對你有幫助,可以轉(zhuǎn)發(fā)關(guān)注支持一下