【軟件開發(fā)】架構(gòu)設(shè)計Structure-上篇
Start:關(guān)注本公眾號后,可直接聯(lián)系后臺獲取排版美化的詳細文檔!
Hints:本篇文章所編纂的資料均來自網(wǎng)絡(luò),特此感謝參與奉獻的有關(guān)人員。
架構(gòu)設(shè)計本質(zhì):
系統(tǒng)的架構(gòu)設(shè)計,是改善耦合的最好方式。架構(gòu)設(shè)計的本質(zhì),就是:劃分耦合的單位——也就是劃分模塊。系統(tǒng)應(yīng)該劃分成什么樣的模塊,代表了設(shè)計者對于系統(tǒng)應(yīng)對的需求的基本理解。一旦能清晰的劃分出模塊了,其代碼耦合就有了最基本的范圍。而模塊本身也是提示程序員理解系統(tǒng)的基本單位。
架構(gòu)設(shè)計概念
功能模塊:縱向劃分模塊
實現(xiàn)層次:橫向切分層次
架構(gòu)特征要求:
系統(tǒng)的非功能性特征,如可擴展性、可靠性、強壯性、靈活性、性能等。
1.可靠性(Reliable)。軟件系統(tǒng)對于用戶的商業(yè)經(jīng)營和管理來說極為重要,因此軟件系統(tǒng)必須非??煽?。
2.安全性(Secure)。軟件系統(tǒng)所承擔的交易的商業(yè)價值極高,系統(tǒng)的安全性非常重要。
3.可擴展性(SCAlable)。軟件必須能夠在用戶的使用率、用戶的數(shù)目增加很快的情況下,保持合理的性能。只有這樣,才能適應(yīng)用戶的市場擴展得可能性。
4.可定制化(CuSTomizable)。同樣的一套軟件,可以根據(jù)客戶群的不同和市場需求的變化進行調(diào)整。
5.可擴展性(Extensible)。在新技術(shù)出現(xiàn)的時候,一個軟件系統(tǒng)應(yīng)當允許導(dǎo)入新技術(shù),從而對現(xiàn)有系統(tǒng)進行功能和性能的擴展。
6.可維護性(MAIntainable)。軟件系統(tǒng)的維護包括兩方面,一是排除現(xiàn)有的錯誤,二是將新的軟件需求反映到現(xiàn)有系統(tǒng)中去。一個易于維護系統(tǒng)可以有效地降低技術(shù)支持的花費。
7.客戶體驗(Customer Experience)。軟件系統(tǒng)必須易于使用。
8.市場時機(Time to Market)。軟件用戶要面臨同業(yè)競爭,軟件提供商也要面臨同業(yè)競爭。以最快的速度爭奪市場先機非常重要。
常見架構(gòu)模式:
1分層模式 (Layered pattern)
2客戶端/服務(wù)器模式 (Client-server pattern)
3主/從模式 (Master-slave pattern)
4管道/過濾器模式 (Pipe-filter pattern)
5代理模式 (Broker pattern)
6對等模式 (Peer-to-peer pattern)
7事件總線模式 (Event-bus pattern)
8模型/視圖/控制器 (MVC) 模式 (Model-view-controller pattern)
9黑板模式 (Blackboard pattern)
10解析器模式 (Interpreter pattern)

