沒有進(jìn)行架構(gòu)設(shè)計(jì)的應(yīng)用程序通常是緊耦合的、玻璃心,難以改變。沒有頭緒。如果不理解應(yīng)用的各個(gè)組件的內(nèi)部工作方式的話很難看清它的架構(gòu)特征。關(guān)于部署和維護(hù)的問題都很難回答:架構(gòu)的規(guī)模如何?程序的性能如何?程序容易修改么?程序的部署模型是怎么樣?程序的響應(yīng)如何?
架構(gòu)模式可以幫助你定義程序的基本特征和行為。例如一些架構(gòu)模式很自然讓程序成為大規(guī)模(scalable)的程序。有些模式讓程序變得靈巧敏捷(agile)。知道這些架構(gòu)的特征,優(yōu)點(diǎn)和缺點(diǎn),你就可以根據(jù)你特定的業(yè)務(wù)需求和目標(biāo)從容的選擇一種架構(gòu)模式。
一、分層架構(gòu) (Layered Architecture)
它是最通用的架構(gòu),也被叫做N層架構(gòu)模式(n-tier architecture pattern)。這也是Java EE應(yīng)用經(jīng)常采用的標(biāo)準(zhǔn)模式?;旧鲜莻€(gè)程序員都知道它。這種架構(gòu)模式非常適合傳統(tǒng)的IT通信和組織結(jié)構(gòu),很自然地成為大部分應(yīng)用的第一架構(gòu)選擇。
在分層架構(gòu)中的組件被劃分成幾個(gè)層,每個(gè)層代表應(yīng)用的一個(gè)功能。分層架構(gòu)本身沒有規(guī)定要分成多少層,大部分的應(yīng)用會(huì)分成表現(xiàn)層,業(yè)務(wù)層,持久層和數(shù)據(jù)庫(kù)層。小的應(yīng)用有時(shí)候會(huì)將業(yè)務(wù)層和持久層合在一起,更大規(guī)模的應(yīng)用可能會(huì)劃分更多的層,比如調(diào)用外部服務(wù)的層。

分層架構(gòu)的一個(gè)特性就是關(guān)注分離(separation of concerns)。在層中的組件只負(fù)責(zé)本層的邏輯。組件的劃分很容易讓它們實(shí)現(xiàn)自己的角色和職責(zé),也比較容易地開發(fā),測(cè)試管理和維護(hù)。
關(guān)鍵概念
注意每一層都是封閉的。這意味著Request必須經(jīng)過每一層才能到達(dá)最底下一層。

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

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

這是一個(gè)標(biāo)準(zhǔn)的分層的架構(gòu)。每一層中又可以詳細(xì)的分成更細(xì)的層,比如服務(wù)層。

模式分析
總體靈活性: 低
發(fā)布易用性: 低
可測(cè)試性: 高
性能: 低
規(guī)模擴(kuò)展性: 低
開發(fā)容易度: 高
二、事件驅(qū)動(dòng)架構(gòu)(Event-Driven Architecture)
事件驅(qū)動(dòng)架構(gòu)是流行的一個(gè)分布式異步機(jī)構(gòu)模式,可以用來設(shè)計(jì)規(guī)模很大的應(yīng)用程序。基于這種架構(gòu)模式應(yīng)用可大可小。它由高度解耦的,單一目的的事件處理組件組成,可以異步地接口和處理事件。
它包括兩個(gè)主要的拓?fù)浣Y(jié)構(gòu):mediator 和 broker。Mediator拓?fù)浣Y(jié)構(gòu)需要你在一個(gè)事件通過mediator時(shí)精心安排好幾個(gè)步驟,而broker拓?fù)浣Y(jié)構(gòu)無需mediator,而是由你串聯(lián)起幾個(gè)事件。這兩種拓?fù)浼軜?gòu)的特征和實(shí)現(xiàn)有很大的不同,所以你需要知道哪一個(gè)適合你。
Mediator拓?fù)浣Y(jié)構(gòu)
Mediator拓?fù)浣Y(jié)構(gòu)適合有多個(gè)步驟的事件,需要安排處理層次。