《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 業(yè)界動(dòng)態(tài) > 用CORBA改進(jìn)的三層WEB應(yīng)用模型

用CORBA改進(jìn)的三層WEB應(yīng)用模型

2008-12-27
作者:王磊,路新春

1 引言
??? 互聯(lián)網(wǎng)技術(shù)及電子商務(wù)應(yīng)用技術(shù)的跳躍式發(fā)展,極大地推動(dòng)了能夠處理商家對(duì)商家(B2B)和商家對(duì)客戶(B2C)之間交互的新一代企業(yè)應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序的開發(fā)。Java作為創(chuàng)建這種應(yīng)用程序的主要語(yǔ)言而出現(xiàn),它能夠被大量的分布式應(yīng)用" title="分布式應(yīng)用">分布式應(yīng)用系統(tǒng)所采用的主要原因在于其面向?qū)ο蟮木幊趟枷牒涂缙脚_(tái)的移植性以及完善的安全性管理,同時(shí)它還提供了一個(gè)具有豐富的基礎(chǔ)類庫(kù)和開發(fā)工具的應(yīng)用平臺(tái)。CORBA是目前最具生命力的跨平臺(tái)技術(shù),它獨(dú)立于網(wǎng)絡(luò)協(xié)議、編程語(yǔ)言和軟硬件平臺(tái)、支持異構(gòu)的分布式計(jì)算" title="分布式計(jì)算">分布式計(jì)算和不同編程語(yǔ)言的對(duì)象重用。基于目前流行的C++和Java等面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,中間件軟件開發(fā)商開發(fā)了相應(yīng)的CORBA規(guī)范實(shí)現(xiàn)產(chǎn)品,如Borland公司的VisiBroker、Sun公司的Joe、INOA的Orbix、IBM的ComponentBorker等。正是基于CORBA產(chǎn)品的編程語(yǔ)言無(wú)關(guān)性和Java語(yǔ)言的平臺(tái)無(wú)關(guān)性,目前眾多的分布式應(yīng)用軟件系統(tǒng)采用“Java+CORBA產(chǎn)品+WEB”的設(shè)計(jì)模式。本文在作者研究開發(fā)工作的基礎(chǔ)上,總結(jié)出了一個(gè)用CORBA改進(jìn)的三層WEB應(yīng)用模型,并以“配電自動(dòng)化中的操作票生成系統(tǒng)”為例進(jìn)行進(jìn)一步說(shuō)明。

2 現(xiàn)有三層WEB應(yīng)用的弊端
?? 目前多數(shù)B/S" title="B/S">B/S系統(tǒng)的工作原理為:客戶端" title="客戶端">客戶端以瀏覽器的形式提供基本的圖形用戶界面(GUI)。用戶通過(guò)瀏覽器創(chuàng)建用戶邏輯并且向由URL(Uniform Recourse Locator)所指定Web服務(wù)器提出服務(wù)申請(qǐng)。在Web服務(wù)器對(duì)用戶進(jìn)行身份驗(yàn)證后,用HTTP協(xié)議把所需的文件資料傳送給用戶,客戶端只是接受文件資料,并顯示在WWW瀏覽器上。在Web服務(wù)器中使用CGI、ISAPI/NSAPI、JSP等技術(shù)編寫全部應(yīng)用邏輯,再配合后臺(tái)數(shù)據(jù)庫(kù)實(shí)現(xiàn)系統(tǒng)功能。這種應(yīng)用結(jié)構(gòu)目前被絕大部分企業(yè)信息系統(tǒng)所采用。但隨著分布式技術(shù)的不斷發(fā)展,這種結(jié)構(gòu)暴露出了許多問(wèn)題:
(1) 重復(fù)開發(fā)成本昂貴。當(dāng)系統(tǒng)需要提供Internet/Intranet的存取形式時(shí),舊的MIS系統(tǒng)都必須以新的軟件技術(shù)編寫一次,造成重復(fù)開發(fā),而且當(dāng)企業(yè)的運(yùn)作流程改變時(shí)必須同時(shí)修改JavaServer和JDBC Servlet,又增加了系統(tǒng)運(yùn)作的成本。
?(2) 延展性問(wèn)題。由于三層結(jié)構(gòu)的WEB系統(tǒng)所有的邏輯都必須在Web服務(wù)器中實(shí)現(xiàn),因此系統(tǒng)的延展性不佳,而服務(wù)器能夠支持的客戶端用戶數(shù)目有一定的限度,當(dāng)數(shù)目超過(guò)時(shí),應(yīng)用系統(tǒng)的執(zhí)行效率便會(huì)下降,對(duì)于Internet和電子商務(wù)等的應(yīng)用系統(tǒng)而言,這種客戶端用戶數(shù)目的限制是無(wú)法忍受的,所以需要使用更具有延展性的分布式結(jié)構(gòu),可以隨著客戶端用戶數(shù)目的增加,進(jìn)行負(fù)載平衡的調(diào)整。