1分層模式 (Layered pattern)
分層模式簡介
分層模式用于對結(jié)構(gòu)化設(shè)計的軟件進行層次拆解,每個層次為獨立的抽象,為其上層抽象提供服務(wù)。
系統(tǒng)通常被拆分為以下四個層次:
表示層(也稱為 UI 層)
應(yīng)用層(也稱為服務(wù)層)
業(yè)務(wù)邏輯層(也稱為領(lǐng)域?qū)樱?/span>
數(shù)據(jù)訪問層(也稱為持久化層)
分層建立方法:
以業(yè)務(wù)邏輯特征建模 ——使用分層模式,往往需要我們在大腦里對問題領(lǐng)域進行層次抽象,這種抽象最可信賴的原則,就是按照業(yè)務(wù)邏輯去做。比如現(xiàn)實業(yè)務(wù)中有一個角色,我們就建立一個角色的模塊;如果我們有一個場景,就以此為名建立一個這樣的模塊。以業(yè)務(wù)邏輯建立的模塊,本身也會讓系統(tǒng)更容易被理解,因為在代碼里能找到和現(xiàn)實中一一對應(yīng)的概念。
分層模式優(yōu)點:
1)重復(fù)代碼減少了,功能開發(fā)更快了——一頂層開發(fā)只需要學習下層類庫,就可以開始開發(fā);近似功能模塊被統(tǒng)一,修BUG覆蓋面更好。
2)性能提升代碼能更好的覆蓋了——集中了通用實現(xiàn)代碼,也集中了優(yōu)化部分
3)可以并行開發(fā),資深人員負責底層,一般人員負責上層
使用場景
通用桌面應(yīng)用程序
電子商務(wù) Web 應(yīng)用
2 客戶端/服務(wù)器模式 (Client-server pattern)
客戶端/服務(wù)器模式由兩個部分構(gòu)成:一個服務(wù)器與多個客戶端。服務(wù)器組件同時為多個客戶端組件提供服務(wù)。客戶端向服務(wù)器發(fā)啟服務(wù)請求,服務(wù)器將相應(yīng)服務(wù)信息回應(yīng)給客戶端。此外,服務(wù)器持續(xù)監(jiān)聽來自客戶端的請求。
使用場景
電子郵件、文件共享及銀行業(yè)務(wù)等在線應(yīng)用
3. 主/從模式 (Master-slave pattern)
主/從模式由兩個部分構(gòu)成:主設(shè)備與從設(shè)備。主服務(wù)組件將作業(yè)分發(fā)給多個從設(shè)備組件,并根據(jù)這些從設(shè)備反饋的結(jié)果,計算生成最終結(jié)果。
使用場景
數(shù)據(jù)庫復(fù)制,主數(shù)據(jù)庫被認定為權(quán)威數(shù)據(jù)源,各從數(shù)據(jù)庫與主數(shù)據(jù)保持同步
在計算機系統(tǒng)中通過總線互連的各設(shè)備(包括主設(shè)備與從設(shè)備)
4. 管道/過濾器模式 (Pipe-filter pattern)
管道/過濾器模式用于構(gòu)造用于生成及處理數(shù)據(jù)流的系統(tǒng)。每個處理過程都封裝在過濾器(filter)組件之中,要處理的數(shù)據(jù)通過 管道(pips) 進行投遞。管道同時用于作為 過濾器(filter) 間的緩沖及同步。
使用場景
編譯器,一系列的過濾器用于詞法分析、語法分析、語義分析及代碼生成
生物信息學的工作流
5. 代理模式(Broker pattern)
代理模式用于在結(jié)構(gòu)化系統(tǒng)中對組件解耦。系統(tǒng)內(nèi)各組件間采用遠過程調(diào)用(remote service invocations)的方式交互。代理(Broker)組件充當組件間通訊的協(xié)調(diào)角色。
提供服務(wù)的組件將其能力(服務(wù)以及特性)發(fā)布給代理,客戶端均向代理請求服務(wù),由代理將請求重定向到先前已發(fā)布過對應(yīng)服務(wù)的組件進行處理。
使用場景
消息中間件軟件:Apache ActiveMQ,Apache Kafka,RabbitMQ 與 JBoss 等等
6. 對等模式 (Peer-to-peer pattern)
對等模式中的組件稱之為對等體(peer),對等體既作為向其他對等體請求服務(wù)的客戶端,同時也做為響應(yīng)其他對等體請求的服務(wù)端。對等體可以在運行過程中動態(tài)地改變其角色,即,既可以單獨做為客戶端或服務(wù)端運行,又可同時作為客戶端與服務(wù)端運行。
使用場景
網(wǎng)絡(luò)文件共享:Gnutella 與 G2)
流媒體協(xié)議:P2PTV 與 PDTP.
流媒體應(yīng)用: Spotify.
7. 事件總線模式(Event-bus pattern)
事件總線模式應(yīng)用于事件處理,主要由四個組件構(gòu)成:事件源(event source),事件偵聽者(event listener),通道(Channel)以及總線(event bus)。事件源將消息發(fā)布到總線的特定通道,偵聽者訂閱相應(yīng)的通道,事件源所發(fā)布的消息經(jīng)通道通告給訂閱通道的偵聽者。
使用場景
Android 開發(fā)
通告(Notification)服務(wù)
8. 模型/視圖/控制器 (MVC) 模式(Model-view-controller pattern)
模型/視圖/控制器模式(簡稱 MVC 模式)將交互式應(yīng)用程序拆分為三個部分:
模型(model) – 包含核心功能及數(shù)據(jù)
視圖(view) – 呈現(xiàn)信息給用戶(通過有多個視圖)
控制器(controller) – 處理用戶的輸入操作
MVC 模式通過將內(nèi)部信息表示、用戶信息呈現(xiàn)以及用戶操作接收分開的方式解耦組件,實現(xiàn)高效代碼重用。
使用場景
主流開發(fā)語言所構(gòu)建的互聯(lián)網(wǎng)網(wǎng)頁應(yīng)用架構(gòu)
Django 與 Rails 等網(wǎng)頁應(yīng)用開發(fā)框架
9. 黑板模式(Blackboard pattern)
黑板模式適用于 無預(yù)知確定解決策略 的問題,主要由三個組件構(gòu)成:
黑板(blackboard) – 用于存儲解空間對象的結(jié)構(gòu)化全局內(nèi)存
知識(knowledge)源 – 能自表意的專用模塊
控制(control)組件 – 選擇、配置與執(zhí)行的模塊
所有的組件均能訪問黑板,組件可將新生成的數(shù)據(jù)對象寫入黑板,也可以通過模式匹配從黑板中獲取知識源所生成的特定數(shù)據(jù)。
使用場景
語音識別
車輛識別和追蹤
蛋白質(zhì)的結(jié)構(gòu)鑒定
聲納信號解析
10. 解析器模式(Interpreter pattern)
解析器模式用于設(shè)計語言的解析程序,主要用于指定評估程序代碼行,即解析出特定語言的語句與表達式,其核心思想是為語言的每個符號定義相應(yīng)的類。
使用場景
SQL 等數(shù)據(jù)庫查詢語言
通訊協(xié)議描述語言
常見軟件架構(gòu)
1分層架構(gòu)
分層架構(gòu)(layered architecture)是最常見的軟件架構(gòu),也是事實上的標準架構(gòu)。如果你不知道要用什么架構(gòu),那就用它。這種架構(gòu)將軟件分成若干個水平層,每一層都有清晰的角色和分工,不需要知道其他層的細節(jié)。層與層之間通過接口通信。雖然沒有明確約定,軟件一定要分成多少層,但是四層的結(jié)構(gòu)最常見。

