軟件體系結構——后端三層架構

三層架構——Controller、Service、Dao
不僅是對代碼進行的邏輯分層。其真正的本質,是將業務、技術和數據剝離。搞業務的專心做業務,搞技術的專心搞技術,做數據存儲的專心做數據存儲。三方通過接口進行對接,任一部分重構,只要輸入和輸出接口的數據不受影響,就不對其他層造成影響。

三層架構是一種通用型的,面向功能的。具體架設可以結合企業業務的顆粒度進一步細分,增加層數。

我們先來看一下,對于一個項目,比較通用的流程都有什么?
1.接收請求、數據
2.數據合法性驗證
3.開啟事務
4.執行業務規則、邏輯、流程
5.數據存儲
6.事務結束

明顯,12可以封裝成一個模塊,346可以封裝,5作為一個模塊
劃分模塊后,就可以做異步了,程序不再是瀑布型,前端不必等業務邏輯全部完成

下面我們通過例子進一步理解

如何理解三層架構?

——服務員、廚子、倉儲模型
在這里插入圖片描述

Controller——接口層(Web層)——服務員

Service——邏輯層——廚師

Dao——數據層——倉儲

為什么選擇三層架構?

https://www.bilibili.com/list/watchlater?oid=359096349&bvid=BV1PX4y1J7CC&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
對于小公司,溝通成本低,一人多職,效率快響應快,這樣很容易做大。可是做大以后呢?項目不在是你一個人的事,需要大家一起來完成。那么,不同人有不同人的思維方式,有不同的編程習慣,而且溝通效率會直線下降,此時,我們就需要對項目進行架構,對編程方式進行規范,對輸入輸出做詳細要求。

和MVC有何不同,為什么有些地方叫Controller為視圖層?

MVC的本質思想是:輸入View、處理Model、輸出Controller。
其解決的問題是,將系統整體整體分類為三個部分,清晰,便于維護。
但事實上耦合性依然很高,各個功能之間的依賴關系很復雜。

三層架構的本質思想是:數據處理放一層,業務邏輯放一層,數據存儲放一層。
將業務和數據處理剝離,前端只需要對接Controller就好了,其余的兩部分無需因前端改變而改變。

事實上,在三層架構中,Controller充當的角色是網絡服務,相較于視圖層View,Controller層一般稱為接口處層或Web層。
它的職責是接收HTTP請求、解析參數、調用Service層處理業務、根據處理結果組裝響應(跳轉頁面或返回JSON等)。它扮演的是MVC模式中的協調者(Controller) 角色,而不是視圖(View)。

三層架構中View的概念被弱化,它不是一個層,而屬于一種技術實現,這個渲染過程通常發生在Controller層內部。
1.Controller返回一個邏輯視圖名,如 “user-list”
2.然后由視圖解析器(View Resolver),如Thymeleaf、FreeMarker去找到對應的模板,如 user-list.html并渲染
3.最終生成HTML返回給瀏覽器。

三層架構詳細拆解

在這里插入圖片描述

必須堅持

接口層
堅決不寫任何業務邏輯代碼

邏輯層
不接受任何接口層的容器對象,如request、response、cookie、session。如果哪天我的接口層不采用Web,這些對象就通通沒有了
不處理任何數據存儲相關的SQL語句,不依賴任何數據層對象。這些對象只有連數據庫時候才會有,如果我換成緩存,它們也不復存在。

數據層
不處理任何業務邏輯代碼

功能拓展

Web層
如果我想要增加WebService、WebSocket兩個功能,我只需要在Web層中增加兩個模塊就可以了,不對另外兩層造成任何影響。
如果我想改用JDBC、JSF、JSP做前端,我只需要改Web層就可以了,不對另外兩層造成任何影響。

數據層
如果我們發現,某些數據的訪問頻度非常大,那么我們引入緩存就好了,只需要在數據層增加一個模塊,不對另外兩層造成任何影響。

進一步劃分

