【笔记】常见的架构风格
目錄1. 傳統的架構風格1.1. 數據流風格1.2. 調用/返回風格1.3. 獨立構件風格1.4. 虛擬機1.5. 倉庫風格2. 基于連接件的架構風格劃分2.1. 數據流風格2.2. 調用/返回風格2.3. 獨立構件風格2.3.1. 思考2.3.2. C2風格(Component and Connector)3. 基于場景的架構風格劃分4. 特定領域架構模型
風格即模式:3類基本的架構風格(數據流、調用返回、獨立構件); 應用場景模型:我們平常說的“架構”概念,是一種場景模型,常用于解決特定的問題。
腦圖鏈接:軟件架構
軟件體系結構風格是描述某一特定應用領域中系統組織方式的慣用模式。體系結構風格定義一個系統家族,即一個體系結構定義一個詞匯表和一組約束。詞匯表中包含一些構件和連接件類型,而這組約束指出系統是如何將這些構件和連接件組合起來的。也就是說,架構體系都是以“構件”的思路進行軟件實現的。
體系結構風格反映了領域中眾多系統所共有的結構和語義特性,并指導如何將各個模塊和子系統有效地組織成一個完整的系統。對軟件體系結構風格的研究和實踐促進對設計的重用,一些經過實踐證實的解決方案也可以可靠地用于解決新的問題。例如,如果某人把系統描述為“客戶/服務器”模式,則不必給出設計細節,立刻就會明白系統是如何組織和工作的。
1. 傳統的架構風格
依據David Calvert在1996年給出了一份架構風格/模式的清單,架構風格包括了:
數據流系統——批處理,管道-過濾器。
調用-返回系統——主程序和子程序,面向對象系統,分層。
獨立組件——通信過程,事件系統。
虛擬機——解釋器,基于規則的系統。
以數據為中心的系統(倉庫)——數據庫,超文本系統,黑板。
1.1. 數據流風格
面向數據的架構風格,軟件的處理粒度是赤裸裸的“數據”,而不需對數據進行任何的“包裝”。
批處理序列
組件為一系列固定順序的計算單元(獨立程序),組件間只通過數據傳遞交互。數據計算單元的執行必須在前一單元完全結束后才能開始,數據以整體的方式傳遞。
管道/過濾器
每個構件都有一組輸入和輸出,構件讀取輸入的數據流,經過內部處理,然后產生輸出數據流。這個過程通常通過對輸入流的變換及增量計算來完成,包括通過計算和增加信息豐富數據,通過濃縮和刪除精煉數據,通過改變記錄方式轉化數據,遞增地轉化數據等。在輸入被完全消費之前,輸出便產生了。這里構件被稱為過濾器,連接件就是數據流傳輸的管道,將一個過濾器的輸出傳到另一個過濾器的輸入。
此風格要求過濾器必須是獨立的實體,它不能與其它的過濾器共享數據,而且一個過濾器不知道它上游和下游的標識。一個管道/過濾器網絡輸出的正確性并不依賴于過濾器進行增量計算過程的順序。
總結
優勢:
使得軟構件具有良好的隱蔽性和高內聚、低耦合的特點;
構件之間的組合、重用十分簡單,易于拼接成業務功能塊;
限制:
不適合處理交互的應用。由于業務功能塊是按照結構化的流程設計的,所以只適用于處理特定的邏輯流程。當需要增量地顯示改變時,這個問題尤為嚴重。
數據由于沒有任何封裝,傳輸上沒有通用的標準,每個過濾器都增加了解析和合成數據的工作,這樣就導致了系統性能下降,并增加了編寫過濾器的復雜性。
1.2. 調用/返回風格
主程序 & 子程序
采用單線程控制,把問題劃分為若干處理步驟,構件即為主程序和子程序。子程序通??珊铣蔀槟K。過程調用作為交互機制,即充當連接件。調用關系具有層次性,其語義邏輯表現為子程序的正確性,取決于它調用的子程序的正確性。
面向對象
這種風格的構件是對象。對象是抽象數據類型的實例。在抽象數據類型中,數據的表示和它們的相應操作被封裝起來。對象的行為體現在其接受和請求的動作。連接件即對象間交互的方式,對象是通過函數和過程的調用來交互的。這種結構風格中包含有封裝、交互、多態、集成和重用等特征。
層次結構
層次系統組織成一個層次結構。連接件通過決定層間如何交互的協議來定義,拓撲約束包括對相鄰導間交互的約束。這個風格將大的問題分解為若干個漸進的小問題,逐步解決,隱藏了很多復雜度。修改一層,最多影響兩層,而通常只能影響上層。上層必須知道下層的身份,不能調整層次之間的順序。
優點:
支持基于抽象程度遞增的系統設計,使設計者可以把一個復雜系統按遞增的步驟進行分解;
支持重用。只要提供的服務接口定義不變,同一層的不同實現可以交換使用。
1.3. 獨立構件風格
面向消息的通訊架構(進程間通信)
構件是獨立的過程,連接件是消息傳遞。這種風格的特點是構件通常是命名過程(進程),消息傳遞的方式可以是點到點、異步和同步方式及遠過程調用(RPC)等。在這種架構中,消息的傳遞目標是顯式聲明的——明確指向另外一個構件。
事件驅動架構
構件不直接調用一個過程,而是觸發或廣播一個或多個事件。系統中其他構件中的過程在一個或多個事件中注冊,當一個事件被觸發,系統自動調用在這個事件中注冊的處理機制。一個事件的觸發就導致了另一個模塊中過程的調用——這本身屬于一種異步機制的實現(實際上有些事件的響應是以同步方式實現的)。
從體系結構上說,這種風格的構件是一些模塊,這些模塊既可以是一些過程,又可以是一些事件的集合。過程可以用通用的方式調用,也可以在系統事件中注冊一些過程,當發生這些事件時,過程被調用。
構件之間交互的連接件往往是以過程之間的隱式調用(Implicit Invocation)來實現的?;谑录碾[式調用風格的主要優點是為軟件重用提供了強大的支持,為構件的維護和演化帶來了方便;其缺點是構件放棄了對系統計算的控制。
優點:
為軟件重用提供了強大的支持。當需要將一個構件加入現存系統中時,只需將它注冊到系統的事件中,十分靈活。
缺點:
構件放棄了對系統計算的控制。一個構件觸發一個事件時,不能確定其它構件是否會響應它。而且即使它知道事件注冊了哪些構件的構成,它也不能保證這些過程被調用的順序;
既然過程的語義必須依賴于被觸發事件的上下文約束。
1.4. 虛擬機
解釋器
一個解釋器通常包括完成解釋工作的解釋引擎,一個包含將被解釋的代碼的存儲區,一個記錄解釋引擎當前工作狀態的數據結構,以及一個記錄源代碼被解釋執行的進度的數據結構。具有解釋器風格的軟件中含有一個虛擬機,可以仿真硬件的執行過程和一些關鍵應用;其缺點是執行效率較低。
基于規則的系統
基于規則的系統包括規則集、規則解釋器、規則/數據選擇器及工作內存。
1.5. 倉庫風格
在倉庫風格中,有兩種不同的構件:中央數據結構(倉庫)說明當前狀態,獨立構件在中央數據存貯上執行。
數據庫架構(共享數據)
數據庫架構是倉庫風格最常見的形式。構件主要有兩大類,一個是中央共享數據源,保存當前系統的數據狀態;另一個是多個獨立處理元素,處理元素對數據元素進行操作。例如二層C/S架構中不同的服務項對服務數據庫的訪問模型。
黑板架構
黑板架構包括知識源、黑板和控制3個部分。
知識源包括若干獨立計算的不同單元,提供解決問題的(與應用程序相關的)知識,知識源響應黑板上的變化,也只修改黑板 ==> 獨立算法模塊;
黑板是一個全局數據庫,包含問題域解空間的全部狀態。黑板數據是按照與應用程序相關的層次來組織的解決問題的數據,知識源通過不斷地改變黑板數據來解決問題。
控制邏輯:控制完全由黑板的狀態驅動,黑板狀態的改變決定使用的特定知識。
黑板通常應用在對于解決問題沒有確定性算法的系統中,例如信號處理、問題規劃及編譯器優化等軟件系統的設計中。
超文本系統
構件以網狀連接方式相互連接,用戶可以在構件之間進行按照人類的聯想思維方式任意跳轉到相關構件。超文本是一種非線性的網狀信息組織方法,它以結點為基本單位,鏈作為結點之間的聯想式關聯。超文本系統通常應用在互聯網領域。
不同的人劃分過不同的架構模型,而每每覺得,如果拿來兩本書中所描述的架構模型,他們說的完全不在一個維度上,因為分類方式不同,得到的結果也不同,甚至同一套模型,在兩本書里也得到了不同的名字……
我梳理了自己目前所理解到的所有架構模型,并按照自己的理解程度,重新進行了分類得到了一組架構圖,現在寫下了。希望大家能多提意見。我不一定完全贊同你們的觀點,但真理總是越辯越清,辯論不傷和氣,只為共同進步!
2. 基于連接件的架構風格劃分
前面已經提到,“架構”是一種基于“組件”的軟件體系模型。在這個模型中,存在兩類基本的元素:構件 + 連接件。很明確的,構件是計算單元(實體);而連接件則存在多種的形式——構件間如何實現連接和交互,是各種架構在處理問題上的本質區別(或者說是問題模型的區別)。
2.1. 數據流風格
連接件即為傳輸的數據,而構件之間只通過數據傳遞交互。“管道/過濾器”風格相比于“批處理”,其連接件(即“管道”)是以流的形式傳輸的數據,而不是一個完整的數據體。
2.2. 調用/返回風格
過程調用作為交互機制,即充當連接件的角色。構件之間通過主動或被動的顯示調用執行交互。
主程序/子程序風格中,構件即為主程序和子程序。面向對象更沒的說,構件即為不同的對象。而分層架構模型則是將不同層次的功能集合作為構件,構件間通過接口調用,實現交互。
還有兩種流行的架構模式,也可以劃歸到“主程序-子程序”的返回/調用風格中——“插件式”的微內核架構和RPC(遠程過程調用)。
主程序/子程序的架構風格一般是通過本地管道執行調用,插件架構通過系統級調用插件模塊,RPC執行調用的方式是通過socket。連接件實現通信的方式可能不同,但在宏觀上,他們都在調用其他模塊的已有功能塊。
2.3. 獨立構件風格
連接件是消息或事件,以顯示或隱式的方式在構件間傳遞交互。
“進程通信”架構中,構件通常是命名過程(所謂過程,即功能實現,可以是函數、程序體或類對象),連接件是消息傳遞,傳遞方式可以是點對點、同步或異步的方式,以及RPC遠程過程(方法)調用等。
事件驅動的系統,也稱為“基于事件的隱式調用”架構,構件不直接調用一個過程,而是觸發或廣播一個或多個事件。連接件即為事件(消息的一種表現形式)。之所以成為事件,是因為它會自動觸發其他構件的處理動作,改變構件的狀態和行為。從宏觀上看,構件之間是通過“隱式調用”實現交互的。
2.3.1. 思考
個人認為,“獨立構架風格”已經帶有很強的“場景”適用性了——由于獨立構件風格中的連接件是以“消息或事件”的形式存在的,而一般情況下進程內部很少(或者說非必須)通過消息傳遞信號【當然這也不一定,如果需要多個層次或對象間的調用,比如GUI中的事件機制】,往往“獨立架構”風格是用在進程間或分布式環境中的通訊機制上的。
2.3.2. C2風格(Component and Connector)
C2是針對通信領域的一種場景架構模型。C2架構應該說是對獨立架構的一種拓展,或是重新定義——它以“消息”的概念替代了傳統意義上的連接件,同時將消息處理節點從構件中獨立出來作為一種基本類型,稱為“連接件”。
構件:消息處理的實體;
消息:包括通知消息和請求消息,分別以自上而下和自下而上的方式傳遞;
連接件:負責消息路由與廣播,同時也對消息進行過濾。
另外,它還定義了構件與連接件的交互規則,如下圖所示:
而這種交互方式,同“基于消息的進程間通訊架構”和“事件驅動架構”一樣,幾乎定格成了一種默認形式,在所有的通訊體系中都有所應用。故而稱之為“風格”也不為過。
3. 基于場景的架構風格劃分
相比于特定領域架構模型,它沒有特定的問題域,而是在不同的領域中,可能存在共性的應用場景,大致可分為虛擬機、倉庫、C2、微內核等架構風格。
4. 特定領域架構模型
常見的領域包括:分布式、消息通信、WebService、企業級架構等。
總結
以上是生活随笔為你收集整理的【笔记】常见的架构风格的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phpMyAdmin - Error
- 下一篇: 奇淫技巧