摘要:本文介紹了Microsoft用于建立和運(yùn)行面向服務(wù)的應(yīng)用程序的統(tǒng)一框架WCF的系統(tǒng)結(jié)構(gòu)和技術(shù)要素,分析了WCF用于分布式開發(fā)的優(yōu)點(diǎn)及項(xiàng)目的多層開發(fā)技術(shù),并通過(guò)開發(fā)具體分布式應(yīng)用程序來(lái)展現(xiàn)基于WCF構(gòu)架的分布式應(yīng)用程序的編程步驟與技巧。
關(guān)鍵詞:WCF;SOA;分布式
中圖分類號(hào):TP309.05文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)19-30068-03
Distributed Application Development Based on the WCF
YAN Bing
(Institute of Software, Nanjing College of Information Technology, Nanjing 210046, China)
Abstract: In this paper, Microsoft for the establishment and operation of a service-oriented applications WCF framework of the unity of the system architecture and technical elements and distributed through the development of specific applications, Analysis of the WCF for distributed development projects and the merits of the multi-storey development of technology,and show the distributed applications programming steps and techniques based on the WCF framework.
Key words: WCF; SOA; Distribute
1 引言
WCF是構(gòu)建安全可靠的事務(wù)性服務(wù)的統(tǒng)一框架。它是一種構(gòu)建分布式面向服務(wù)系統(tǒng)的非常豐富的技術(shù)基礎(chǔ),它統(tǒng)一了消息風(fēng)格和RPC[Remote Procedure Call]風(fēng)格,并且通過(guò)二進(jìn)制和基于開放標(biāo)準(zhǔn)的通信達(dá)到了平臺(tái)最優(yōu)化。
WCF是微軟基于SOA(Service Oriented Architecture)推出的.Net平臺(tái)下的框架產(chǎn)品,它代表了軟件架構(gòu)設(shè)計(jì)與開發(fā)的一種發(fā)展方向,在微軟的戰(zhàn)略計(jì)劃中也占有非常重要的地位。了解和掌握WCF,對(duì)于程序員特別是基于微軟產(chǎn)品開發(fā)的程序員而言,是非常有必要的?;诖耍恼峦ㄟ^(guò)介紹分布式應(yīng)用程序的具體開發(fā)過(guò)程來(lái)展現(xiàn)基于WCF技術(shù)的分布式軟件研發(fā)的基本步驟和技巧。
2 WCF概述
對(duì)于一個(gè)好的分布式系統(tǒng)來(lái)講,設(shè)計(jì)時(shí)應(yīng)當(dāng)考慮到異構(gòu)性、開放性、安全性、可擴(kuò)展性、故障處理、并發(fā)性以及透明性等問(wèn)題?;赟OAP的Web Service可以實(shí)現(xiàn)異構(gòu)環(huán)境的互操作性,保證了跨平臺(tái)的通信。利用WSE(Web Service Enhancements)可以為ASMX提供安全性的保證。.NET Remoting具有豐富的擴(kuò)展功能,可以創(chuàng)建定制的信道、格式化器和代理程序。Enterprise Service(COM+)提供了對(duì)事務(wù)的支持,其中還包括分布式事務(wù),可實(shí)現(xiàn)故障的恢復(fù)。MSMQ可以支持異步調(diào)用、脫機(jī)連接、斷點(diǎn)連接等功能,利用消息隊(duì)列支持應(yīng)用程序之間的消息傳遞。從功能角度來(lái)看,WCF整合了ASMX、.Net Remoting、Enterprise Service、WSE以及MSMQ等現(xiàn)有技術(shù)的優(yōu)點(diǎn),它提供了一種構(gòu)建安全可靠的分布式面向服務(wù)系統(tǒng)的統(tǒng)一的框架模型,使軟件研發(fā)人員在開發(fā)分布式應(yīng)用時(shí)變得更加輕松。
2.1 面向服務(wù)
既然WCF是一套面向服務(wù)的框架,服務(wù)自然便是WCF中最為重要的概念。服務(wù)是指暴露在外的一系列功能的集合,面向服務(wù)則是指一套構(gòu)建“面向服務(wù)程序”的抽象原則以及最優(yōu)方法。對(duì)于業(yè)務(wù)邏輯的理解,傳統(tǒng)的編程方式認(rèn)為應(yīng)將業(yè)務(wù)邏輯封裝為對(duì)象,該對(duì)象提供了與業(yè)務(wù)相關(guān)的一些功能;而基于WCF的程序設(shè)計(jì)卻更多的是考慮如何提供服務(wù)以及消費(fèi)服務(wù)。SOA 現(xiàn)在很熱鬧,但它早已經(jīng)出現(xiàn)。最初廠商和網(wǎng)站炒 \"WebServices\" 的時(shí)候,SOA 就已經(jīng)是個(gè)熱門詞匯了。但是在實(shí)際開發(fā)中,WebServices 和 .NET Remoting 的使用度并不高,原因太多太復(fù)雜。不過(guò) WCF 的出現(xiàn),相信會(huì)推進(jìn)這一進(jìn)程。與面向組件服務(wù)程序類似,基于SOA 的應(yīng)用程序?qū)⒎?wù)封裝到了單個(gè)邏輯程序當(dāng)中,如圖1所示。
2.2 WCF體系結(jié)構(gòu)
WCF提供了對(duì)可靠性、事務(wù)性、并發(fā)管理、安全性以及實(shí)例激活等技術(shù)的有力支持,而這些支持均依賴于如圖3所示的WCF構(gòu)架。
在客戶端,分布式應(yīng)用通過(guò)一個(gè)代理來(lái)轉(zhuǎn)發(fā)對(duì)宿主端所提供服務(wù)的調(diào)用,而代理?yè)碛泻头?wù)相同的操作接口,另外還有一些附加的代理管理方法。這也就意味著客戶端從來(lái)不會(huì)直接調(diào)用服務(wù),即便這個(gè)服務(wù)就在本機(jī)的內(nèi)存中。當(dāng)客戶端代理接收到來(lái)自客戶端的調(diào)用請(qǐng)求后,它將消息通過(guò)信道鏈向下傳遞。每個(gè)信道都會(huì)執(zhí)行相應(yīng)的消息的調(diào)用前處理,例如對(duì)消息的編碼、提供可靠的會(huì)話、對(duì)消息進(jìn)行加密等??蛻舳说淖詈笠粋€(gè)信道則是傳輸信道,根據(jù)配置的傳輸方式發(fā)送消息給宿主。
在宿主端,消息同樣通過(guò)信道鏈進(jìn)行傳輸。與客戶端信道相對(duì)應(yīng),宿主端信道也會(huì)對(duì)消息執(zhí)行相應(yīng)的宿主端的調(diào)用前處理,例如對(duì)消息的解碼、提供會(huì)話管理、對(duì)消息進(jìn)行解密等。宿主端的最后一個(gè)信道則負(fù)責(zé)將消息發(fā)送給消息分發(fā)器(Dispatcher),由分發(fā)器負(fù)責(zé)調(diào)用服務(wù)的實(shí)例。
■
圖2 WCF構(gòu)架示意圖
2.3 WCF的技術(shù)要素
作為基于SOA的一個(gè)框架產(chǎn)品,WCF最重要的就是能夠快捷的創(chuàng)建一個(gè)服務(wù)(Service)。如下圖所示,一個(gè)WCF Service由下面三部分構(gòu)成,如圖3所示。
■
圖3 WCF服務(wù)框架
1)Service Class:一個(gè)標(biāo)記了[ServiceContract]Attribute的類,在其中可能包含多個(gè)方法。除了標(biāo)記了一些WCF特有的Attribute外,這個(gè)類與一般的類沒(méi)有什么區(qū)別。
2)Host(宿主):可以是應(yīng)用程序,進(jìn)程如Windows Service等,它是WCF Service運(yùn)行的環(huán)境。
3)Endpoints:可以是一個(gè),也可以是一組,它是WCF實(shí)現(xiàn)通信的核心要素。
一個(gè)Endpoint由三部分組成:Address,Binding,Contract。便于記憶,我們往往將這三部分稱為是Endpoint的ABCs。
Address是Endpoint的網(wǎng)絡(luò)地址,它標(biāo)記了消息發(fā)送的目的地。
Binding描述的是如何發(fā)送消息,例如消息發(fā)送的傳輸協(xié)議(如TCP,HTTP),安全(如SSL,SOAP消息安全)。
Contract則描述的是消息所包含的內(nèi)容,以及消息的組織和操作方式,例如是one-way,duplex和request/reply。
所以Endpoint中的ABCs分別代表的含義就是:where,how,what。當(dāng)WCF發(fā)送消息時(shí),通過(guò)address知道消息發(fā)送的地址,通過(guò)binding知道怎樣來(lái)發(fā)送它,通過(guò)contract則知道發(fā)送的消息是什么。
在WCF中,類ServiceEndpoint代表了一個(gè)Endpoint,在類中包含的EndpointAddress,Binding,ContractDescription類型分別對(duì)應(yīng)Endpoint的Address,Binding,Contract。
3 分布式開發(fā)分析與設(shè)計(jì)
3.1 分布式處理概述
分布式處理是將應(yīng)用程序邏輯分布到2臺(tái)或者更多臺(tái)計(jì)算機(jī)上,在物理上或邏輯上分離的單元中。這一概念并不是新生事物,在大型工程已經(jīng)得到廣泛使用。只不過(guò),Internet的出現(xiàn)為分布式處理賦予了新的特征,Internet內(nèi)部連接的特性可以讓成百上千的計(jì)算機(jī)為一個(gè)任務(wù)工作,使得在更大規(guī)模上實(shí)施分布式處理成為可能,并跨越了傳統(tǒng)的B/S(客戶機(jī)/服務(wù)器)模型。
WCF整合了以前各種的分布式技術(shù),比如MSMQ,WEB Service,REMOTING等技術(shù),它提供對(duì)各種協(xié)議的支持,所以開發(fā)WCF項(xiàng)目和以往的項(xiàng)目完全不同,首先定義服務(wù)層,因?yàn)槠渫耆敲嫦蚍?wù)開發(fā)的,服務(wù)層包括了業(yè)務(wù)邏輯,數(shù)據(jù)訪問(wèn),安全行等等,然后通過(guò)WCF對(duì)外提供可調(diào)用接口,而這種接口通過(guò)服務(wù)契約生成一種URI地址,在WEB SERVER上進(jìn)行調(diào)用,所有的方法都通過(guò)proxy的機(jī)制引用進(jìn)去,在UI層只是遠(yuǎn)程調(diào)用服務(wù)層的東西,這樣,每個(gè)服務(wù)層都可以對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)構(gòu)成不同的系統(tǒng)平臺(tái),而UI部署在WEBSERVER上,提供對(duì)所用需要的數(shù)據(jù)的調(diào)用,這樣就形成了分布式數(shù)據(jù)調(diào)用方式和數(shù)據(jù)共享,這在以千兆內(nèi)網(wǎng)和大服務(wù)器機(jī)群支持的大型項(xiàng)目中是很好的一種應(yīng)用。
3.2 軟件設(shè)計(jì)
■
圖5 項(xiàng)目解決方案架構(gòu)圖
3.3 分層模型
■
圖6 分層模型
面向?qū)ο蟮摹⒒谀K化的組件設(shè)計(jì)需要能夠方便地修改應(yīng)用程序的各個(gè)部分。完成這一目標(biāo)的一種好方法就是在層上工作,將一個(gè)應(yīng)用程序的主要功能分離到不同的層或者級(jí)中。.Net Framework為創(chuàng)建可維護(hù)、可擴(kuò)展的層模式提供了豐富的支持,使得N層夠架取代傳統(tǒng)的客戶機(jī)/服務(wù)器模式而與Internet緊密結(jié)合。
從本質(zhì)上講,層代表了一個(gè)應(yīng)用程序主要的功能。一般地,我們將應(yīng)用程序功能分為三個(gè)方面,對(duì)應(yīng)3層架構(gòu)模式。它們是數(shù)據(jù)層、業(yè)務(wù)邏輯層和表示層。
數(shù)據(jù)層:包含數(shù)據(jù)存儲(chǔ)和與它交互的組件或服務(wù)。這些組件和服務(wù)在功能上和中間層相互獨(dú)立(盡管在物理上不必一定相互獨(dú)立--它們可以在同一臺(tái)服務(wù)器上)。
中間層:中間層也叫業(yè)務(wù)邏輯層。包括一個(gè)或者多個(gè)組件服務(wù),它們應(yīng)用商務(wù)規(guī)則、實(shí)現(xiàn)應(yīng)用程序邏輯并完成應(yīng)用程序運(yùn)行所需要的數(shù)據(jù)處理。作為這個(gè)過(guò)程的一部分,中間層負(fù)責(zé)處理來(lái)自數(shù)據(jù)存儲(chǔ)或者發(fā)送給數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)。WCF的服務(wù)主要在這一層進(jìn)行部署。
表示層:從中間層獲得信息并顯示給用戶。該層同時(shí)也負(fù)責(zé)和用戶進(jìn)行交互,比較返回的信息并將信息回送給中間層進(jìn)行處理。
可見,數(shù)據(jù)層從數(shù)據(jù)庫(kù)中獲得較為原始的數(shù)據(jù),商務(wù)層把數(shù)據(jù)轉(zhuǎn)換成符合商務(wù)規(guī)則的有意義的信息,表示層把信息轉(zhuǎn)換成對(duì)于用戶有意義的內(nèi)容。
這種分層設(shè)計(jì)方式很有用,因?yàn)槊恳粚佣伎梢元?dú)立地修改。我們可以修改商務(wù)層,不斷地從數(shù)據(jù)層接受相同的數(shù)據(jù),并把這些數(shù)據(jù)傳遞到表示層,而不用擔(dān)心出現(xiàn)歧義。我們也可以修改表示層,使得對(duì)于站點(diǎn)外觀的修改不必改動(dòng)下面的商務(wù)層邏輯。
軟件主要的功能是初步實(shí)現(xiàn)基于WCF的局域網(wǎng)內(nèi)或互聯(lián)網(wǎng)上的電子商務(wù)系統(tǒng),以面向服務(wù)為指導(dǎo)思想將具體開發(fā)過(guò)程分為電子商務(wù)的設(shè)計(jì)與實(shí)現(xiàn)、宿主的設(shè)計(jì)與實(shí)現(xiàn)以及即時(shí)電子商務(wù)客戶端的設(shè)計(jì)與實(shí)現(xiàn)三部分,使得應(yīng)用程序具有較好的安全性、并發(fā)性、可擴(kuò)展性以及可維護(hù)性。
3.3.1 服務(wù)的設(shè)計(jì)
服務(wù)的設(shè)計(jì)主要放到了業(yè)務(wù)邏輯層來(lái)實(shí)現(xiàn)。包括UILayer里面的ServiceProxy以及BLayer里面的所有文件。其中:
ServieceProxy用來(lái)定義服務(wù)代理,它里面暴露的方法供表示層來(lái)進(jìn)行調(diào)用,表示層只和ServiceProxy交互。ServiceProxy是調(diào)用BLayer里面的Contract,也即是WCF中的服務(wù)契約,這里的Contract全部用來(lái)存放接口。接口的實(shí)現(xiàn)放入Facade實(shí)現(xiàn),同時(shí)在Facade里面進(jìn)行一些業(yè)務(wù)規(guī)則的處理。Facade進(jìn)行完相關(guān)處理后,直接調(diào)用Rules里面的方法。Rules里面定義的是最小的原子方法,它們是和數(shù)據(jù)層進(jìn)行交互的。在Rules里面不進(jìn)行業(yè)務(wù)規(guī)則的運(yùn)算和處理,它里面定義的是最小最細(xì)的方法。
3.3.2 宿主端的設(shè)計(jì)(下轉(zhuǎn)第74頁(yè))
(上接第70頁(yè))
設(shè)計(jì)好服務(wù)之后,宿主端的設(shè)計(jì)相對(duì)簡(jiǎn)單,只是一個(gè)基于控制臺(tái)的應(yīng)用程序。首先建立一個(gè)ServiceHost類型的對(duì)象host,然后調(diào)用ServiceHost類型的實(shí)例方法Open即可啟動(dòng)宿主監(jiān)聽。需要注意的是在程序末尾應(yīng)當(dāng)調(diào)用Abort以及Close將資源釋放掉,或者利用using語(yǔ)句來(lái)自動(dòng)釋放所占用的資源。BLayer里面的ServiceHosts就是用來(lái)定義宿主的,它是進(jìn)行服務(wù)通信必不可少的。
3.3.3 客戶端的設(shè)計(jì)
客戶端的設(shè)計(jì)主要包括實(shí)現(xiàn)客戶端代理與配置文件、客戶端的回調(diào)接口契約的實(shí)現(xiàn)以及客戶端的窗體界面和Web界面的設(shè)計(jì)與代碼邏輯實(shí)現(xiàn)。
在客戶端配置文件中,地址、綁定、契約分別與宿主端配置所一一對(duì)應(yīng)。
項(xiàng)目里面的UILayer的WebProjects和WinFormProjects都是屬于客戶端即表示層的,它是直接面向用戶的。我們的項(xiàng)目實(shí)現(xiàn)了兩個(gè)版本,分別是Web網(wǎng)頁(yè)版和Windows應(yīng)用程序版。供客戶在不同的場(chǎng)合和條件下選擇使用。
3.3.4 數(shù)據(jù)層的設(shè)計(jì)
我們項(xiàng)目里面的Common和DLayer都是屬于數(shù)據(jù)層。這里將數(shù)據(jù)層簡(jiǎn)單的劃分為兩個(gè)小的模塊,Common用來(lái)定義數(shù)據(jù)實(shí)體,和數(shù)據(jù)庫(kù)中表的結(jié)構(gòu)是一一對(duì)應(yīng)的。DLayer用來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ)操作。
在項(xiàng)目部署的時(shí)候,我們就可以分別將WCF服務(wù)及數(shù)據(jù)端部署到不同的機(jī)器上,在物理上或邏輯上分離的單元中,從而實(shí)現(xiàn)了分布式開發(fā)。
4 結(jié)束語(yǔ)
建立可維護(hù)、可擴(kuò)展的站點(diǎn),開發(fā)高效率、高伸縮性的應(yīng)用程序、實(shí)現(xiàn)跨平臺(tái)、跨Internet的應(yīng)用集成、創(chuàng)建N層分布式應(yīng)用程序是擺在無(wú)數(shù)開發(fā)者面前的任務(wù)。傳統(tǒng)開發(fā)方式及技術(shù)面臨了困難。
對(duì)于使用 .NET Framework 進(jìn)行軟件研發(fā)的開發(fā)人員來(lái)說(shuō),WCF 是分布式編程領(lǐng)域的一個(gè)新臺(tái)階,關(guān)注 WCF 技術(shù)的發(fā)展趨勢(shì)并在實(shí)際開發(fā)項(xiàng)目中合理的運(yùn)用它是十分必要的。本文簡(jiǎn)要介紹了SOA的基本思想以及Microsoft用于構(gòu)建分布式面向服務(wù)系統(tǒng)的框架WCF的體系結(jié)構(gòu)與技術(shù)要素,并在開發(fā)一套電子商務(wù)系統(tǒng)軟件中充分利用了WCF基礎(chǔ)框架在開發(fā)面向服務(wù)的分布式應(yīng)用上帶給我們的強(qiáng)大功能與全新體驗(yàn),展現(xiàn)了基于WCF開發(fā)分布式軟件系統(tǒng)的編程方法與程序設(shè)計(jì)技巧。
參考文獻(xiàn):
[1] Juval Lowy.WCF Service編程[M].英文影印版.南京:東南大學(xué)出版社,2007.
[2] Michle Leroux Bustamante.學(xué)習(xí)WCF[M].英文影印版.南京:東南大學(xué)出版社,2007.
[3] Scott Klein.Professional WCF Programming: .NET Development with the Windows Communication Foundation[M].Wiley Publishing,2007.
[4] MSDN-MSDN Library. .NET Development-Windows Communication Foundation[EB/OL] http://msdn2.microsoft.com/en-us/library/ms735119.aspx.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文