看見這個圖有沒有什么感覺?
沒錯,這是流水線的感覺,對于多線程,我們通過進一步細化流程,以提升效率。那么如果我們將小模塊聚合成服務,這樣就成了微服務架構的雛形。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98101.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QML學習筆記(一)基本了解和工程配置

前言: 已經從事QT開發幾年了,但對于QML這個東西始終是沒有徹底掌握,一方面實際工作中沒有用到過,其次它的語法對我來說是全新的東西,不像QWidget那一套可以直接在C中去寫。這就是為什么網上都說qml更簡單,我…

SAP HANA Scale-out 04:緩存

結果緩存靜態結果緩存 Vs 動態結果緩存FeatureStatic Result CacheDynamic Result CacheTarget Scenario對復雜視圖(通常是頂層視圖)的查詢頻繁更新的大表(例如ACDOCA)上的聚合查詢Query result非實時數據實時數據ScopeTarget obj…

嘉興禾潤 HTR7216 (S) LED 驅動芯片:特性與應用

在如今智能設備飛速普及的時代,無論是智能家居的氛圍營造、IoT 設備的狀態提示,還是個人消費電子的視覺呈現,都離不開高性能 LED 驅動芯片的支撐。嘉興禾潤推出的 HTR7216 (S) LED 驅動芯片,憑借豐富的功能、精準的控制以及出色的…

Python實現劍龍優化算法 (Stegosaurus Optimization Algorithm, SOA)優化函數(付完整代碼)

Python實現劍龍優化算法 (Stegosaurus Optimization Algorithm, SOA)優化函數(付完整代碼)1.劍龍優化算法介紹劍龍優化算法(Stegosaurus Optimization Algorithm,SOA)是一種受劍龍獨特生理結構和行為模式啟發而設計的元…

分布式拜占庭容錯算法——權益證明(PoS)算法詳解

Java 實現權益證明(PoS)算法詳解 一、PoS 核心機制 #mermaid-svg-Sbj0HU6MjOl1yo5L {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Sbj0HU6MjOl1yo5L .error-icon{fill:#552222;}#mermaid-s…

【論文閱讀】谷歌:生成式數據優化,只需請求更好的數據

谷歌DeepMind團隊通過Generative Data Refinement(GDR)技術,成功將極端有毒的4chan討論數據轉化為安全且語義豐富的訓練素材,推動了LLM訓練數據凈化的新范式: ? GDR利用預訓練大模型對原始數據進行“重寫”&#xff0…

C++ 多線程實戰 10|C++20 的信號量、閂鎖與屏障

目錄 前言 學習目標 1. 信號量(Semaphore) 示例:限制并發下載任務 2. 閂鎖(Latch) 示例:賽跑 3. 屏障(Barrier) 示例:圖像處理流水線 4. 常見坑與對策 5. 實踐作…

【Java SE】01. 初識Java

1. 認識Java Java是一種優秀的程序設計語言,它具有令人賞心悅目的語法和易于理解的語義。Java還是一個有一系列計算機軟件和規范形成的技術體系,這個技術體系提供了完整的用于軟件開發和跨平臺部署的支持環境,并廣泛應用于嵌入式系統、移動終…

解鎖倉儲智能調度、運輸路徑優化、數據實時追蹤,全功能降本提效的智慧物流開源了

AI 視頻監控平臺:全鏈路協同驅動的智能監控解決方案AI 視頻監控平臺是一款融合高性能功能與輕量化操作的實時算法驅動型視頻監控系統,其核心愿景在于深度破除不同芯片廠商間的技術壁壘,省去冗余重復的適配環節,最終達成芯片、算法…

冒泡排序與選擇排序以及單鏈表與雙鏈表

1. 冒泡排序(Bubble Sort) 1. 原理 冒泡排序是一種 簡單的排序算法,通過 兩兩比較相鄰元素,把較大的元素逐漸 “冒泡” 到數組末尾。 思路: 從數組頭開始,比較相鄰兩個元素。 如果前一個比后一個大&…