3 用CORBA改進(jìn)的三層WEB模型
3.1 CORBA是三層WEB結(jié)構(gòu)的良好補(bǔ)充
CORBA現(xiàn)在已經(jīng)成為公認(rèn)的增強(qiáng)分布式計(jì)算的工具。CORBA的實(shí)現(xiàn)提供了開發(fā)下一代軟件的基礎(chǔ),即開發(fā)可重用軟件,就如同我們插上或拔下硬盤設(shè)備和內(nèi)存條一樣,我們也差不多可以在CORBA上插上或拔下網(wǎng)絡(luò),類庫(kù)和應(yīng)用程序。CORBA通過(guò)分布式對(duì)象計(jì)算,即分布式計(jì)算和和面向?qū)ο蟮慕Y(jié)合,以實(shí)現(xiàn)軟件重用。分布式對(duì)象計(jì)算有兩個(gè)重要組成部分:
☉ 分布式計(jì)算和對(duì)象模型的結(jié)合
?? CORBA是這兩者的完美結(jié)合,CORBA使應(yīng)用程序能共享和訪問(wèn)其他應(yīng)用程序的對(duì)象,效果是使這些對(duì)象對(duì)于所有實(shí)現(xiàn)了CORBA的應(yīng)用程序來(lái)說(shuō)都是一樣的。
☉ 代理器的使用
?? CORBA使用代理器,或稱中介,來(lái)處理系統(tǒng)中客戶機(jī)與服務(wù)器間的消息(稱為請(qǐng)求)。代理器能選中一個(gè)最符合客戶機(jī)請(qǐng)求的服務(wù)器,并把客戶機(jī)上所看到的接口從服務(wù)器的實(shí)現(xiàn)中分離出來(lái)。只要接口及其行為沒(méi)變,就可以構(gòu)造一個(gè)新的服務(wù)器或修改已有的服務(wù)器而無(wú)需改變客戶機(jī)。
CORBA的這些特性,恰好能補(bǔ)充三層WEB結(jié)構(gòu)的不足,為實(shí)現(xiàn)新型的三層結(jié)構(gòu)提供了條件。
3.2 用CORBA改進(jìn)了的三層WEB模型
??? 在該模型中,第一層表示層采用Web瀏覽器提供用戶界面,并通過(guò)從Web服務(wù)器上下載的Applet與CORBA中間件聯(lián)系。第二層應(yīng)用服務(wù)層主體為Web服務(wù)器和CORBA服務(wù)器。Web服務(wù)器向客戶端提供HTML頁(yè)面和Applet下載,當(dāng)系統(tǒng)外部Internet/Intranet要訪問(wèn)數(shù)據(jù)庫(kù)時(shí)則充當(dāng)CORBA的另一個(gè)客戶端。CORBA服務(wù)器負(fù)責(zé)與數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行交互,它是脫離Web服務(wù)器而存在的,以一個(gè)獨(dú)立的服務(wù)器形式與Web服務(wù)器一起運(yùn)行。模型見圖1

??? 系統(tǒng)的工作過(guò)程如下:
(1) 客戶端發(fā)送請(qǐng)求至Web服務(wù)器的Servlet,Servlet根據(jù)用戶請(qǐng)求返回給用戶包含Applet的HTML頁(yè)面。Applet作為三層體系結(jié)構(gòu)的表示層,用于與用戶進(jìn)行交互。
(2)當(dāng)客戶程序Applet要使用某個(gè)對(duì)象所提供的服務(wù)時(shí),它首先要找到該對(duì)象實(shí)現(xiàn)的對(duì)象標(biāo)識(shí)相應(yīng)的STUB,并通過(guò)該STUB向本地的ORB核心發(fā)出請(qǐng)求,本地ORB再通過(guò)IIOP協(xié)議與遠(yuǎn)程ORB進(jìn)行通信,遠(yuǎn)端ORB核心將請(qǐng)求發(fā)送給相應(yīng)的對(duì)象適配器。
(3)對(duì)象適配器接受到請(qǐng)求后,查找相應(yīng)的SKELETON,通過(guò)該SKELETON激活目標(biāo)CORBA對(duì)象,CORBA對(duì)象執(zhí)行相應(yīng)的請(qǐng)求,進(jìn)行相應(yīng)的應(yīng)用邏輯處理和數(shù)據(jù)庫(kù)訪問(wèn)。
(4)執(zhí)行結(jié)果經(jīng)SKELETON打包后,按照對(duì)象請(qǐng)求傳遞和執(zhí)行路徑逆向地返回給客戶。至此完成一次完整的請(qǐng)求調(diào)用。
(5)當(dāng)用戶通過(guò)Internet/Intranet訪問(wèn)數(shù)據(jù)庫(kù)時(shí),Web服務(wù)器根據(jù)用戶權(quán)限把相應(yīng)的Applet提供給STUB,再由相應(yīng)的CORBA對(duì)象從數(shù)據(jù)庫(kù)中檢索相應(yīng)的數(shù)據(jù)返回給用戶。

