用CORBA改进的三层WEB应用模型
2008-12-27
作者:王磊,路新春
1 引言
互联网技术及电子商务应用技术的跳跃式发展,极大地推动了能够处理商家对商家(B2B)和商家对客户(B2C)之间交互的新一代企业应用程序" title="应用程序">应用程序的开发。Java作为创建这种应用程序的主要语言而出现,它能够被大量的分布式应用" title="分布式应用">分布式应用系统所采用的主要原因在于其面向对象的编程思想和跨平台的移植性以及完善的安全性管理,同时它还提供了一个具有丰富的基础类库和开发工具的应用平台。CORBA是目前最具生命力的跨平台技术,它独立于网络协议、编程语言和软硬件平台、支持异构的分布式计算" title="分布式计算">分布式计算和不同编程语言的对象重用。基于目前流行的C++和Java等面向对象的程序设计语言,中间件软件开发商开发了相应的CORBA规范实现产品,如Borland公司的VisiBroker、Sun公司的Joe、INOA的Orbix、IBM的ComponentBorker等。正是基于CORBA产品的编程语言无关性和Java语言的平台无关性,目前众多的分布式应用软件系统采用“Java+CORBA产品+WEB”的设计模式。本文在作者研究开发工作的基础上,总结出了一个用CORBA改进的三层WEB应用模型,并以“配电自动化中的操作票生成系统”为例进行进一步说明。
2 现有三层WEB应用的弊端
目前多数B/S" title="B/S">B/S系统的工作原理为:客户端" title="客户端">客户端以浏览器的形式提供基本的图形用户界面(GUI)。用户通过浏览器创建用户逻辑并且向由URL(Uniform Recourse Locator)所指定Web服务器提出服务申请。在Web服务器对用户进行身份验证后,用HTTP协议把所需的文件资料传送给用户,客户端只是接受文件资料,并显示在WWW浏览器上。在Web服务器中使用CGI、ISAPI/NSAPI、JSP等技术编写全部应用逻辑,再配合后台数据库实现系统功能。这种应用结构目前被绝大部分企业信息系统所采用。但随着分布式技术的不断发展,这种结构暴露出了许多问题:
(1) 重复开发成本昂贵。当系统需要提供Internet/Intranet的存取形式时,旧的MIS系统都必须以新的软件技术编写一次,造成重复开发,而且当企业的运作流程改变时必须同时修改JavaServer和JDBC Servlet,又增加了系统运作的成本。
(2) 延展性问题。由于三层结构的WEB系统所有的逻辑都必须在Web服务器中实现,因此系统的延展性不佳,而服务器能够支持的客户端用户数目有一定的限度,当数目超过时,应用系统的执行效率便会下降,对于Internet和电子商务等的应用系统而言,这种客户端用户数目的限制是无法忍受的,所以需要使用更具有延展性的分布式结构,可以随着客户端用户数目的增加,进行负载平衡的调整。
3 用CORBA改进的三层WEB模型
3.1 CORBA是三层WEB结构的良好补充
CORBA现在已经成为公认的增强分布式计算的工具。CORBA的实现提供了开发下一代软件的基础,即开发可重用软件,就如同我们插上或拔下硬盘设备和内存条一样,我们也差不多可以在CORBA上插上或拔下网络,类库和应用程序。CORBA通过分布式对象计算,即分布式计算和和面向对象的结合,以实现软件重用。分布式对象计算有两个重要组成部分:
☉ 分布式计算和对象模型的结合
CORBA是这两者的完美结合,CORBA使应用程序能共享和访问其他应用程序的对象,效果是使这些对象对于所有实现了CORBA的应用程序来说都是一样的。
☉ 代理器的使用
CORBA使用代理器,或称中介,来处理系统中客户机与服务器间的消息(称为请求)。代理器能选中一个最符合客户机请求的服务器,并把客户机上所看到的接口从服务器的实现中分离出来。只要接口及其行为没变,就可以构造一个新的服务器或修改已有的服务器而无需改变客户机。
CORBA的这些特性,恰好能补充三层WEB结构的不足,为实现新型的三层结构提供了条件。
3.2 用CORBA改进了的三层WEB模型
在该模型中,第一层表示层采用Web浏览器提供用户界面,并通过从Web服务器上下载的Applet与CORBA中间件联系。第二层应用服务层主体为Web服务器和CORBA服务器。Web服务器向客户端提供HTML页面和Applet下载,当系统外部Internet/Intranet要访问数据库时则充当CORBA的另一个客户端。CORBA服务器负责与数据库服务器进行交互,它是脱离Web服务器而存在的,以一个独立的服务器形式与Web服务器一起运行。模型见图1
系统的工作过程如下:
(1) 客户端发送请求至Web服务器的Servlet,Servlet根据用户请求返回给用户包含Applet的HTML页面。Applet作为三层体系结构的表示层,用于与用户进行交互。
(2)当客户程序Applet要使用某个对象所提供的服务时,它首先要找到该对象实现的对象标识相应的STUB,并通过该STUB向本地的ORB核心发出请求,本地ORB再通过IIOP协议与远程ORB进行通信,远端ORB核心将请求发送给相应的对象适配器。
(3)对象适配器接受到请求后,查找相应的SKELETON,通过该SKELETON激活目标CORBA对象,CORBA对象执行相应的请求,进行相应的应用逻辑处理和数据库访问。
(4)执行结果经SKELETON打包后,按照对象请求传递和执行路径逆向地返回给客户。至此完成一次完整的请求调用。
(5)当用户通过Internet/Intranet访问数据库时,Web服务器根据用户权限把相应的Applet提供给STUB,再由相应的CORBA对象从数据库中检索相应的数据返回给用户。
4 具体应用实例
作者在近期参与开发了一个大型项目“配电自动化中的操作票生成系统”,其中就应用了基于CORBA的三层WEB模型。操作票生成系统主要目的是根据操作员对一段线路的动作(例如停电)从数据库检索出操作顺序,自动产生操作票,并提供浏览操作票历史数据,打印操作票,删除操作票等功能。由于基站(服务器)下面要带50~100个分站(客户端),而且各个分站的业务流量很大,而且根据不同用户的不同需求,需要经常改换业务逻辑。我们经过认真的研究,决定采用此WEB应用模型。
4.1 系统实现的主要步骤
4.1.1 ORB的选取
ORB虽然是一个中间件,但是它却是CORBA的基础。它可以建立对象之间的Client/Server关系。通过ORB,表示层的OMG IDL Stub可以透明的引用CORBA服务器上的一个Server skeleton对象的方法。ORB解释该调用并负责查找一个实现该请求的对象,找到后,把参数传给该对象,调用它的方法,最后返回结果。VisiBroker是Borland公司基于CORBA规范开发的分布式应用中间件软件产品,目前比较流行的是基于CORBA2.3版规范的VisiBroker for C++4.0、VisiBroker for java4.5.1。由于能够和先进的Java和C++开发环境互操作,VisiBroker强大的开发能力使关键任务应用的开发更容易、全面,降低了开发风险。所以我们选用VisiBroker作为ORB的基础结构。整个系统也是基于java编程的。
4.1.2 接口定义
基于VisiBroker开发分布式应用程序首先要对开发的分布式应用进行系统分析,确定需要在服务对象端实现的功能,编写IDL接口定义文件对需要在服务器对象端实现的对象以及对象中的方法、应用属性以及方法的异常等内容进行描述。其中的一段IDL语言描述如下:
//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中间件软件系统并设置相应路径后,利用下面的命令对IDL接口定义进行映射:prompt>idl2java Piaos.idl,分别生成服务对象框架代码和客户端存根代码,用于编写服务对象端应用程序以及客户端应用程序。
4.1.3 ORB客户机端的构建
启动该系统时,浏览器根据用户的权限及选择的操作,从Web服务器下载某一Applet 控件,Applet控件负责提供用户界面以及相应用户操作,并通过客户桩Stub向ORB提出请求。Stub提供一个因接口而异的API,客户机应用程序用桩类型激发API或动态激发API向服务器发送请求。
当使用桩类型激发时,所激发的请求在客户桩编译时就已经构造好了,客户桩被链接到客户机应用程序。使用桩类型激发,就是调用一个由接口定义所生成的Stub过程,这些接口定义包含有请求对象上的某个操作所需的信息。桩类型激发的特性为支持同步和单项通信形式,但不支持延迟同步通信(即异步通信),编程时有良好的类型校验,编译速度快,编程容易。
当用动态激发发送一个请求时,该请求完全是在运行时由接口仓库中的信息组成,这些信息用来查询以获取被请求对象操作的标记。虽然动态激发与桩类型激发相比较有支持所有通信形式、允许用户在系统上增加新的类而无须对客户代码作任何修改的优点,但是编程相对麻烦,编译速度也较慢。
根据需求分析,本系统采用同步通信就能达到预期效果,故采用桩类型激发。
下面的代码是浏览操作票的请求部分。
//browsePiao.java
…
public static void main(String[] args)
{
//获取对象请求代理初始化引用方法
org.omg.CORBA.ORB browsePiaoOrb=org.omg.CORBA.ORB.init(args,null);
short PiaoID=8;
//对服务器进行绑定
PiaoResource.Piaoifo piao_s=PiaoResource.PiaoifoHelper.bind(browsePiaoOrb,”/browsePiaoserver”,piaoserver);
…
}
4.1.4 ORB服务器端的构建
在CORBA2.3版规范中,定义了可移植对象适配器POA,用来代替原有的基本对象适配器BOA,从而增强了服务对象的动态性与可移植性。POA对象是服务对象端ORB与实现对象之间的桥梁。服务对象端ORB与服务实现对象间的关系如图2所示。
服务器端代码示例如下:
//Server.java
…
try
{
//创建服务对象端ORB
org.omg.CORBA.ORB ServerOrb=org.omg.CORBA.ORB.init(args.null);
//获取根POA对象实例
POA RootPOA=POAHelper.narrow(ServerOrb.resolve_initial_references(“RootPOA”));
//设置POA激活策略
org.omg.CORBA.Policy[] policies=
{
RootPOA.creat_lifespan_policy(LifespanPolicyValue.PERSISTENT)
};
//激活服务对象端POA
ServePOA.active_object_with_id(strPiao,instPI);
ServerOrb.run();
}
catch(Exception exp)
…
4.1.5 CORBA对象激活
在CORBA规范中,服务对象的实现代码在实现仓库中进行统一维护和管理。VisiBroker将实现仓库以对象激活进程(Object Activation Daemon,OAD)的形式实现。基于对象激活进程,将服务实现对象在对象激活进程中注册后,对象激活进程除了能够对实现对象的实例、对象接口信息等内容进行管理之外,还能够根据客户端提出的服务请求,在Smart Agent的协助下自动激活服务实现对象。本例中具体实现步骤为:首先启动Smart Agent,再执行启动对象激活进程的应用程序工具oad.exe以在网络中运行OAD,然后运行对对象激活进程进行维护的应用程序工具oadutil.exe向OAD注册CORBA对象实现的有关信息;注册信息不会因为OAD的关闭而丢失。例如,在MSDOS窗口中输入下面命令可以将Piaos模块中的browsePiao接口注册在对象激活进程中:prompt>oadutil reg –i Piaos::browsePiao。这样,SmartAgent一旦发现没有可用的对象实例,就会通知OAD,而OAD将根据用户的设置启动CORBA服务器,创建、激活对象实例,我们就不必事先启动CORBA服务器就可以直接运行CORBA客户程序。
4.2 开发后的心得体会
这种用CORBA改进的三层WEB模式虽然开发周期比单纯的B/S系统要长,但是运转效果要远远好于后者,它融合了B/S客户端的简洁和三层C/S结构的分布式对象技术,基本实现了客户端的“零”管理,VisiBroker提供的线程池极大的改善了服务对象的性能,减少了客户端连接等待时间。如果客户端的业务规则需要改动,可以在服务器上直接修改相应的组件并进行编译,无需对其他组件进行改动。由于中间层CORBA组件提供了身份验证及授权,安全性得到了进一步加强,而且由于CORBA的可重用性,今后系统要扩容或者升级的话,可以在中间件上直接挂接一个数据库服务器就行了。
5 结束语
WEB访问数据库技术从单层发展到多层表明实现WEB应用系统的趋势是模块独立性更大,可重用性更高,层次划分更加细致。目前,硬件环境的主流是由大型机转向网络化的小型机群,软件环境的主流是由大而复杂的综合模块转向更易于抽象和管理的对象技术。而基于CORBA的多层模式正符合了这种潮流。现在很多作业管理系统已运用WEB方式,而将CORBA与Java结合的方式运用在WEB管理上不失为一种很好的选择,这种CORBA和WEB技术相结合的模式会有很光明的应用前景。
参考文献
1.JDBC与Java数据库程序设计 人们以邮电出版社 张龙祥 刘丽钰 等
2.OMG.CORBA系统结构、原理与规范 北京:电子工业出版社,2000.
3.Java 分布式应用程序设计 苏洋 北京希望电子出版社