Python實現計算點云投影面積

本次我們分享一種基于 Open3D 的快速、穩健方法,用于從激光點云中自動提取“地面”并計算其投影面積。算法先自適應估計地面高程,再將地面點投影至水平面,隨后用凸包或最小外接矩形求取面積。整個流程無需人工干預,單文件即可運行…

AXI4 協議

一、AXI4簡介AXI4(Advanced eXtensible Interface 4)是ARM公司推出的高性能片上總線協議,屬于AMBA(Advanced Microcontroller Bus Architecture)標準的一部分。它專為高帶寬、低延遲的片上通信設計,廣泛應用…

《餓殍:明末千里行》Switch版試玩發布 3月13日發售

使用jQuery的常用方法與返回值分析 jQuery是一個輕量級的JavaScript庫,旨在簡化HTML文檔遍歷和操作、事件處理以及動畫效果的創建。本文將介紹一些常用的jQuery方法及其返回值,幫助開發者更好地理解和運用這一強大的庫。 1. 選擇器方法 jQuery提供了多種…

[特殊字符] 認識用戶手冊用戶手冊(也稱用戶指南、產品手冊)是通過對產品功能的清

一份優秀的用戶手冊能有效降低用戶的使用門檻,提升用戶體驗和工作效率。下面我將為你梳理編寫用戶手冊的核心要點、步驟和技巧。📖 認識用戶手冊用戶手冊(也稱用戶指南、產品手冊)是??通過對產品功能的清晰解釋,為特…

蘋果軟件代碼混淆,iOS混淆、iOS加固、ipa安全與合規取證注意事項(實戰指南)

在移動軟件交付與合規審計中,蘋果軟件代碼混淆已成為保護知識產權與用戶數據的常規手段。但混淆帶來的不僅是逆向難度的提升,也會觸發崩潰取證、符號化(symbolication)、審計合規與法律證據保存等問題。本文從工程與合規雙視角出發…

Redis框架詳解

目錄 1. redis是什么 主要特點 2. redis中存儲的數據類型 2.1 String類型 2.2 List類型 2.3 Hash類型 2.4 Set類型 2.5 Zset類型 2.6 其它類型 3.redis高可用框架 1. redis是什么 Redis 是一個開源的、基于內存的數據結構存儲系統,是 Remote Dictionary…

每日隨機展示10個wordpress置頂文章

WordPress 置頂文章是博主根據自己的需要設置的&#xff0c;通常用于展示重要或熱門的文章。 以下是一個示例代碼&#xff0c;用于在 WordPress 主題中展示 10 個置頂文章&#xff1a; <?php // 查詢置頂文章 $sticky get_option(sticky_posts); $args array(post__in …

金融工程vs金融數學:誰更貼近量化交易?

在金融行業邁向高度數字化的今天&#xff0c;量化交易已成為頂尖金融機構的核心競爭力之一。它以數學模型為基礎&#xff0c;借助編程技術實現策略自動化&#xff0c;在高頻、中低頻、套利、因子投資等多個領域展現出強大生命力。對于有志于此的大學生而言&#xff0c;選擇一個…

實測AI Ping,一個大模型服務選型的實用工具

作為一名長期奮戰在一線的AI應用工程師&#xff0c;我在技術選型中最頭疼的問題就是&#xff1a;“這個模型服務的真實性能到底如何&#xff1f;” 官方的基準測試總是在理想環境下進行&#xff0c;而一旦投入使用&#xff0c;延遲波動、吞吐下降、高峰期服務不可用等問題就接踵…

深信服軟件:aTrustAgent異常占用問題處理

問題&#xff1a;aTrustAgent占用CPU 大早上開電腦&#xff0c;風扇轉的飛起&#xff0c;任務管理器看&#xff0c;發現是有幾個 aTrustAgent 進程搞得鬼。 印象中&#xff0c;好像沒有裝過這個軟件&#xff0c;搜了下&#xff0c;是深信服的軟件&#xff0c;不知道是不是裝哪…