當前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]軟件架構(gòu)模式本文是我在閱讀O'Reilly免費的電子書?Software Architecture Patterns過程中做的筆記。首先這本書非常新,2015年3月30號訂正后發(fā)布。其次將目前流行的幾

軟件架構(gòu)模式


本文是我在閱讀O'Reilly免費的電子書?Software Architecture Patterns過程中做的筆記。
首先這本書非常新,2015年3月30號訂正后發(fā)布。其次將目前流行的幾種架構(gòu)詳細進行了剖析和比較,除了傳統(tǒng)的N層架構(gòu)外,其它架構(gòu)相當?shù)那把?。并且,這篇小書連帶封面才55頁,短小精悍,值得一讀。這本書的作者是 Mark Richards,有30多年行業(yè)經(jīng)驗,19年軟件集成,企業(yè)級架構(gòu)的經(jīng)驗,大部分是Java平臺,也出版了多本書和論文。

如果你沒有時間去閱讀這本書,那么不妨看一下本篇文章。 我在筆記中將書中的主要知識點都記錄下來。

不先進行正式的架構(gòu)設(shè)計就直接開發(fā)對于程序員來說再普通不過了。沒有清晰和很好的架構(gòu)設(shè)計,大部分程序員和架構(gòu)師實際上會采用傳統(tǒng)的分層的架構(gòu)模式, 自然地將代碼模塊分隔成幾個包(package)。不幸地是,這種做法經(jīng)常導(dǎo)致未能好好組織代碼模塊,這些模塊缺乏清晰的角色,責任以及相互關(guān)系。這經(jīng)常被成為大泥球反模式。

沒有進行架構(gòu)設(shè)計的應(yīng)用程序通常是緊耦合的,玻璃心,難以改變,沒有頭緒。如果不理解應(yīng)用的各個組件的內(nèi)部工作方式的話很難看清它的架構(gòu)特征。關(guān)于部署和維護的問題都很難回答:架構(gòu)的規(guī)模如何?程序的性能如何?程序容易修改嗎?程序的部署模型是怎么樣?程序的響應(yīng)如何?

架構(gòu)模式可以幫助你定義程序的基本特征和行為。例如一些架構(gòu)模式很自然讓程序成為大規(guī)模(scalable)的程序。有些模式讓程序變得靈巧敏捷(agile)。知道這些架構(gòu)的特征,優(yōu)點和缺點,你就可以根據(jù)你特定的業(yè)務(wù)需求和目標從容的選擇一種架構(gòu)模式。

作為一位架構(gòu)師,你總會為自己架構(gòu)選擇做解釋,尤其你選擇一個特別的架構(gòu)模式的時候。O'Reilly的這本書提供了充足的信息來為你的架構(gòu)選擇提供證明。

分層架構(gòu) (Layered Architecture)

它是最通用的架構(gòu),也被叫做N層架構(gòu)模式(n-tier architecture pattern)。這也是Java EE應(yīng)用經(jīng)常采用的標準模式?;旧鲜莻€程序員都知道它。這種架構(gòu)模式非常適合傳統(tǒng)的IT通信和組織結(jié)構(gòu),很自然地成為大部分應(yīng)用的第一架構(gòu)選擇。

模式描述

在分層架構(gòu)中的組件被劃分成幾個層,每個層代表應(yīng)用的一個功能。分層架構(gòu)本身沒有規(guī)定要分成多少層,大部分的應(yīng)用會分成表現(xiàn)層,業(yè)務(wù)層,持久層和數(shù)據(jù)庫層。小的應(yīng)用有時候會將業(yè)務(wù)層和持久層合在一起,更大規(guī)模的應(yīng)用可能會劃分更多的層,比如調(diào)用外部服務(wù)的層。

每一層都有特定的角色和職能。

分層架構(gòu)的一個特性就是關(guān)注分離(separation of concerns)。在層中的組件只負責本層的邏輯。組件的劃分很容易讓它們實現(xiàn)自己的角色和職責,也比較容易地開發(fā),測試管理和維護。