表現(xiàn)層(presentation):用戶界面,負責視覺和用戶互動
業(yè)務(wù)層(business):實現(xiàn)業(yè)務(wù)邏輯
持久層(persistence):提供數(shù)據(jù),SQL 語句就放在這一層
數(shù)據(jù)庫(database) :保存數(shù)據(jù)
2事件驅(qū)動架構(gòu)
事件(event)是狀態(tài)發(fā)生變化時,軟件發(fā)出的通知。
事件驅(qū)動架構(gòu)(event-driven architecture)就是通過事件進行通信的軟件架構(gòu)。它分成四個部分。

事件隊列(event queue):接收事件的入口
分發(fā)器(event mediator):將不同的事件分發(fā)到不同的業(yè)務(wù)邏輯單元
事件通道(event channel):分發(fā)器與處理器之間的聯(lián)系渠道
事件處理器(event processor):實現(xiàn)業(yè)務(wù)邏輯,處理完成后會發(fā)出事件,觸發(fā)下一步操作
對于簡單的項目,事件隊列、分發(fā)器和事件通道,可以合為一體,整個軟件就分成事件代理和事件處理器兩部分。

3微核架構(gòu)
微核架構(gòu)(microkernel architecture)又稱為"插件架構(gòu)"(plug-in architecture),指的是軟件的內(nèi)核相對較小,主要功能和業(yè)務(wù)邏輯都通過插件實現(xiàn)。
內(nèi)核(core)通常只包含系統(tǒng)運行的最小功能。插件則是互相獨立的,插件之間的通信,應(yīng)該減少到最低,避免出現(xiàn)互相依賴的問題。

