天天看點

.Net下企業應用系統架構建構心得

在開始架構設計之前,需要了解一下架構是什麼,按照IEEE标準的定義是: Architecture 是一個系統的基本組織,它蘊含于系統的元件中、元件之間的互相關系中、元件與環境的互相關系中、以及呈現于其設計和演進的原則中。 (The embodied fundamental organization of a system in its components, their relationships to each other, and to the environment, and the principles guiding its design and evolution. [IEEE Std 1471-2000])

一句話,架構就是軟體産品的骨架,這個骨架把元件、環境納入其中,使之能有效得發揮它們的技能。

 從架構、技術和需求的關系來看。一個軟體産品包含了需求和技術,而架構同樣是要包括需求和技術的,隻是它沒有全包全括這個需求和技術,應該是一些整體性的需求,尤其是一些非功能性的需求。如果在建構架構的時候,架構設計人員根本不了解企業使用的目标軟體的整體需求,企業使用目标系統的整體環境,那指望架構适用顯然有點強求。

架構的重要性是不言自明的:

l         從需求、技術和架構的關系看,架構是軟體産品的骨架

l         從軟體過程上看,架構處在需求即将完成,實作開始之前,是一個承上啟下的關鍵點

l         從技術上來看,架構是整體設計,包含了軟體需要用到的各項技術

l         架構決定開發過程,方法和工具,這一點都不誇張,架構的決定了軟體的規模,技術。很自然就覺得了資源的需求以及如何配置這些資源來進行開發

l         架構影響軟體産品的成本,包括開發成本,測試,實施和維護成本

架構實際上是軟體的一部分,同樣都需要遵循軟體設計中要考慮的設計原則。但是,架構由于是前期設計,整體設計,又具有其需要強調的地方:

l         明确目标,切合需求(實用決定一切)

l         可擴充性

l         易用性和易維護性平衡藝術

易用性就要求系統不能過于負責,而易維護性就要求可擴充性和靈活性,就要求系統不能太過簡單,這就要權衡這兩個性能方面的考慮。

l         安全性

架構的安全并不是說把架構的代碼放到一個地方加密,是在架構設計中考慮軟體的安全性能,這個在先期考慮是相對重要的。

l         穩健性

架構設計時需要納入考慮的要素有:

l         Application Infrastructure

應用的基礎架構,也可以說是架構是建立在什麼平台上的,比如windows 2003+.Net framework 1.1,當然并不是就這麼簡單,下面會有具體的講解。

l         Management

架構設計中要考慮使用者對軟體的管理方面的考慮,比如使用者對性能監控的要求,使用者要對軟體執行各個環節的執行效率統計等等。

l         Security

安全性是在什麼地方都要考慮的,不光是軟體開發。

l         Storage

存儲,面對一個企業級的應用而言,對存儲的要求是要特别注意的。

l         Network

網絡拓撲結構,以及企業對網絡的要求層級,資料傳輸要求等等。

在了解了軟體架構的這些一些本本上的東西,那麼我們來搭個應用看看。偶以偶碰到的項目為例,當然一些技術是可通用的,但這個是一個個案,不代表适用您的項目,隻求交流哦。

 先交待一下,假設:

1. 系統是建立在微軟的架構基礎上的,Microsoft System Architecture (MSA)

2. 它是一個B/S的N-Tier架構

3. 同時它是一個企業級應用系統,資訊平台

在考慮使用N-Tier的過程中,由于系統中沒有涉及到要使用跨平台的應用,在可預見的将來也不會有,是以就把WebService拿掉了。WebService從3年前就開始用,但是幾個問題還是沒有解決:

1. WebService從接口繼承,如果兩個或者兩個以上的Webservice同時從相同的接口繼承,由于WebService的自描述性,每個WebService都重新生成接類,就成了兩個不同的類。

2.WebService本身不能被繼承,同樣由自描述性搞的。

3.WebService要真正做到跨平台那就需要做到跨語言,從Java到C#的轉化是資料類型轉化是相當麻煩的,基本類型之間就又很大問題,如byte,sbyte(C#)中,當Java中根本就沒有sbyte。早在一年半前曾用相異平台做了一個應用系統,為了處理這個資料類型轉化,偶曾想去掉WebService。

4.WebService方法不能重載,這個很恐怖。

5.WebService的安全問題。

盡管WebService有其種種好處,連現在的網格都開始醉心于它,更不用說SOA了,本身就是以WebService為核心展開的。但是,WebService到底能走向哪裡?(一空之見哦,呵呵)

我們對照這些假設展開架構,并進行設計,當然有些朋友喜歡針對一個具體的問題來,比如:事務處理,性能計數,日志處理,MVC,界面統一格式處理,統一驗證,國際化問題等等,偶在下面的描述中,采用一條線,在對上面的假設展開時會有這些問題的讨論。