關(guān)鍵概念

注意每一層都是封閉的。這意味著Request必須經(jīng)過每一層才能到達最底下一層。

為什么不允許展示層直接訪問數(shù)據(jù)庫層呢,這樣不是更快嗎?這就是分層架構(gòu)的另一個特征:層隔離(layers of isolation)。
層隔離的概念意味著你對任何一層的改變都不會影響其它層。這很好理解。
層隔離也意味著一個層的組件并不會了解其它層的實現(xiàn),或者知道很少。 比如業(yè)務(wù)層不需知道你持久層是由hibernate還是mybatis實現(xiàn)的。
分層架構(gòu)也很容易增加新的層。 比如你想將一些通用的服務(wù)重構(gòu)成一個服務(wù)層,比如通用圖片處理,遠程賬戶審計等,可以在業(yè)務(wù)層下增加一個服務(wù)層。它不會對展示層造成影響,也不會改變持久層的代碼。
上面的這個例子帶來一個問題,因為每一層丟失封閉的,業(yè)務(wù)層不得不通過服務(wù)層訪問持久層,這沒有天理啊。 所以有時候你會創(chuàng)建一個開放的層。這意味著上一層可以繞過這一層直接訪問下一層。

架構(gòu)例子

我們看一下淘寶前幾年的架構(gòu)的例子。

這是一個標準的分層的架構(gòu)。每一層中又可以詳細的分成更細的層,比如服務(wù)層。

圍著著這個主架構(gòu)還有一些外圍的產(chǎn)品。比如監(jiān)控和審計。

架構(gòu)考量

分層架構(gòu)是一個可靠的通用的架構(gòu),對很多應(yīng)用來說,如果你不確定哪種架構(gòu)適合你的應(yīng)用,可以用它作為一個初始架構(gòu)。
第一個要注意的是污水池反模式(architecture sinkhole anti-pattern).這個反模式是這樣的,請求流簡單的穿過幾個層,每層里面基本沒有做任何業(yè)務(wù)邏輯,或者做了很少的業(yè)務(wù)邏輯。比如一些JavaEE例子,業(yè)務(wù)邏輯層只是簡單的調(diào)用了持久層的接口,本身沒有什么業(yè)務(wù)邏輯。
每一層或多或少都有可能遇到這樣的場景。關(guān)鍵是分析這樣的請求的百分比是多少。80-20原則可以幫助你決定是否正在遇到污水池反模式。如果你的請求超過20%,你應(yīng)該考慮讓一些層變成開放的。
另一個需要考慮的是分層架構(gòu)可能會讓你的應(yīng)用變得龐大,即使你的展示層和業(yè)務(wù)層可以獨立發(fā)布(比如展示層使用單頁技術(shù)框架AngularJS, EmberJS)。
它的確會帶來一些潛在的問題,比如分布模式復(fù)雜,健壯性下降,可靠性,性能和規(guī)模等。

模式分析

總體靈活性: 低
發(fā)布易用性: 低
可測試性: 高
性能: 低
規(guī)模擴展性: 低
開發(fā)容易度: 高

事件驅(qū)動架構(gòu) (Event-Driven Architecture)

事件驅(qū)動架構(gòu)是一個流行的分布式異步架構(gòu)模式,可以用來設(shè)計規(guī)模很大的應(yīng)用程序?;谶@種架構(gòu)模式應(yīng)用可大可小。它由高度解耦的,單一目的的事件處理組件組成,可以異步地接收和處理事件。
它包括兩個主要的拓撲結(jié)構(gòu):mediator 和 broker。Mediator拓撲結(jié)構(gòu)需要你在一個事件通過mediator時精心安排好幾個步驟,而broker拓撲結(jié)構(gòu)無需mediator,而是由你串聯(lián)起幾個事件。這兩種拓撲架構(gòu)的特征和實現(xiàn)有很大的不同,所以你需要知道哪一個適合你。

Mediator拓撲結(jié)構(gòu)

Mediator拓撲結(jié)構(gòu)適合有多個步驟的事件,需要安排處理層次。
例如購買一只股票,首先會校驗這個交易,校驗股票交易是否符合各種規(guī)定,將它交給一個經(jīng)紀人,計算傭金,最后確認交易。所有這些都安排好各個步驟的順序,決定它們是否串行還是并行。
它包括四個組件:event queues, an event mediator, event channels 和 event processors。

事件流是這樣開始的: 客戶端發(fā)送一個事件到事件隊列(event queues)中,它用來將事件傳送給event mediator。Event mediator收到初始的事件后,會發(fā)送額外的一些異步事件給event channels來執(zhí)行處理的每個步驟。Event processors監(jiān)聽event channels,接收事件并處理一些業(yè)務(wù)邏輯。
在事件驅(qū)動架構(gòu)中有十幾個甚至幾百個事件隊列都很正常。模式本身沒有限定事件隊列的實現(xiàn)方式。它可能是一個消息隊列,一個web service或者其它。
這里有兩種事件:初始事件和處理事件。Mediator會將初始事件編排成處理事件。它沒有具體的業(yè)務(wù)邏輯,只是一個協(xié)調(diào)者,負責將初始事件轉(zhuǎn)化成一個或者多個處理事件。
event channels 既可以是消息隊列,也可以是消息topic,大部分是消息topic,這樣可以由多個消息處理器(event processor)處理同一個消息。
消息處理器包含實際的業(yè)務(wù)邏輯。每個消息處理器都是自包含的,獨立的,高度解耦的,執(zhí)行單一的任務(wù)。
這種模式可能有一些變種。作為架構(gòu)師,你應(yīng)該理解每個實現(xiàn)的細節(jié),確保這種解決方案適合你的需求。
有一些開源的框架實現(xiàn)了這種架構(gòu),如Spring Integration, Apache Camel, 或者 Mule ESB。

Broker拓撲架構(gòu)

Broker不同于上面的結(jié)構(gòu),它沒有中心的Mediator。所有的事件串聯(lián)起來通過一個輕量級的消息broker如RabbitMQ,ActiveMQ,HornetQ等。如果你的消息比較簡單,不需要重新編排,就可以使用這種結(jié)構(gòu)。

如圖所示,它包含兩個組件broker和 event processor。
broker中的event channel可以是消息隊列,消息topic或者它們的復(fù)合形式。
每個event processor負責處理事件,發(fā)布新的事件。

架構(gòu)例子


在新浪微博的早期架構(gòu)中,微博發(fā)布使用同步推模式,用戶發(fā)表微博后系統(tǒng)會立即將這條微博插入到數(shù)據(jù)庫所有粉絲的訂閱列表中,當用戶量比較大時,特別是明星用戶發(fā)布微博時,會引起大量的數(shù)據(jù)庫寫操作,超出數(shù)據(jù)庫負載,系統(tǒng)性能急劇下降,用戶響應(yīng)延遲加劇。后來新浪微博改用異步推拉結(jié)合的模式,用戶發(fā)表微博后系統(tǒng)將微博寫入消息隊列后立即返回,用戶響應(yīng)迅速,消息隊列消費者任務(wù)將微博推送給所有當前在線粉絲的訂閱列表中,非在線用戶登錄后再根據(jù)關(guān)注列表拉取微博訂閱列表。

架構(gòu)考量

事件驅(qū)動架構(gòu)模式實現(xiàn)起來相對復(fù)雜,主要是由于它的異步和分布式特性。這可能會帶來一些分布式的問題,比如遠程處理的可用性,缺乏響應(yīng),broker重連等問題。
一個考慮是這種模式對于單一的邏輯缺乏原子事務(wù)。所以你需要將原子事務(wù)交給一個事件處理器執(zhí)行,跨事件處理器的原子事務(wù)是很困難的。
最困難的設(shè)計之一是事件處理器的創(chuàng)建,維護和管理。事件通常有特殊的約定(數(shù)據(jù)值和格式)。