4微服務(wù)架構(gòu)
微服務(wù)架構(gòu)(microservices architecture)是服務(wù)導(dǎo)向架構(gòu)(service-oriented architecture,縮寫 SOA)的升級。
每一個服務(wù)就是一個獨立的部署單元(separately deployed unit)。這些單元都是分布式的,互相解耦,通過遠程通信協(xié)議(比如REST、SOAP)聯(lián)系。

微服務(wù)架構(gòu)分成三種實現(xiàn)模式。
-RESTful API 模式:服務(wù)通過 API 提供,云服務(wù)就屬于這一類
-RESTful 應(yīng)用模式:服務(wù)通過傳統(tǒng)的網(wǎng)絡(luò)協(xié)議或者應(yīng)用協(xié)議提供,背后通常是一個多功能的應(yīng)用程序,常見于企業(yè)內(nèi)部
-集中消息模式:采用消息代理(message broker),可以實現(xiàn)消息隊列、負載均衡、統(tǒng)一日志和異常處理,缺點是-會出現(xiàn)單點失敗,消息代理可能要做成集群
5云架構(gòu)
云結(jié)構(gòu)(cloud architecture)主要解決擴展性和并發(fā)的問題,是最容易擴展的架構(gòu)。
它的高擴展性,主要原因是沒使用中央數(shù)據(jù)庫,而是把數(shù)據(jù)都復(fù)制到內(nèi)存中,變成可復(fù)制的內(nèi)存數(shù)據(jù)單元。然后,業(yè)務(wù)處理能力封裝成一個個處理單元(prcessing unit)。訪問量增加,就新建處理單元;訪問量減少,就關(guān)閉處理單元。由于沒有中央數(shù)據(jù)庫,所以擴展性的最大瓶頸消失了。由于每個處理單元的數(shù)據(jù)都在內(nèi)存里,最好要進行數(shù)據(jù)持久化。
這個模式主要分成兩部分:處理單元(processing unit)和虛擬中間件(virtualized middleware)。
處理單元:實現(xiàn)業(yè)務(wù)邏輯
虛擬中間件:負責通信、保持sessions、數(shù)據(jù)復(fù)制、分布式處理、處理單元的部署。

虛擬中間件又包含四個組件。
消息中間件(Messaging Grid):管理用戶請求和session,當一個請求進來以后,決定分配給哪一個處理單元。
數(shù)據(jù)中間件(Data Grid):將數(shù)據(jù)復(fù)制到每一個處理單元,即數(shù)據(jù)同步。保證某個處理單元都得到同樣的數(shù)據(jù)。
處理中間件(Processing Grid):可選,如果一個請求涉及不同類型的處理單元,該中間件負責協(xié)調(diào)處理單元
部署中間件(Deployment Manager):負責處理單元的啟動和關(guān)閉,監(jiān)控負載和響應(yīng)時間,當負載增加,就新啟動處理單元,負載減少,就關(guān)閉處理單元。
四大軟件結(jié)構(gòu)
1單體架構(gòu)
單體架構(gòu)比較初級,典型的三級架構(gòu),前端(Web/手機端)+中間業(yè)務(wù)邏輯層+數(shù)據(jù)庫層。這是一種典型的Java Spring mvc或者Python Drango框架的應(yīng)用。其架構(gòu)圖如下所示:

