![軟件架構模式_第1頁](http://file4.renrendoc.com/view/93acaa6f12f907244d505dda47a58529/93acaa6f12f907244d505dda47a585291.gif)
![軟件架構模式_第2頁](http://file4.renrendoc.com/view/93acaa6f12f907244d505dda47a58529/93acaa6f12f907244d505dda47a585292.gif)
![軟件架構模式_第3頁](http://file4.renrendoc.com/view/93acaa6f12f907244d505dda47a58529/93acaa6f12f907244d505dda47a585293.gif)
![軟件架構模式_第4頁](http://file4.renrendoc.com/view/93acaa6f12f907244d505dda47a58529/93acaa6f12f907244d505dda47a585294.gif)
![軟件架構模式_第5頁](http://file4.renrendoc.com/view/93acaa6f12f907244d505dda47a58529/93acaa6f12f907244d505dda47a585295.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 軟件架構模式不先進行正式的架構設計就直接開發(fā)對于程序員來說再普通不過了。沒有清晰和很好的架構設計,大部分程序員和架構師實際上會采用傳統(tǒng)的分層的架構模式, 自然地將代碼模塊分隔成幾個包(package)。不幸地是,這種做法經常導致未能好好組織代碼模塊,這些模塊缺乏清晰的角色,責任以及相互關系。這經常被成為大泥球反模式。沒有進行架構設計的應用程序通常是緊耦合的,玻璃心,難以改變,沒有頭緒。如果不理解應用的各個組件的內部工作方式的話很難看清它的架構特征。關于部署和維護的問題都很難回答:架構的規(guī)模如何?程序的性能如何?程序容易修改嗎?程序的部署模型是怎么樣?程序的響應如何?架構模式可以幫助你定義程序
2、的基本特征和行為。例如一些架構模式很自然讓程序成為大規(guī)模(scalable)的程序。有些模式讓程序變得靈巧敏捷(agile)。知道這些架構的特征,優(yōu)點和缺點,你就可以根據你特定的業(yè)務需求和目標從容的選擇一種架構模式。作為一位架構師,你總會為自己架構選擇做解釋,尤其你選擇一個特別的架構模式的時候。OReilly的這本書提供了充足的信息來為你的架構選擇提供證明。分層架構 (Layered Architecture)它是最通用的架構,也被叫做N層架構模式(n-tier architecture pattern)。這也是Java EE應用經常采用的標準模式?;旧鲜莻€程序員都知道它。這種架構模式非常適
3、合傳統(tǒng)的IT通信和組織結構,很自然地成為大部分應用的第一架構選擇。模式描述在分層架構中的組件被劃分成幾個層,每個層代表應用的一個功能。分層架構本身沒有規(guī)定要分成多少層,大部分的應用會分成表現(xiàn)層,業(yè)務層,持久層和數(shù)據庫層。小的應用有時候會將業(yè)務層和持久層合在一起,更大規(guī)模的應用可能會劃分更多的層,比如調用外部服務的層。每一層都有特定的角色和職能。分層架構的一個特性就是關注分離(separation of concerns)。在層中的組件只負責本層的邏輯。組件的劃分很容易讓它們實現(xiàn)自己的角色和職責,也比較容易地開發(fā),測試管理和維護。關鍵概念注意每一層都是封閉的。這意味著Request必須經過每一層
4、才能到達最底下一層。為什么不允許展示層直接訪問數(shù)據庫層呢,這樣不是更快嗎?這就是分層架構的另一個特征:層隔離(layers of isolation)。層隔離的概念意味著你對任何一層的改變都不會影響其它層。這很好理解。層隔離也意味著一個層的組件并不會了解其它層的實現(xiàn),或者知道很少。 比如業(yè)務層不需知道你持久層是由hibernate還是mybatis實現(xiàn)的。分層架構也很容易增加新的層。 比如你想將一些通用的服務重構成一個服務層,比如通用圖片處理,遠程賬戶審計等,可以在業(yè)務層下增加一個服務層。它不會對展示層造成影響,也不會改變持久層的代碼。上面的這個例子帶來一個問題,因為每一層丟失封閉的,業(yè)務層不
5、得不通過服務層訪問持久層,這沒有天理啊。 所以有時候你會創(chuàng)建一個開放的層。這意味著上一層可以繞過這一層直接訪問下一層。架構例子我們看一下淘寶前幾年的架構的例子。這是一個標準的分層的架構。每一層中又可以詳細的分成更細的層,比如服務層。圍著著這個主架構還有一些外圍的產品。比如監(jiān)控和審計。架構考量分層架構是一個可靠的通用的架構,對很多應用來說,如果你不確定哪種架構適合你的應用,可以用它作為一個初始架構。第一個要注意的是污水池反模式(architecture sinkhole anti-pattern).這個反模式是這樣的,請求流簡單的穿過幾個層,每層里面基本沒有做任何業(yè)務邏輯,或者做了很少的業(yè)務邏輯
6、。比如一些JavaEE例子,業(yè)務邏輯層只是簡單的調用了持久層的接口,本身沒有什么業(yè)務邏輯。每一層或多或少都有可能遇到這樣的場景。關鍵是分析這樣的請求的百分比是多少。80-20原則可以幫助你決定是否正在遇到污水池反模式。如果你的請求超過20%,你應該考慮讓一些層變成開放的。另一個需要考慮的是分層架構可能會讓你的應用變得龐大,即使你的展示層和業(yè)務層可以獨立發(fā)布(比如展示層使用單頁技術框架AngularJS, EmberJS)。它的確會帶來一些潛在的問題,比如分布模式復雜,健壯性下降,可靠性,性能和規(guī)模等。模式分析總體靈活性: 低發(fā)布易用性: 低可測試性: 高性能: 低規(guī)模擴展性: 低開發(fā)容易度:
7、高事件驅動架構 (Event-Driven Architecture)事件驅動架構是一個流行的分布式異步架構模式,可以用來設計規(guī)模很大的應用程序?;谶@種架構模式應用可大可小。它由高度解耦的,單一目的的事件處理組件組成,可以異步地接收和處理事件。它包括兩個主要的拓撲結構:mediator 和 broker。Mediator拓撲結構需要你在一個事件通過mediator時精心安排好幾個步驟,而broker拓撲結構無需mediator,而是由你串聯(lián)起幾個事件。這兩種拓撲架構的特征和實現(xiàn)有很大的不同,所以你需要知道哪一個適合你。Mediator拓撲結構Mediator拓撲結構適合有多個步驟的事件,需要
8、安排處理層次。例如購買一只股票,首先會校驗這個交易,校驗股票交易是否符合各種規(guī)定,將它交給一個經紀人,計算傭金,最后確認交易。所有這些都安排好各個步驟的順序,決定它們是否串行還是并行。它包括四個組件:event queues, an event mediator, event channels 和 event processors。事件流是這樣開始的: 客戶端發(fā)送一個事件到事件隊列(event queues)中,它用來將事件傳送給event mediator。Event mediator收到初始的事件后,會發(fā)送額外的一些異步事件給event channels來執(zhí)行處理的每個步驟。Event p
9、rocessors監(jiān)聽event channels,接收事件并處理一些業(yè)務邏輯。在事件驅動架構中有十幾個甚至幾百個事件隊列都很正常。模式本身沒有限定事件隊列的實現(xiàn)方式。它可能是一個消息隊列,一個web service或者其它。這里有兩種事件:初始事件和處理事件。Mediator會將初始事件編排成處理事件。它沒有具體的業(yè)務邏輯,只是一個協(xié)調者,負責將初始事件轉化成一個或者多個處理事件。event channels 既可以是消息隊列,也可以是消息topic,大部分是消息topic,這樣可以由多個消息處理器(event processor)處理同一個消息。消息處理器包含實際的業(yè)務邏輯。每個消息處理器
10、都是自包含的,獨立的,高度解耦的,執(zhí)行單一的任務。這種模式可能有一些變種。作為架構師,你應該理解每個實現(xiàn)的細節(jié),確保這種解決方案適合你的需求。有一些開源的框架實現(xiàn)了這種架構,如Spring Integration, Apache Camel, 或者 Mule ESB。Broker拓撲架構Broker不同于上面的結構,它沒有中心的Mediator。所有的事件串聯(lián)起來通過一個輕量級的消息broker如RabbitMQ,ActiveMQ,HornetQ等。如果你的消息比較簡單,不需要重新編排,就可以使用這種結構。如圖所示,它包含兩個組件broker和 event processor。broker中的
11、event channel可以是消息隊列,消息topic或者它們的復合形式。每個event processor負責處理事件,發(fā)布新的事件。架構例子在新浪微博的早期架構中,微博發(fā)布使用同步推模式,用戶發(fā)表微博后系統(tǒng)會立即將這條微博插入到數(shù)據庫所有粉絲的訂閱列表中,當用戶量比較大時,特別是明星用戶發(fā)布微博時,會引起大量的數(shù)據庫寫操作,超出數(shù)據庫負載,系統(tǒng)性能急劇下降,用戶響應延遲加劇。后來新浪微博改用異步推拉結合的模式,用戶發(fā)表微博后系統(tǒng)將微博寫入消息隊列后立即返回,用戶響應迅速,消息隊列消費者任務將微博推送給所有當前在線粉絲的訂閱列表中,非在線用戶登錄后再根據關注列表拉取微博訂閱列表。架構考量事
12、件驅動架構模式實現(xiàn)起來相對復雜,主要是由于它的異步和分布式特性。這可能會帶來一些分布式的問題,比如遠程處理的可用性,缺乏響應,broker重連等問題。一個考慮是這種模式對于單一的邏輯缺乏原子事務。所以你需要將原子事務交給一個事件處理器執(zhí)行,跨事件處理器的原子事務是很困難的。最困難的設計之一是事件處理器的創(chuàng)建,維護和管理。事件通常有特殊的約定(數(shù)據值和格式)。模式分析總體靈活性: 高發(fā)布易用性: 高可測試性: 低性能: 高規(guī)模擴展性: 高開發(fā)容易度: 低微內核架構 (Microkernel Architecture)微內核架構模式通常又被成為插件架構模式,可以用來實現(xiàn)基于產品的應用, 比如Ecl
13、ipse,在微內核的基礎上添加一些插件,就可以提供不同的產品,如C+, Java等。模式描述微內核包含兩個組件: core system 和 plug-in modules。應用邏輯被分隔成核心系統(tǒng)和插件模塊,可以提供可擴展的,靈活的,特性隔離的功能。模式例子Eclipse IDE是當之無愧的微內核的絕佳例子之一。架構考量微內核的架構模式可以嵌入到其它的架構模式之中。微內核架構通過插件還可以提供逐步演化的功能和增量開發(fā)。所以如果你要開發(fā)基于產品的應用,微內核是不二選擇。模式分析總體靈活性: 高發(fā)布易用性: 高可測試性: 高性能: 高規(guī)模擴展性: 低開發(fā)容易度: 低微服務架構作為單一整體的程序和
14、面向服務架構的替代者, 微服務架構模式在工業(yè)界很快贏得了地位。這種模式還在進化之中,在業(yè)界對于它的特性和實現(xiàn)還有些困惑。Oreilly的小書提供了這種模式關鍵的概念和基礎知識,用來判斷這種架構是否適合你的應用。模式描述不管你使用何種實現(xiàn)風格和拓撲,有幾個通用的核心概念應用在這種架構模式上。首先是分隔發(fā)布單元(separately deployed units)。如圖所示,每一個微內核的組件都被分隔成一個獨立的單元。微服務包含服務組件(service component)。不要考慮微內核的單個服務,而是最好考慮服務組件,從粒度上講它可以是單一的模塊或者一個一個大的應用程序,代表單一功能(提供天氣
15、預報或者圖片存儲)。正確設計服務組件的粒度是一個很大的挑戰(zhàn)。另一個關鍵概念是微內核是分布式的。這意味著服務組件可能是遠程方法(通過JMS, AMQP, REST, SOAP, RMI等等)。分布式意味著這種模式可以建立大規(guī)模的應用。另一個值得興奮的特性是它可以從其它有問題的架構模式中演化出來,而不是直接創(chuàng)建出來等待問題發(fā)生。當你遇到一些無法解決的問題,特別是互聯(lián)網企業(yè)的規(guī)模擴大時,是很好的引入微服務架構的時機。一般會從兩個模式中演化。一種就是一開始就是整體的應用,所有的模塊都是緊耦合的。另外一種是面向服務的架構模式(SOA,service-oriented architecture patte
16、rn)。SOA不是不好,但是太昂貴了,不好理解和實現(xiàn)。模式拓撲有很多實現(xiàn)微服務的方式。最通用最流行的三個方式是: API REST-based, applicaiton REST-based 和 中心化的消息。API REST-based 適合網站提供小規(guī)模的,自包含的服務。很多互聯(lián)網網站都提供這樣的服務,比如OAuth2服務。application REST-based不同于上面的架構,客戶端看到的是web界面或者富客戶端程序,而不是調用API。UI層獨立發(fā)布,可以訪問服務組件。中心消息模式,它類似前面的模式,但是使用一個輕量級的消息broker取代RESTful的服務調用。這個輕量級的br
17、oker不會執(zhí)行服務的編排,傳輸和路由,這和SOA不同,不要把它看作SOA的簡化版。架構考量微服務架構解決了無架構的整體編碼的應用的問題以及SOA的問題。同時它還可以提供實時的產品發(fā)布。它是一個分布式架構,也會有上面分布式的問題。模式分析總體靈活性: 高發(fā)布易用性: 高可測試性: 高性能: 低規(guī)模擴展性: 高開發(fā)容易度: 高基于空間的架構 (Space-Based Architecture)基于空間的架構有時候也被成為基于云的架構。大部分的基于web的應用的業(yè)務流都是一樣的。 客戶端的請求發(fā)送給web服務器,然后是應用服務器,最后是數(shù)據庫服務器。對于用戶很小時不會有問題,但是負載增大時就會遇到瓶頸(想想搶火車票)。首先是web服務器撐不住,web服務器能撐住應用服務器又不行,然后是數(shù)據庫服務器。通常解決方案是增加web服務器,便宜,簡單,但很多情況下負載會傳遞給應用服務器,然后傳遞給數(shù)據庫服務器。有時候增加數(shù)據庫服務器也沒有辦法,因為數(shù)據庫也有鎖,有事務的限制?;诳臻g的架構用來解決規(guī)模和并發(fā)的問題。模式描述基于空間的架構最小化限制應用規(guī)模的影響。這個模式來自于tuple space, 分布式共享內存想法。要想大規(guī)模,就要移除中心數(shù)據庫的限制,使用可復制的內存網格。應用數(shù)據保存在所有活動的處理單元的內存中,處理單元根據應用規(guī)??梢约尤牒?/p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年超低頻傳感器標定系統(tǒng)合作協(xié)議書
- 八年級上冊第一章復習導學案
- 新華東師大版七年級數(shù)學下冊《10章-軸對稱、平移與旋轉-10.5-圖形的全等》教案-162
- 2025年代理合同解除協(xié)議常用版(2篇)
- 2025年代合同標準樣本(2篇)
- 2025年五年級作文工作總結范例(二篇)
- 2025年五星級酒店保潔勞務合同協(xié)議(2篇)
- 2025年二年級老師個人教學工作總結模版(四篇)
- 熱點1-1 集合與復數(shù)(8題型+滿分技巧+限時檢測)(解析版)
- 2025年產品買賣協(xié)議燈具(2篇)
- SL 288-2014 水利工程施工監(jiān)理規(guī)范
- 部編版八年級語文上冊期末考試卷
- 2024年02月中央軍委后勤保障部2024年公開招考專業(yè)技能崗位文職人員筆試參考題庫附帶答案詳解
- (2024年)肺栓塞的護理課件
- 小學數(shù)學三年級下冊第八單元《數(shù)學廣角-搭配(二)》大單元集體備課整體設計
- (高清版)TDT 1031.6-2011 土地復墾方案編制規(guī)程 第6部分:建設項目
- 2024年江蘇省高中學業(yè)水平測試生物試卷
- 露天采場危險有害因素辨識
- 蘇教版一年級上、下冊勞動與技術教案
- 七上-動點、動角問題12道好題-解析
- 山東曲阜的孔廟之旅
評論
0/150
提交評論