一.在MS架構上的搭建平台,我們就需要了解MSA是什麼東東,先看一下結構圖

.Net下企業應用系統架構建構心得
.Net下企業應用系統架構建構心得

(MSA的結構圖)

Customer Application是我們要搭建的應用系統,那其下的這些部分就是系統運作的這個從軟體到硬體的環境。而Application infrastructure Elements是基礎,有些像Biz talk等應用系統我們也可以拿來用。

二.下面來看看n-tier的結構,偶相信大家肯定已經非常熟悉了。

.Net下企業應用系統架構建構心得

具體的了解一下這個層的關系,以及建構架構時上文提到的需要涉及到的問題。

1. Presentation Tier

表示層分層兩層,UI Components可以直接看作是HTML,UI Process 這裡不是MVC,而是code-behind類。

在表示層需要處理就偶所碰到的問題有:

l         MVC (Model-Views-Controller)

Asp.net下是否需要使用MVC一直是一個有争議的問題。 Asp.net的特點是事件驅動與Code-behind,Code-behind本身就可以了解是MVC中的Controller,但是沒有展現MVC的好處來,微軟缺乏雙向指派的考慮。

UIP (User Interface Process Application Block )是微軟社群裡的一個開源項目。嚴格說來它隻是一個管頁面流轉,不是一個MVC的架構。

Maverick.net是一個比較輕量級的架構,簡單實作了MVC,但是也有其缺陷,而且比較老了。

還有Castle的架構,Spring還沒有完整推出。

l         國際化

如果是一個多語言的企業應用,那就需要國際化支援,.Net提供了很好的國際化支援。

l         頁面元素格式統一轉化與驗證

比如日期形式從“yyyy-mm-dd”需要轉化成“yyyy/mm/dd”,如果沒有一個統一配置的地方,那頁面就要傷筋動骨了。

l         安全,在後面的安全節有介紹,這裡先按下不提。

2. WebService

這裡不在說了,已經去掉了。

3. Business Tier

Business 層是應用系統的核心,包括展現使用者的商業運算邏輯的Business Logic;還有保障Business Logic運算安全和完整性的事務,日志,安全驗證,性能管理等輔助邏輯。

在設計Business Tier的時候要考慮的問題有:

l         可擴充性

                         i.              将接口進行到底

在Business實作層之上,建議抽出一個接口層,遵循一般原則提倡接口程式設計, Business Components都從一個或者一個以上接口繼承,在調用代碼中調用類工廠産生執行個體,在代用代碼中建議不要使用此類的new操作符。

                       ii.              設計模式的應用

适當應用模式,可以增加程式的靈活性,可擴充性。(在設計中經常用到Factory,Adapter,Singleton,Decorate,Command,Template等模式,建議可以重點了解一下這些模式。有時間可以詳讀GOF的設計模式)

Example:從Business結構,劃分為CRUD(增查改删,稱為“四架馬車”)和其它具體業務實作的Components,這裡用Decorate模式,簡單實作一個繼承的過程,如果你要繼承兩個基類,可以考慮使用此模式,當然,即使不繼承基類,用Interface+Adapter同樣可以實作多繼承。

l         區分業務邏輯

所謂區分業務邏輯實際上在上面的描述中已有提及,大緻上可以分為兩類,一類是商業業務邏輯,一類則是軟體功能性邏輯,起輔助保障上述邏輯用,如事務,日志,安全驗證等。第二類的使用頻率高,實作又是非常類同的,如果提取出來,那複用價值是很高的。

這種區分早有定義,把抽出來的部分稱之為CrossCut或者叫Aspect。這個就是AOP在事務,日志,安全驗證方面的應用。

先來看一下CrossCut(Aspect)的結構表示圖:

.Net下企業應用系統架構建構心得

l         MS元件、服務的是應用

這裡的服務群組件主要是講是在Application infrastructure中的元素,如COM+,MSMQ,IIS,AD等等。這裡常用到的兩種COM+和MSMQ。

                         i.              COM+

如果應用系統需要使用分布式事務,或者的确希望把元件程式設計一個服務,那麼就可以使用COM+,當然這也造成部署的不友善。

                       ii.              MSMQ

消息隊列,主要使用于異步處理。比如,在業務處理過程中要發一封郵件,如果采用消息隊列來做,不管目前的郵件服務忙,還是根本就不能工作,使用者可以轉回來處理其它業務而不必等待。

4. DataAccess Tier

資料通路層,是用來隔離系統通路不同的資料媒體或者系統外服務(比如,其它系統的WebService等)用的。

l         将接口進行到底

l         OR-Mapping

OR Mapping所帶來的好處這裡就不多說了。我們先來談一下下面的幾個概念。

                         i.              Domain Model & Table Module

