我敢打賭,這個架構你一定知道!
大家好,我是魚皮。開發(fā)后端項目時,我們最常見的一種架構模式就是 分層架構 。
所謂的分層架構,就是把系統(tǒng)自上而下分為多個不同的層,每一層都有特定的功能和職責,且只和自己的直接上層與直接下層 “打交道”。
分層架構的優(yōu)點是:每一層都有明確定義的職責,易于理解和維護;而且各層可以獨立擴展,以適應不同的需求。
所以分層架構也是最適合新手入門學習、并且實際開發(fā)中應用最多的架構。
分層架構
下面給大家一種 Java 企業(yè)級后端項目開發(fā)時常用的分層架構,一般從前端界面(表示層)發(fā)送的請求出發(fā),需要經歷接入層、控制層、業(yè)務邏輯層、通用業(yè)務層、數(shù)據(jù)訪問層、系統(tǒng)資源層等。
表示層 通常是指讓用戶交互和查看信息的前端界面,比如用戶點擊按鈕后能夠發(fā)送一個請求,也可以叫用戶層、界面層等。
發(fā)送請求后,會經過 接入層 ,比如 Nginx 網關、或者其他中間件,對請求做一個預處理或轉發(fā),比如實現(xiàn)負載均衡。這一層不是必須存在的,通常更適用于中大型項目,前端也可以直接請求后端。
接入層會將請求轉發(fā)到 控制層(Controller),負責接受請求、調用業(yè)務邏輯層(Service)的代碼實現(xiàn)功能、然后響應結果??刂茖右话悴唤ㄗh寫復雜的業(yè)務邏輯,盡量保持精簡。
接下來是 業(yè)務邏輯層(Service),負責處理復雜的業(yè)務邏輯,比如對請求數(shù)據(jù)進行校驗、處理、調用數(shù)據(jù)訪問層以將結果存到數(shù)據(jù)庫中等,也是我們做系統(tǒng)時主要開發(fā)編碼的部分。
通用業(yè)務層(Manager、Module)是一種特殊的業(yè)務邏輯層,主要的作用是抽取了一些需要被多個業(yè)務調用的公共代碼,比如上傳文件到對象存儲、鑒權等,從而實現(xiàn)復用。
數(shù)據(jù)訪問層(Dao / Mapper)負責操作底層的數(shù)據(jù)源,比如對數(shù)據(jù)庫、文件、緩存等進行增刪改查。
最后是 系統(tǒng)資源層 ,也可以叫基礎設施層,包括各種基礎服務、系統(tǒng)環(huán)境等,比如數(shù)據(jù)庫、消息隊列、Redis、文件存儲、Linux 系統(tǒng)、Docker 等。復雜的基礎設施可能還包括 K8S 容器資源編排、資源調度平臺等。
需要注意的是,并不是所有的分層架構都需要這么劃分,不同業(yè)務和團隊可能有自己的分層選擇與規(guī)范。
比如我?guī)Т蠹议_發(fā)的 OJ 在線判題系統(tǒng) ,分層架構如下:

示例項目結構
基于分層架構,我們可以將項目按照特定的目錄名(包名)來組織代碼,比如:
controller:控制層
service:業(yè)務邏輯層
mapper:數(shù)據(jù)訪問層
model:數(shù)據(jù)模型
還可以按照業(yè)務或文件的類型來劃分目錄,比如:
constant:常量
annotation:注解類
common:公共類
config:配置類
job:任務
exception:異常處理相關
utils:工具類
以之前帶大家做過的 尋愛網項目 為例,項目的目錄結構如圖:

其他知識
1)計算機網絡也是采用了經典的分層架構,OSI 七層參考模型中,把計算機網絡自底向上分為了物理層、數(shù)據(jù)鏈路層、網絡層、傳輸層、會話層、表示層和應用層。每個層只處理特定的功能,比如數(shù)據(jù)傳輸、數(shù)據(jù)的路由;層與層之間通過接口(或者叫協(xié)議)進行通信。
2)需要注意的是,我們常用的后端開發(fā)框架 Spring MVC 是基于 MVC(Model-View-Controller)設計模式構建的,而不能算是傳統(tǒng)的分層架構。而且一般現(xiàn)在的項目中只使用 Spring MVC 作為整個項目的控制層,不過大多數(shù)用了 Spring MVC 框架的項目基本都使用了分層架構。
實踐
想了解更多常見的后端架構設計,推薦閱讀這篇文章:架構設計,讓網站支棱起來!
編程導航星球的所有后端項目基本都使用了經典分層架構,隨便實踐一個項目都能學會這種架構方式。
???? 編程導航原創(chuàng)項目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd