設(shè)計一個架構(gòu),面臨的首要問題是如何進行分解,分解后的組件相互如何組織在一起。從這個意義上說,架構(gòu)有很多種,而最典型并且在企業(yè)中應(yīng)用最廣泛的非分層架構(gòu)莫屬了。分層架構(gòu)直觀來講就是一種“分層蛋糕”,每一層都依托在其下層之上,上層使用下層定義的各種服務(wù),而下層對上層一無所知。這方面的例子非常多,例如計算機本身分成硬件抽象層,操作系統(tǒng)層,系統(tǒng)軟件和應(yīng)用軟件層,互聯(lián)網(wǎng)ISO 7層架構(gòu)等等。這也印證了一句名言--“計算機中的任何問題都可以通過增加一個中間層來解決”。
分層架構(gòu)具有很多優(yōu)勢:
另外,對于三層架構(gòu),我們需要注意以下幾點:
分層架構(gòu)具有很多優(yōu)勢:
- 上層無需了解下層的實現(xiàn)細節(jié),每一層都是一個有機整機;例如無需了解以太網(wǎng)如何運行,你依然可以用TCP/IP協(xié)議來編寫FTP服務(wù)。這一點對于廣大技術(shù)人員尤其是程序員至關(guān)重要,否則我們每次編寫應(yīng)用的時候都既要知道硬件、又要了解操作系統(tǒng),還要懂編譯器
- 下層可以實現(xiàn)透明的替換,只要替換前后提供相同的服務(wù)接口。例如FTP服務(wù)可以運行在PPP上,也可以運行在以太網(wǎng)上
- 層次之間的依賴很小,例如只要TCP/IP協(xié)議不變,F(xiàn)TP服務(wù)就不變,無論數(shù)據(jù)鏈路和物理層發(fā)生怎樣的變化
- 分層明確了了每層的功能和接口,有利于進行標準化
- 下層可以為上層多個服務(wù)提供支持,只要服務(wù)遵循相同的調(diào)用接口
- 層次不能封裝所有的東西,最典型的代表就是如果要在用戶界面顯示增加一個數(shù)據(jù)域,則數(shù)據(jù)庫中需要增加相應(yīng)的字段,并且業(yè)務(wù)層也需要做相應(yīng)的修改。
- 過多的層次會加大調(diào)用開銷,從而影響性能。
- 兩層架構(gòu) - 以客戶機/服務(wù)器系統(tǒng)為代表,客戶端(胖客戶端)負責(zé)用戶界面和業(yè)務(wù)邏輯,服務(wù)器就是關(guān)系型數(shù)據(jù)庫。常見的工具有VB,PowerBuider等,一般來說這個階段業(yè)務(wù)比較簡單,主要就是數(shù)據(jù)庫的增刪改查,通過用戶界面上的SQL感知控件來連接和操作數(shù)據(jù)庫。
- 三層架構(gòu) - 我認為也可以稱為四層架構(gòu)(如果算上數(shù)據(jù)庫),即表現(xiàn)層、領(lǐng)域?qū)雍蛿?shù)據(jù)源層。表現(xiàn)層用來處理與用戶的交互,可以是命令行、胖客戶端或者web界面;數(shù)據(jù)源層主要關(guān)注和其它系統(tǒng)的交互,如數(shù)據(jù)庫、消息系統(tǒng)、緩存或其它;領(lǐng)域?qū)又饕撠?zé)執(zhí)行領(lǐng)域邏輯,完成相關(guān)的計算。
另外,對于三層架構(gòu),我們需要注意以下幾點:
- 三層架構(gòu)的每一層可以在垂直方向上進行再拆分,形成不同的軟件包,例如表現(xiàn)層分為命令行和web界面,數(shù)據(jù)源層分為數(shù)據(jù)庫、文件系統(tǒng)等
- 在實際應(yīng)用中,下層對于不相鄰的上層并不是完全透明的,例如有時為了效率或其它考慮,可能會從表現(xiàn)層直接訪問數(shù)據(jù)源層
- 分層架構(gòu)指的是邏輯上的分層,而從物理上來看,可以有多種部署架構(gòu)。例如Java中可以三層都放在同一個JVM(Tomcat)中;也可以把表現(xiàn)層放在Tomcat中,而業(yè)務(wù)邏輯放在JBoss EJB(另外一個JVM,甚至是不同的服務(wù)器)中。