模式分析

總體靈活性: 高
發(fā)布易用性: 高
可測試性: 低
性能: 高
規(guī)模擴展性: 高
開發(fā)容易度: 低

微內(nèi)核架構(gòu) (Microkernel Architecture)

微內(nèi)核架構(gòu)模式通常又被成為插件架構(gòu)模式,可以用來實現(xiàn)基于產(chǎn)品的應(yīng)用, 比如Eclipse,在微內(nèi)核的基礎(chǔ)上添加一些插件,就可以提供不同的產(chǎn)品,如C++, Java等。

模式描述

微內(nèi)核包含兩個組件: core system 和 plug-in modules。應(yīng)用邏輯被分隔成核心系統(tǒng)和插件模塊,可以提供可擴展的,靈活的,特性隔離的功能。

模式例子

Eclipse IDE是當之無愧的微內(nèi)核的絕佳例子之一。

架構(gòu)考量

微內(nèi)核的架構(gòu)模式可以嵌入到其它的架構(gòu)模式之中。微內(nèi)核架構(gòu)通過插件還可以提供逐步演化的功能和增量開發(fā)。所以如果你要開發(fā)基于產(chǎn)品的應(yīng)用,微內(nèi)核是不二選擇。

模式分析

總體靈活性: 高
發(fā)布易用性: 高
可測試性: 高
性能: 高
規(guī)模擴展性: 低
開發(fā)容易度: 低

微服務(wù)架構(gòu)

作為單一整體的程序和面向服務(wù)架構(gòu)的替代者, 微服務(wù)架構(gòu)模式在工業(yè)界很快贏得了地位。這種模式還在進化之中,在業(yè)界對于它的特性和實現(xiàn)還有些困惑。Oreilly的小書提供了這種模式關(guān)鍵的概念和基礎(chǔ)知識,用來判斷這種架構(gòu)是否適合你的應(yīng)用。

模式描述

不管你使用何種實現(xiàn)風(fēng)格和拓撲,有幾個通用的核心概念應(yīng)用在這種架構(gòu)模式上。首先是分隔發(fā)布單元(separately deployed units)。

如圖所示,每一個微內(nèi)核的組件都被分隔成一個獨立的單元。
微服務(wù)包含服務(wù)組件(service component)。不要考慮微內(nèi)核的單個服務(wù),而是最好考慮服務(wù)組件,從粒度上講它可以是單一的模塊或者一個一個大的應(yīng)用程序,代表單一功能(提供天氣預(yù)報或者圖片存儲)。
正確設(shè)計服務(wù)組件的粒度是一個很大的挑戰(zhàn)。
另一個關(guān)鍵概念是微內(nèi)核是分布式的。這意味著服務(wù)組件可能是遠程方法(通過JMS, AMQP, REST, SOAP, RMI......等等)。分布式意味著這種模式可以建立大規(guī)模的應(yīng)用。
另一個值得興奮的特性是它可以從其它有問題的架構(gòu)模式中演化出來,而不是直接創(chuàng)建出來等待問題發(fā)生。當你遇到一些無法解決的問題,特別是互聯(lián)網(wǎng)企業(yè)的規(guī)模擴大時,是很好的引入微服務(wù)架構(gòu)的時機。
一般會從兩個模式中演化。
一種就是一開始就是整體的應(yīng)用,所有的模塊都是緊耦合的。另外一種是面向服務(wù)的架構(gòu)模式(SOA,service-oriented architecture pattern)。SOA不是不好,但是太昂貴了,不好理解和實現(xiàn)。

模式拓撲