4 具體應(yīng)用實(shí)例
??? 作者在近期參與開發(fā)了一個(gè)大型項(xiàng)目“配電自動(dòng)化中的操作票生成系統(tǒng)”,其中就應(yīng)用了基于CORBA的三層WEB模型。操作票生成系統(tǒng)主要目的是根據(jù)操作員對(duì)一段線路的動(dòng)作(例如停電)從數(shù)據(jù)庫(kù)檢索出操作順序,自動(dòng)產(chǎn)生操作票,并提供瀏覽操作票歷史數(shù)據(jù),打印操作票,刪除操作票等功能。由于基站(服務(wù)器)下面要帶50~100個(gè)分站(客戶端),而且各個(gè)分站的業(yè)務(wù)流量很大,而且根據(jù)不同用戶的不同需求,需要經(jīng)常改換業(yè)務(wù)邏輯。我們經(jīng)過(guò)認(rèn)真的研究,決定采用此WEB應(yīng)用模型。
4.1 系統(tǒng)實(shí)現(xiàn)的主要步驟
4.1.1 ORB的選取

??? ORB雖然是一個(gè)中間件,但是它卻是CORBA的基礎(chǔ)。它可以建立對(duì)象之間的Client/Server關(guān)系。通過(guò)ORB,表示層的OMG IDL Stub可以透明的引用CORBA服務(wù)器上的一個(gè)Server skeleton對(duì)象的方法。ORB解釋該調(diào)用并負(fù)責(zé)查找一個(gè)實(shí)現(xiàn)該請(qǐng)求的對(duì)象,找到后,把參數(shù)傳給該對(duì)象,調(diào)用它的方法,最后返回結(jié)果。VisiBroker是Borland公司基于CORBA規(guī)范開發(fā)的分布式應(yīng)用中間件軟件產(chǎn)品,目前比較流行的是基于CORBA2.3版規(guī)范的VisiBroker for C++4.0、VisiBroker for java4.5.1。由于能夠和先進(jìn)的Java和C++開發(fā)環(huán)境互操作,VisiBroker強(qiáng)大的開發(fā)能力使關(guān)鍵任務(wù)應(yīng)用的開發(fā)更容易、全面,降低了開發(fā)風(fēng)險(xiǎn)。所以我們選用VisiBroker作為ORB的基礎(chǔ)結(jié)構(gòu)。整個(gè)系統(tǒng)也是基于java編程的。
4.1.2 接口定義
??? 基于VisiBroker開發(fā)分布式應(yīng)用程序首先要對(duì)開發(fā)的分布式應(yīng)用進(jìn)行系統(tǒng)分析,確定需要在服務(wù)對(duì)象端實(shí)現(xiàn)的功能,編寫IDL接口定義文件對(duì)需要在服務(wù)器對(duì)象端實(shí)現(xiàn)的對(duì)象以及對(duì)象中的方法、應(yīng)用屬性以及方法的異常等內(nèi)容進(jìn)行描述。其中的一段IDL語(yǔ)言描述如下:
//Piaos.idl
module Piaos
{
? enum Piaoifo? {Piao_date,Piao_man};
?? …
?? interface Piaos
???? {
???????? void delet? (in Piaoifo reason, in string description);
???????? string browsePiao (in short PiaoID);
???????? …
????? }
????? …
}
??? 在安裝了VisiBroker中間件軟件系統(tǒng)并設(shè)置相應(yīng)路徑后,利用下面的命令對(duì)IDL接口定義進(jìn)行映射:prompt>idl2java Piaos.idl,分別生成服務(wù)對(duì)象框架代碼和客戶端存根代碼,用于編寫服務(wù)對(duì)象端應(yīng)用程序以及客戶端應(yīng)用程序。
4.1.3 ORB客戶機(jī)端的構(gòu)建
??? 啟動(dòng)該系統(tǒng)時(shí),瀏覽器根據(jù)用戶的權(quán)限及選擇的操作,從Web服務(wù)器下載某一Applet 控件,Applet控件負(fù)責(zé)提供用戶界面以及相應(yīng)用戶操作,并通過(guò)客戶樁Stub向ORB提出請(qǐng)求。Stub提供一個(gè)因接口而異的API,客戶機(jī)應(yīng)用程序用樁類型激發(fā)API或動(dòng)態(tài)激發(fā)API向服務(wù)器發(fā)送請(qǐng)求。
??? 當(dāng)使用樁類型激發(fā)時(shí),所激發(fā)的請(qǐng)求在客戶樁編譯時(shí)就已經(jīng)構(gòu)造好了,客戶樁被鏈接到客戶機(jī)應(yīng)用程序。使用樁類型激發(fā),就是調(diào)用一個(gè)由接口定義所生成的Stub過(guò)程,這些接口定義包含有請(qǐng)求對(duì)象上的某個(gè)操作所需的信息。樁類型激發(fā)的特性為支持同步和單項(xiàng)通信形式,但不支持延遲同步通信(即異步通信),編程時(shí)有良好的類型校驗(yàn),編譯速度快,編程容易。
??? 當(dāng)用動(dòng)態(tài)激發(fā)發(fā)送一個(gè)請(qǐng)求時(shí),該請(qǐng)求完全是在運(yùn)行時(shí)由接口倉(cāng)庫(kù)中的信息組成,這些信息用來(lái)查詢以獲取被請(qǐng)求對(duì)象操作的標(biāo)記。雖然動(dòng)態(tài)激發(fā)與樁類型激發(fā)相比較有支持所有通信形式、允許用戶在系統(tǒng)上增加新的類而無(wú)須對(duì)客戶代碼作任何修改的優(yōu)點(diǎn),但是編程相對(duì)麻煩,編譯速度也較慢。
??? 根據(jù)需求分析,本系統(tǒng)采用同步通信就能達(dá)到預(yù)期效果,故采用樁類型激發(fā)。
??? 下面的代碼是瀏覽操作票的請(qǐng)求部分。
??? //browsePiao.java
?? …
?? public static void main(String[] args)
?? {
??????? //獲取對(duì)象請(qǐng)求代理初始化引用方法
??????? org.omg.CORBA.ORB browsePiaoOrb=org.omg.CORBA.ORB.init(args,null);
??????? short PiaoID=8;
??????? //對(duì)服務(wù)器進(jìn)行綁定
??????? PiaoResource.Piaoifo piao_s=PiaoResource.PiaoifoHelper.bind(browsePiaoOrb,”/browsePiaoserver”,piaoserver);
??????? …
}