單體架構(gòu)的應(yīng)用比較容易部署、測試, 在項目的初期,單體應(yīng)用可以很好地運行。然而,隨著需求的不斷增加, 越來越多的人加入開發(fā)團隊,代碼庫也在飛速地膨脹。慢慢地,單體應(yīng)用變得越來越臃腫,可維護性、靈活性逐漸降低,維護成本越來越高。
2分布式應(yīng)用
中級架構(gòu),分布式應(yīng)用,中間層分布式+數(shù)據(jù)庫分布式,是單體架構(gòu)的并發(fā)擴展,將一個大的系統(tǒng)劃分為多個業(yè)務(wù)模塊,業(yè)務(wù)模塊分別部署在不同的服務(wù)器上,各個業(yè)務(wù)模塊之間通過接口進行數(shù)據(jù)交互。
數(shù)據(jù)庫也大量采用分布式數(shù)據(jù)庫,如redis、ES、solor等。通過LVS/Nginx代理應(yīng)用,將用戶請求均衡的負載到不同的服務(wù)器上。其架構(gòu)圖如下所示:

該架構(gòu)相對于單體架構(gòu)來說,這種架構(gòu)提供了負載均衡的能力,大大提高了系統(tǒng)負載能力,解決了網(wǎng)站高并發(fā)的需求。
3微服務(wù)架構(gòu)
微服務(wù)架構(gòu),主要是中間層分解,將系統(tǒng)拆分成很多小應(yīng)用(微服務(wù)),微服務(wù)可以部署在不同的服務(wù)器上,也可以部署在相同的服務(wù)器不同的容器上。當應(yīng)用的故障不會影響到其他應(yīng)用,單應(yīng)用的負載也不會影響到其他應(yīng)用,其代表框架有Spring cloud、Dubbo等。
其架構(gòu)圖如下所示:

4 Serverless架構(gòu)
當我們還在容器的浪潮中前行時,已經(jīng)有一些革命先驅(qū)悄然布局另外一個云計算戰(zhàn)場:Serverless架構(gòu)。

