1:關於多層架構(N-Tier)
多層架構是一種被行業證明過的軟件架構模型,對開發一些解決可擴展性、安全性、容錯性方面的企業級(客戶端/服務端)應用程序支持是相當給力。但在.NET世界里,我們有許多工具和產品,卻沒有指導手冊是關於如何設計和實現一個良好的多層架構模型,比如一些樣例版,Demo等等,我們或許多少有聽到、看到一些關於多層架構模型的用途和益處,但更多知道的僅僅是如何使用和實現,沒有過多的思考為何我們要這樣設計呢?這樣設計符合了哪些設計模式呢?遵循哪些設計原則呢?或者了解一點多層的概念,甚至是根本不理解其中的定義。所以本篇文章主旨是圍繞“多層架構”來打造,介紹其中的概念、優缺點、與其他架構區別、使用場景等等。但,總體來說,這是一個良好的軟件架構的解決方案之一。
2:名詞介紹
物理層和進程(Tier And Process)
在英文中都有表示層的意思,簡單來說——物理層和邏輯層。有一種說法是Layer是水平方向切割的,Tier是垂直方向切割的,這個只是從觀察角度不同來定義的。Tier通常意味着物理部署的計算機,在一層可以單獨運行某一個服務。而Layer則意味着軟件功能相似的組件邏輯組合,Layer是為了能夠更好的開發,更好的組織。嚴格定義來說,
Tier是這樣的:客戶機->web服務器->應用服務器->數據庫,僅此而已。如果想要更多的Tiers,只能去擴展應用服務器,把應用服務器分割出若干的Tier。更多時候,一個Tier可以Host多個Layer外,某個Layer可以分布到多個Tier,比如提供基礎公共服務的Layer,對於富客戶端的應用程序,就是這種情況。
同時,Layer還暗示了"下面的Layer一般要為上面的Layer提供服務",那么用邏輯層來表達就顯得比較合適,而Tier這方面的暗示比較薄弱,用物理層來表達也貼切。
圖1:
在圖1中我們能看到,持久層(persistence layer)包含了兩部分:持久操作類庫(persistence lib)和wcf數據服務(wcf Data Service)。持久操作類型在持久層中通常運行同一個進程並結合wcf數據服務,作為業務層的提供者,而wcf數據服務,又可以單獨的運行在獨自的一物理層。另一個例子是,我們可能會從業務層中提取數據驗證來作為獨立的類庫(此時邏輯定義上,數據驗證還在業務層中),是為了給客戶展現層調用提供更好的交互性能。那這樣的話,數據驗證類庫與客戶展現層運行的同一個進程中,而業務層剩余的部分則單獨運行在一個物理層。
物理層和進程(Tier And Process)
通常來說,一個邏輯層運行一個進程,並同時運行在一台單獨的計算機上。兩個不同邏輯層可以是在兩個不同的進程中獨立運行,進程間也互相通信。但如果碰到IPC情況,不是基於分布式的,那么這兩個進程就會共享內存空間,那么不同進程的處理得放在一個計算機中,那么相對來說,一個物理層對應兩個進程,相當於對應兩個邏輯層
邏輯層和進程(Layer And Process)
通常,一個邏輯層運行在一個獨立的進程中,也有多個邏輯層運行在一個獨立的進程中,也有一個邏輯層運行多個進程。可以分不同種情況
3:三層架構
首先先介紹下三層架構,三層是多層架構中典型的例子。包括了:表示層、應用層、數據層,順序是從頂層到底層依次繼承。
表示層(Presentation layer):用戶可以直接訪問和交互的層次,比如桌面UI、網頁頁面等等,也可以叫為客戶端。
應用層(Application layer):這個層封裝了業務邏輯(簡單來說就是業務運算的規則和數據驗證),領域概念、數據訪問邏輯等等,也可以叫為中間層
數據層(Data layer):用來存取應用程序數據的外部數據源,比如數據庫服務,CRM系統,ERP系統,主機或者其他遺留系統等等。其中一個是我們常見的是數據庫服務,在多層架構中,我們需要使用到非嵌入式的數據服務系統,比如SQL Service,Oracle,DB2,MySql或者PostgraSQL.非嵌入式的數據庫服務可以運行在獨立計算機中,而嵌入式數據庫服務,比如access,db在獨立計算機,所以這種數據庫服務類型是不能在三層架構中使用的。
4:1-Tier,2-Tier,3-Tier或More-Tier架構
1-Tier:所有的邏輯層運行在一台計算機中,為了實現1-Tier架構,我們需要用到簽入式類型的數據庫系統,並且是不能運行在單獨的進程中,相反,那些至少2-Tier因為是非嵌入式數據庫通常可以在獨立的計算機中運行。
2-Tier:表示層和應用層,其中一個單獨運行在一台計算機中,或應用層和數據層,其中一個單獨運行在一台計算機中,整個應用程序不超過兩台計算機。
3-Tier:是多層架構中,最典型的一種。三層中的每一層都可以單獨運行在分離的計算機中,但也可以被部署在同一台計算機(其中最常見的是,三層架構,但最終部署作為一台中)。
N-Tier:3或者更多層架構。圖3描繪的是一個N層架構體系。一些三層類型可以進一步分割,變為多層架構。比如應用層可以進一步划分為業務層和持久層,表示層可以進一步划分為客戶端層和客戶端表現層。當然,所有這些邏輯層都可以部署在同一台計算機中的。
客戶端層:這個層是直接與用戶交互的,可能有幾種不同的類型共存,如WPF窗口,HTML網頁等等
客戶端表現層:包含客戶所需的表現邏輯。如asp.net mvc 的IIS服務器,也適應不同客戶的業務層
業務層:處理並封裝業務所涉及的所有領域和邏輯,也可被稱為領域層
持久層:處理和對業務數據到數據層進行讀寫操作,也可被稱為數據訪問層
數據層:外部的數據源,比如數據庫
5:N-Tier與MVC架構有什么區別
MVC模式(Model-View-Controller)是
軟件工程中的一種
軟件架構模式,把軟件系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。
1.控制器(Controller)- 負責轉發請求,對請求進行處理。
2.視圖(View) - 界面設計人員進行圖形界面設計。
3.模型(Model) - 程序員編寫程序應有的功能(實現算法等等)、數據庫專家進行數據管理和數據庫設計(可以實現具體的功能)。
就拿多層架構中最典型的三層來說,在三層中,數據訪問層(DAL)、業務邏輯層(BLL),Web層各司其職,目的是職責分離。MVC是Model-View-Controller。嚴格說起來這三個加起來才是三層架構中的Web層,換種說法就是MVC就是表示層中再度分化,分成了控制器、視圖、實體三個部分。View完成頁面邏輯,Model則封裝需要傳遞到View進行顯示的數據,而控制層則與三層中的BLL進行通信。
MVC的優點:耦合性低、重用性高、部署快、可維護性。
6:不同層架構優勢和劣勢
1 or 2-Tier 架構
優勢:由於流程和層次比較少,對於用戶數量少的應用程序是簡單又快速部署,同時又低成本的硬件、網絡維護。
劣勢:但當用戶數量增大時,將會出現大問題。由於只能部署1到2台計算機,在程序的安全性、可擴展性、容錯性等方面會有局限性。
N-Tier架構
優勢:
1,可伸縮性。這是由於多層的功能和低耦合性所決定的。比如,由於沒有其他層的耦合,數據層可以擴大數據庫集群,web客戶端可以通過負載平衡器擴大而不影響其他層,Windows服務器可以輕松進行集群通過負載平衡和故障轉移。
2,可安全性。更好和更安全的控制整個系統,我們可以對每個層執行不同的安全策略,比如,業務層和數據層通常比表示層需要更高的安全級別,我們可以把這兩高安全層放在防火牆后面進行保護。
3,可容錯性。比如,在不影響其他層的情況下,數據庫在數據層中可以為故障轉移,進行負載平衡集群。
4,可獨立性。在不影響其他層情況下,可以進行獨立升級和改變。在面向對象世界里,接口依賴實現可以把所有層解耦的非常好,那么就會導致如果其中某一層改變了,對於其他層是影響是非常小甚至是不影響。接口依賴意味着層跟層之間僅僅通過接口來互相通信,一層依賴於另一層的接口,而不是內部類來通信。當然,在改變整個系統時候,層的依賴性影響到的只是他低層次的實現,進而把其中副作用的影響降到最低。比如,如果接口不改變,在不影響整個系統下,我們可以更改或替換這個接口所實現的層。
5,可便捷性。更便捷和更高效的開發環境,解耦主要是通過軟件組件組合來實現某一模塊,這樣軟件開發是非常便捷和高效的。可以把每一層要實現的功能單獨分配給不同的開發組,只需通過接口來互相通信,每個層又可以自己做單元測試,到最后完成時組合起來就變成一個完整的系統。
6,可維護性。
7,可擴展性。由於對業務開發是以組件式來的,對於新功能的添加和刪除是非常方便的。
8,可重用性。由於是高內聚和低耦合,通用的功能和代碼可以重復使用,也可以被其他更多的應用程序調用。
劣勢:
1,由於許多網絡、計算機和進程都是獨立運行的,一旦系統的硬件和網絡帶寬比較差的話,整個系統運行的性能就會比較慢。
2,如果需要更好的硬件和網絡帶寬,對於硬件和網絡、維護和部署的成本比較高。
7:多層架構中的業務數據驗證
在多層架構中,為了保證整個業務系統健康的和良好的,其中數據驗證是非常必須和重要的步驟。那么首先有一個問題對於數據驗證?哪個層我們應該進行數據驗證,並且在哪里進行驗證呢?這里有幾個點:
1,可以任何一個層中進行數據驗證。通常,數據驗證離客戶層越近,是越高效。離客戶端越遠,則需要越可靠、越健壯。
2,當我們決定哪個層進行數據驗證時,我們需要處理好性能、可靠性和健壯之間的平衡關系。
3,客戶端驗證是是一種非常有效的手段,列如:Javascript客戶端驗證,當同時,用戶也可以輕松繞過客戶端驗證,比如網頁黑客所干的事情。因此,在考慮性能和可靠性時候,在客戶端和服務的數據驗證是非常需要的。
4,對於一些數據交互的應用程序,無論我們是否將在服務器端進行驗證,我們都需要在客戶端做可接受數據驗證。
8:多層架構中的開發技巧
設計、維護、實現、部署在多層架構中是一項艱巨的任務。如果一開始沒清晰的規划,那么有可能導致后期開發的時候會做無用功。這里有幾點如下建議:
1,用一些松散耦合的技術,盡可能把層和層之間的關系解耦,比如soap xml或接口等。在面向對象中,每一個層僅僅依賴於它接口所直接實現的具體層,而不是通過內聚類。這樣我們就可以盡可能的最大解耦,對於我們之后的開發會帶來更大的好處,比如單元測試、維護、系統升級,可擴展和可靠性。
2,盡可能多的自動生成技術或對於整個系統,通過poco版本方式進行業務實體的維護。利用特性、分部類、DTO等方法。
3,利用一些自動工具或包進行實體映射在業務實體和傳統的關系數據庫之間。比如Entity Framework 和 NHibernate 等工具。
4,利用代碼生成器。
5,我們應該盡量避免業務層與持久層的高度耦合,。比如,我們可以通過WCF業務服務來直接訪問Entity Framework,這種情況很常見。但這樣做有一個問題是,會把業務層和持久層進行高度耦合。而這種高度耦合會帶來更多的問題。通常我們通過一種適配器來解決這種耦合,進而把高耦合變成松散耦合,他們僅僅通過接口來通信。
6,在客戶表現層,我們把共同的代碼抽象並封裝,以達到通用的目的。
7,為了提高性能,往往要增加緩存。
8,為了適應需求的變更,良好的多層架構可以輕松應對部署的伸縮性和配置的靈活性。
9:結論
描述了多層架構的概念和定義,介紹多層架構中的典型代表——"三層架構"。並說明了一個完整的三層架構應該是表示層、應用層、數據層分別運行在單獨的計算機中。並描述了三層架構和MVC架構之間的關系,應該是屬於和被屬於的關系。分析了多層架構的優勢和劣勢,在多層架構中的數據驗證的重要性,最后說明在多層架構中可以用到的一些工具和技術技巧,謹記層和層之間的通信是通過接口來交互,而不是內聚類,那樣才會做到開發時模塊的高內聚和通信的低耦合。
這是學習了《N-Tier Architecture and Tips》這篇文章 所思考,如有理解錯誤,望不吝賜教。