4.1.4 ORB服務(wù)器端的構(gòu)建
??? 在CORBA2.3版規(guī)范中,定義了可移植對(duì)象適配器POA,用來(lái)代替原有的基本對(duì)象適配器BOA,從而增強(qiáng)了服務(wù)對(duì)象的動(dòng)態(tài)性與可移植性。POA對(duì)象是服務(wù)對(duì)象端ORB與實(shí)現(xiàn)對(duì)象之間的橋梁。服務(wù)對(duì)象端ORB與服務(wù)實(shí)現(xiàn)對(duì)象間的關(guān)系如圖2所示。

??? 服務(wù)器端代碼示例如下:
//Server.java

? try
{
?? //創(chuàng)建服務(wù)對(duì)象端ORB
?? org.omg.CORBA.ORB ServerOrb=org.omg.CORBA.ORB.init(args.null);
?? //獲取根POA對(duì)象實(shí)例
?? POA RootPOA=POAHelper.narrow(ServerOrb.resolve_initial_references(“RootPOA”));
?? //設(shè)置POA激活策略
?? org.omg.CORBA.Policy[] policies=
?? {
????? RootPOA.creat_lifespan_policy(LifespanPolicyValue.PERSISTENT)
};
?? //激活服務(wù)對(duì)象端POA
?? ServePOA.active_object_with_id(strPiao,instPI);
?????? ServerOrb.run();
}
catch(Exception exp)