參考資料:
軟件體系架構(gòu)閱讀筆記(九) - 算法網(wǎng) (itpcb.com)
https://itpcb.com/a/701414
軟件架構(gòu)概覽-架構(gòu)-火龍果軟件工程 (uml.org.cn)
http://www.uml.org.cn/zjjs/zjjs-bk.asp
常用軟件架構(gòu)模式_軟件架構(gòu)模式的處理過程_經(jīng)典軟件架構(gòu)模式_常用16味藥膳藥材_新聞頭條 (xinwentoutiao.net)
https://www.xinwentoutiao.net/jishu/20200502/1276760.html
MVC、MVP、MVVM的區(qū)別和聯(lián)系(精講版) (biancheng.net)
http://c.biancheng.net/view/7743.html#:~:text=MVC%E3%80%81MVP%E3%80%81MVVM%20%E4%B8%89%E8%80%85%E7%9A%84%E4%B8%BB%E8%A6%81%E5%8C%BA%E5%88%AB%E5%B0%B1%E5%9C%A8%E4%BA%8E%E9%99%A4%20View%20%E5%B1%82%E5%92%8C%20Model%20%E5%B1%82%E4%B9%8B%E5%A4%96%E7%9A%84%E7%AC%AC%E4%B8%89%E5%B1%82%EF%BC%8C%E8%BF%99%E4%B8%80%E5%B1%82%E7%9A%84%E4%B8%8D%E5%90%8C%E4%BD%BF%E5%BE%97,MV%20%E7%B3%BB%E5%88%97%E6%A1%86%E6%9E%B6%E5%8C%BA%E5%88%86%E5%BC%80%E6%9D%A5%E3%80%82%20%E5%85%B6%E5%AE%9E%E5%BE%88%E9%9A%BE%E8%AF%B4%E5%87%BA%20MVC%E3%80%81MVP%E3%80%81MVVM%20%E5%93%AA%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%A5%BD%EF%BC%8C%E4%BB%8E%E8%A1%A8%E9%9D%A2%E4%B8%8A%E7%9C%8B%EF%BC%8C%E6%98%BE%E7%84%B6%E6%98%AF%20MVVM%20%E6%9C%80%E5%A5%BD%EF%BC%8C%E4%BD%BF%E7%94%A8%E8%B5%B7%E6%9D%A5%E6%9B%B4%E6%96%B9%E4%BE%BF%EF%BC%8C%E4%BB%A3%E7%A0%81%E7%9B%B8%E5%AF%B9%E4%B9%9F%E8%BE%83%E5%B0%91%E3%80%82
Android安卓架構(gòu)MVC、MVP、MVVM之間的區(qū)別和聯(lián)系(圖解+案例+源碼)_快樂李同學的博客-CSDN博客_android mvc mvp mvvm區(qū)別
https://blog.csdn.net/wq6ylg08/article/details/105023009
模式淺談_風一樣的少年-CSDN博客_mvc mvp mvvm
https://blog.csdn.net/qq_42127861/article/details/105876263
MVC、MVP、MVVM特點及三者的區(qū)別_Ancecis的博客-CSDN博客
https://blog.csdn.net/Ancecis/article/details/104204326
MVC,MVP 和 MVVM 的圖示 - 阮一峰的網(wǎng)絡(luò)日志 (ruanyifeng.com)
https://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html
MVC、MVP、MVVM模式的概念與區(qū)別 - 知乎 (zhihu.com)
https://zhuanlan.zhihu.com/p/377518336
MVC、MVP、MVVM模式的概念與區(qū)別 - 簡書 (jianshu.com)
https://www.jianshu.com/p/ff6de219f988
簡單介紹 10 個常見的軟件架構(gòu) - 知乎 (zhihu.com)
https://zhuanlan.zhihu.com/p/41395345#:~:text=%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D%2010%20%E4%B8%AA%E5%B8%B8%E8%A7%81%E7%9A%84%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%201%20%E5%88%86%E5%B1%82%E6%A8%A1%E5%BC%8F%20%28Layered%20pattern%29%202,%E6%A8%A1%E5%BC%8F%EF%BC%88Model-vi%20...%209%20%E9%BB%91%E6%9D%BF%E6%A8%A1%E5%BC%8F%EF%BC%88Blackboard%20pattern%EF%BC%89%2010%20%E8%A7%A3%E6%9E%90%E5%99%A8%E6%A8%A1%E5%BC%8F%EF%BC%88Interpreter%20pattern%EF%BC%89
五種常見軟件架構(gòu) - 時間朋友 - 博客園 (cnblogs.com)
https://www.cnblogs.com/doit8791/p/9343826.html
淺析常用軟件架構(gòu)的三種架構(gòu)模型 - 云+社區(qū) - 騰訊云 (tencent.com)
https://cloud.tencent.com/developer/article/1116141
十大常用軟件架構(gòu)模式簡介 - 簡書 (jianshu.com)
https://www.jianshu.com/p/128ec31551b7
四大常用的軟件架構(gòu),來看看你們公司用哪種?
-程序人生-Web開發(fā)者網(wǎng) (webkfz.com)
http://webkfz.com/cxrs/eass.html
最常用的4 大軟件架構(gòu) - 知乎 (zhihu.com)
https://zhuanlan.zhihu.com/p/343457113
軟件架構(gòu)入門 - 阮一峰的網(wǎng)絡(luò)日志 (ruanyifeng.com)
https://www.ruanyifeng.com/blog/2016/09/software-architecture.html
軟件架構(gòu)設(shè)計-軟件架構(gòu)風格、分層架構(gòu) - 驚覺 (leheavengame.com)
http://leheavengame.com/article/60dbbb53049f556e1a231ffe
《軟件架構(gòu)設(shè)計》學習筆記 (uml.org.cn)
http://uml.org.cn/zjjs/201307151.asp
邏輯架構(gòu)和物理架構(gòu)在架構(gòu)設(shè)計中的應(yīng)用 (uml.org.cn)
http://www.uml.org.cn/zjjs/200906045.asp
軟件架構(gòu)設(shè)計 (uml.org.cn)
http://www.uml.org.cn/zjjs/201107193.asp
《軟件架構(gòu)》總覽 | 并發(fā)編程網(wǎng) – ifeve.com
http://ifeve.com/%E3%80%8A%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E3%80%8B%E6%80%BB%E8%A7%88/
公眾號二維碼
End:如果有興趣了解金融量化交易和其他數(shù)據(jù)分析的實用技術(shù),歡迎關(guān)注本公眾號