根據Martin Flower的定義Domain Model:An object model of the domain that incorporates both behavior and data.

–     Rich Domain Model :是上面的這種定義

–     Anemic Domain Model :這種方式方法和Data是分别在不同的類裡實作的,OR-Mapping就是建立在這種方式上的。

                       ii.              NHibernate

NHibernate是OR-Mapping的一種實作,是一個比較齊整的架構,是從Java的Hibernate轉過來的。

當然.Net下還有其它的OR-Mapping實作,如Gentle.net

                      iii.              SqlMapper & IBatis.Net

SqlMapper為Domain Model和Table Module兩種方式一個折中方案,它可以以面向對象的方式直接處理自定義資料實體對象,同時可以根據與資料源與業務實體的映射關系執行手寫的Sql語句,這樣完全使得我們可以針對具體資料源做優化,對于複雜操作同樣可以勝任。

IBatis.Net 是SqlMapper的實作。

l         OR-Mapping與複雜查詢的問題

OR-Mapping帶來的好處是在CU,D方面還可以,畢竟大批量的删除一般不會經常出現,但是R方面就是一個實實在在的問題,面對複雜查詢的執行效率也是一個問題。蹩腳的解決方案是兩條線,R這方面采用Table Module這種方式來,而CUD才用對象。

5. Commom Tier

是系統性能、檢測、跟蹤用的,有些可以采用AOP來解決,如計數等。

三.企業級應用

企業級應用一般的特點是資料量大,互動操作要求高,線上使用者量比較大,使用者地理分布較廣。這就要求我們在設計架構是要考慮其安全性,資料存儲要求,叢集,與其它應用互動。

l         安全性

安全性是一個多角度多方位的立體式問題,應用體統的安全性,是與其它安全性一起才建構起來。

一般安全分成幾個層級:

•         網絡安全性

–     網絡服務的安全,如http,ftp,mail

•         作業系統安全性

–     通路控制表(ACL)安全控制,主要通過組、使用者權限控制完成

–     網絡通路安全控制,在域模式下

•         資料安全性

–     資料庫系統安全

–     資料通路權限安全

–     資料加密

–     資料備份

•         應用系統安全性

–     Asp.net的安全性

–     安全通信

對于上面列舉的一些安全層次,有些是在系統的使用過程中要注意的問題,并非在架構設計時能做到的,但是,可以做為輸入項來建構一套安全的系統。下面主要來講一下如何用Asp.net來建構安全的系統。

•         Asp.net安全性

–     ASP.NET 身份驗證,包括 Windows、表單、Passport 和無身份驗證

–     ASP.NET 授權,包括URL 授權、檔案授權 、主體權限需求 和.NET 角色

–     辨別和主體,主要是通過程式設計方式來進行(辨別和主體對象必須實作

IIdentity

和 I

Principal

接口。這些接口在

System.Security.Principal

名稱空間内定義 )

•         在采用windows驗證時,Asp.net可以在IIS上配置一些安全選項。

•         安全通信

–     Internet協定安全(IPsec)

IPSec 提供傳輸級安全通信解決方案,可以用于保護兩台計算機之間傳送的資料安全 。VPN也是在這個協定基礎上建構的。

–     安全套接字(SSL)

這通常用于保護浏覽器和 Web 伺服器之間的通道安全。 結合IIS和證書,就可以配置https協定使用。

–     遠端調用(RPC)加密

分布式 COM (DCOM) 使用的 RPC 協定提供了一個身份驗證級别(資料包保密性),它對用戶端和伺服器之間傳送的每個資料包都進行加密。

l         存儲

企業級應用級的存儲特點是I/O通路要求高,資料容錯性要求高。是以,就有可能使用比較高端的儲存設備以滿足存儲要求,硬體不是軟體系統架構的内容,但是Raid等使用卻是軟體架構必需考慮的。

l         叢集

同存儲要求一樣,對于一個大型的應用來說,大通路量,分布式資料應用,就可能需要使用叢集。

       對于分布式資料庫的需要使用資料庫叢集,可采用資料庫系統本身得到解決。

對于分布式部署需要應用伺服器叢集,這在代碼實作上就要先期考慮到Session在分布式部署環境下的同步問題。

l         與其它應用互動

在設計架構時,還要考慮與其它系統的互動。

1.使用其它系統的接口

2.與原有系統的整合

3.開放接口,供其它系統使用

以上是如何建構架構的一些心得,有些方面的技術是可以挖掘很深的,這裡隻是作一些提綱式的描述。歡迎交流。

在撰寫的過程中參考了一些資料,MSA,MSDN的架構方面的,參考了有些标準的文檔,以及一些有價值的專欄文章,比如Martin Flower的。相關的具體資訊就沒有去列了。