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