有很多實現(xiàn)微服務(wù)的方式。最通用最流行的三個方式是: API REST-based, applicaiton REST-based 和 中心化的消息。
API REST-based 適合網(wǎng)站提供小規(guī)模的,自包含的服務(wù)。很多互聯(lián)網(wǎng)網(wǎng)站都提供這樣的服務(wù),比如OAuth2服務(wù)。

application REST-based不同于上面的架構(gòu),客戶端看到的是web界面或者富客戶端程序,而不是調(diào)用API。UI層獨立發(fā)布,可以訪問服務(wù)組件。

中心消息模式,它類似前面的模式,但是使用一個輕量級的消息broker取代RESTful的服務(wù)調(diào)用。這個輕量級的broker不會執(zhí)行服務(wù)的編排,傳輸和路由,這和SOA不同,不要把它看作SOA的簡化版。

架構(gòu)考量

微服務(wù)架構(gòu)解決了無架構(gòu)的整體編碼的應(yīng)用的問題以及SOA的問題。同時它還可以提供實時的產(chǎn)品發(fā)布。
它是一個分布式架構(gòu),也會有上面分布式的問題。

模式分析

總體靈活性: 高
發(fā)布易用性: 高
可測試性: 高
性能: 低
規(guī)模擴展性: 高
開發(fā)容易度: 高

基于空間的架構(gòu) (Space-Based Architecture)

基于空間的架構(gòu)有時候也被成為基于云的架構(gòu)。
大部分的基于web的應(yīng)用的業(yè)務(wù)流都是一樣的。 客戶端的請求發(fā)送給web服務(wù)器,然后是應(yīng)用服務(wù)器,最后是數(shù)據(jù)庫服務(wù)器。對于用戶很小時不會有問題,但是負載增大時就會遇到瓶頸(想想搶火車票)。首先是web服務(wù)器撐不住,web服務(wù)器能撐住應(yīng)用服務(wù)器又不行,然后是數(shù)據(jù)庫服務(wù)器。通常解決方案是增加web服務(wù)器,便宜,簡單,但很多情況下負載會傳遞給應(yīng)用服務(wù)器,然后傳遞給數(shù)據(jù)庫服務(wù)器。有時候增加數(shù)據(jù)庫服務(wù)器也沒有辦法,因為數(shù)據(jù)庫也有鎖,有事務(wù)的限制。
基于空間的架構(gòu)用來解決規(guī)模和并發(fā)的問題。

模式描述

基于空間的架構(gòu)最小化限制應(yīng)用規(guī)模的影響。這個模式來自于tuple space, 分布式共享內(nèi)存想法。要想大規(guī)模,就要移除中心數(shù)據(jù)庫的限制,使用可復(fù)制的內(nèi)存網(wǎng)格。應(yīng)用數(shù)據(jù)保存在所有活動的處理單元的內(nèi)存中,處理單元根據(jù)應(yīng)用規(guī)??梢约尤牒鸵瞥?。因為沒有中心數(shù)據(jù)庫,所以數(shù)據(jù)庫的瓶頸可以解決。
這種模式有兩個組件:處理單元processing unit 和 虛擬化中間件virtualized middleware。

處理單元包含應(yīng)用程序。小的應(yīng)用程序可以使用一個處理單元,大的應(yīng)用程序可以被分隔成幾個處理單元。處理單元還包括數(shù)據(jù)網(wǎng)格。
虛擬化中間件負責管理和通信。處理數(shù)據(jù)的同步和請求。

模式考量

基于空間的架構(gòu)是一個復(fù)雜而昂貴的模式。對于小型的負載可變的web應(yīng)用很適合,但是對于大型的關(guān)系型數(shù)據(jù)庫應(yīng)用不是太適合。

模式分析

總體靈活性: 高
發(fā)布易用性: 高
可測試性: 低
性能: 高
規(guī)模擴展性: 高
開發(fā)容易度: 低

附錄A

模式分析比較


原文鏈接:http://colobu.com/2015/04/08/software-architecture-patterns/


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