4.1.5 CORBA對(duì)象激活
??? 在CORBA規(guī)范中,服務(wù)對(duì)象的實(shí)現(xiàn)代碼在實(shí)現(xiàn)倉(cāng)庫(kù)中進(jìn)行統(tǒng)一維護(hù)和管理。VisiBroker將實(shí)現(xiàn)倉(cāng)庫(kù)以對(duì)象激活進(jìn)程(Object Activation Daemon,OAD)的形式實(shí)現(xiàn)?;趯?duì)象激活進(jìn)程,將服務(wù)實(shí)現(xiàn)對(duì)象在對(duì)象激活進(jìn)程中注冊(cè)后,對(duì)象激活進(jìn)程除了能夠?qū)?shí)現(xiàn)對(duì)象的實(shí)例、對(duì)象接口信息等內(nèi)容進(jìn)行管理之外,還能夠根據(jù)客戶端提出的服務(wù)請(qǐng)求,在Smart Agent的協(xié)助下自動(dòng)激活服務(wù)實(shí)現(xiàn)對(duì)象。本例中具體實(shí)現(xiàn)步驟為:首先啟動(dòng)Smart Agent,再執(zhí)行啟動(dòng)對(duì)象激活進(jìn)程的應(yīng)用程序工具oad.exe以在網(wǎng)絡(luò)中運(yùn)行OAD,然后運(yùn)行對(duì)對(duì)象激活進(jìn)程進(jìn)行維護(hù)的應(yīng)用程序工具oadutil.exe向OAD注冊(cè)CORBA對(duì)象實(shí)現(xiàn)的有關(guān)信息;注冊(cè)信息不會(huì)因?yàn)镺AD的關(guān)閉而丟失。例如,在MSDOS窗口中輸入下面命令可以將Piaos模塊中的browsePiao接口注冊(cè)在對(duì)象激活進(jìn)程中:prompt>oadutil reg –i Piaos::browsePiao。這樣,SmartAgent一旦發(fā)現(xiàn)沒(méi)有可用的對(duì)象實(shí)例,就會(huì)通知OAD,而OAD將根據(jù)用戶的設(shè)置啟動(dòng)CORBA服務(wù)器,創(chuàng)建、激活對(duì)象實(shí)例,我們就不必事先啟動(dòng)CORBA服務(wù)器就可以直接運(yùn)行CORBA客戶程序。
4.2 開發(fā)后的心得體會(huì)
??? 這種用CORBA改進(jìn)的三層WEB模式雖然開發(fā)周期比單純的B/S系統(tǒng)要長(zhǎng),但是運(yùn)轉(zhuǎn)效果要遠(yuǎn)遠(yuǎn)好于后者,它融合了B/S客戶端的簡(jiǎn)潔和三層C/S結(jié)構(gòu)的分布式對(duì)象技術(shù),基本實(shí)現(xiàn)了客戶端的“零”管理,VisiBroker提供的線程池極大的改善了服務(wù)對(duì)象的性能,減少了客戶端連接等待時(shí)間。如果客戶端的業(yè)務(wù)規(guī)則需要改動(dòng),可以在服務(wù)器上直接修改相應(yīng)的組件并進(jìn)行編譯,無(wú)需對(duì)其他組件進(jìn)行改動(dòng)。由于中間層CORBA組件提供了身份驗(yàn)證及授權(quán),安全性得到了進(jìn)一步加強(qiáng),而且由于CORBA的可重用性,今后系統(tǒng)要擴(kuò)容或者升級(jí)的話,可以在中間件上直接掛接一個(gè)數(shù)據(jù)庫(kù)服務(wù)器就行了。

5 結(jié)束語(yǔ)
??? WEB訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)從單層發(fā)展到多層表明實(shí)現(xiàn)WEB應(yīng)用系統(tǒng)的趨勢(shì)是模塊獨(dú)立性更大,可重用性更高,層次劃分更加細(xì)致。目前,硬件環(huán)境的主流是由大型機(jī)轉(zhuǎn)向網(wǎng)絡(luò)化的小型機(jī)群,軟件環(huán)境的主流是由大而復(fù)雜的綜合模塊轉(zhuǎn)向更易于抽象和管理的對(duì)象技術(shù)。而基于CORBA的多層模式正符合了這種潮流。現(xiàn)在很多作業(yè)管理系統(tǒng)已運(yùn)用WEB方式,而將CORBA與Java結(jié)合的方式運(yùn)用在WEB管理上不失為一種很好的選擇,這種CORBA和WEB技術(shù)相結(jié)合的模式會(huì)有很光明的應(yīng)用前景。

參考文獻(xiàn)

1.JDBC與Java數(shù)據(jù)庫(kù)程序設(shè)計(jì)?? 人們以郵電出版社? 張龍祥 劉麗鈺 等
2.OMG.CORBA系統(tǒng)結(jié)構(gòu)、原理與規(guī)范?????????? 北京:電子工業(yè)出版社,2000.
3.Java 分布式應(yīng)用程序設(shè)計(jì)????? 蘇洋???????????? 北京希望電子出版社

?

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。