基于Java的应用服务器的设计与实现阮彤.docx
《基于Java的应用服务器的设计与实现阮彤.docx》由会员分享,可在线阅读,更多相关《基于Java的应用服务器的设计与实现阮彤.docx(26页珍藏版)》请在冰点文库上搜索。
基于Java的应用服务器的设计与实现阮彤
基于Java的应用服务器的设计与实现
阮 彤① 李 京① 冯东雷②
①(中国科学院软件研究所计算机科学开放研究实验室对象技术中心 北京 100080)
②(上海交通大学计算机科学与工程系 上海 200030)
(ruan@otcaix.iscas.ac.cn)
目前,新一代的应用服务器开始集成传统的应用服务
器与Web应用服务器的功能.例如,Sybase的EA
Server3.0包含了动态页面服务器——PowerDynamo
与组件应用服务器——JaguarComponentTransac-
tionServer.
1999年3月,Sun推出了Java2platform,
EnterpriseEdition(J2EE).J2EE面向基于Java与
Web的企业级应用开发,其包含了一个应用程序模
型、一组API以及一个参考实现.目前,大多数主流
应用服务器都开始支持J2EE,如,IBMWebSphere
3.0[3],SybaseEAServer3.5,BEAWebLogic
Server4.5[4]等.
尽管J2EE的各种兼容实现已经开始在业界使
用,但是,J2EE作为规范,本身设计存在着一些缺
点,而这些缺点与基于Web应用的体系结构,以及
分布式组件技术的使用都有着密切的关系.如何合
理使用J2EE中的各项技术,以及Java语言、EJB组
件标准给应用服务器的设计带来哪些便利与缺点
等,都是理论与实践中值得探讨的问题.
本文的第2节从Web应用的体系结构与应用
开发范型角度,剖析了J2EE的应用程序模型;第3
节指出了J2EE与EJB在版本管理上的缺陷;第4
节给出了JWebFrame——一个基于Java的轻量级
服务器的设计与实现;最后一部分比较了两个设计
各自的优缺点,展望了基于Java的Web应用服务
器的未来.
2 J2EE的应用程序模型
2.1 Web应用的体系结构
传统的3层体系结构模型是:
包含表示逻辑的
客户层,包含应用逻辑的中间层应用服务器,以及表
示事务处理与存储的数据库层.Web的出现使应用
服务器的功能发生了变化,因为此时的应用服务器
既包含了应用逻辑,又包含了表示逻辑.代表了表示
逻辑的HTML在中间层产生,又下载到客户端浏
览器.中间层的双重功能有3种实现方式:
①直接用程序设计语言编程,返回的结果是一
个Web页面,如CGI程序;
②在HTML页面中嵌入一些可执行的代码,
如ASP程序;
③分成两个文件,一个是HTML模板,另外一
个是应用逻辑,存放应用逻辑的程序运行后将结果
输送到HTML模板文件中.
微软的idc/htx组合采用的就是第3种方法.
从概念的清晰度与程序的可维护性角度来说,第3
种是最理想的方法.在J2EE中,Servlet,JSP分别
属于第1种、第2种方法.但是,如果用户将主要的
应用逻辑放在服务器端JavaBeans中,那么JSP+
JavaBeans也可以看作是第3种方法.
在J2EE中,将体系结构与开发范型等统称为
应用程序模型.J2EE的体系结构如图1所示,其被
分为4层:
①客户层,客户层可以是基于浏览器的,也可
以是普通的J2EE客户.
②Web容器层,支持基于Web的开发.包含
Web服务器、JSP、服务器端JavaBeans和Servlet.
③EJB(enterpriseJavaBeans)容器层,一个管
理和调度EJB组件的EJB服务器以及相应的EJB
池.
④EIS层,原有的企业信息系统.
图1 J2EE多层结构示意图
从J2EE[5]的设计者角度来说,其提供给用户的
是一个灵活而又完备的解决方案:
(1)在非Web应用中,直接使用EJB组件以及
J2EE独立客户端,形成完整的基于组件的软件开发.
(2)在Web应用中,使用J2EE合适的方法是,
对于轻量级的应用,使用JSP+服务器端JavaBeans
的体系结构;对于重量级的应用,使用JSP+服务器
端JavaBeans+EJB的体系结构.JSP相对于Servlet
940计算机研究与发展2001年
大好处在于可以方便用户将表示逻辑与应用逻
辑分离.从MVC的结构来看,JSP存放表示逻辑,
服务端JavaBeans存放控制逻辑,而应用模型放在
EJB中,可能是J2EE设计者的初衷.对于习惯于使
用Java的程序员来说,使用Servlet+JavaAPI可
能是比较好的方法.
(3)在复杂应用中,用户可以使用JSP+
Servlet+JavaAPI+JavaBeans+EJB的方案,这5
种接口在使用时可以相互调用,体现了J2EE设计
的灵活性.
然而,下面两个问题会困扰J2EE的使用:
(1)应用逻辑的放置
在图1中可见,JSP与服务端JavaBeans在
Web容器中,而EJB在另一个容器中,两个容器是
通过RMI连接起来的,使用RMI调用意味着两者
是一种弱耦合关系.如果JSP、服务端JavaBeans、
EJB分别包含的是MVC中视图、控制与模型,那么
控制与模型的分离对于应用开发与调试都是不合适
的.
从理论上说,JSP,Servlet,JavaAPI,服务器端
JavaBeans,EJB都有存放应用逻辑的功能,那么,应
用逻辑如何放置就成为用户要着重考虑的问题.应
用逻辑的随意放置将降低程序的可维护性.J2EE只
是提供了一个基础平台,它的合理使用需要用户对
特定应用、特定技术的洞察.
(2)J2EE多层次、多技术并存的设计加剧了开
发的难度,降低了程序的性能.
当一个应用被分割成多个层次时,程序出错的
可能性会更大,而排错的难度也更大,当程序测试
时,需要测试的环节会更多.例如,在JSP中使用
Scriptlet调用了JavaAPI与服务器端JavaBeans,
进而又调用了EJB,那么如果执行一个JSP文件出
错,可能会是其中任何一个环节错.如果JSP文件
又具有在客户端运行的JavaScript,程序调试的难
度又增加了一个数量级.
多层结构对应用性能也带来了负面影响,在
J2EE中,JSP引擎建立在JavaServlet引擎之上,
Web容器层与EJB容器层用RMI连接,而RMI又
使用TCP/IP协议栈,这些都极大地降低了J2EE
平台的运行效率.
2.2 组件技术的使用
在J2EE中,组件技术的使用体现在两个方面:
①EJB与服务器端JavaBeans;②基于组件的开发范
型.组件技术从理论上确实具有无可辩驳的优点.其
分离了接口与实现,使得程序在二进制层次上兼容,
提高了程序的可重用性,同时,组件的初始化、调用、
清除等,都由组件服务器统一管理,提高了程序的易
管理性.组件与组件之间的耦合度低于对象与对象之
间的耦合度,提高了程序的健壮性.基于组件的开发
范型将加快软件的开发速度,提高软件的可重用性.
然而,这些优越性在J2EE中并不能得到很好
的体现.首先,EJB标准完全基于Java,没有其它语
言版本的实现,二进制兼容无从谈起.同时,Java程
序设计语言本身就有了接口概念,其完整的异常处
理机制,以及垃圾自动回收机制,减小了EJB存在
的意义.同时,在Web容器层,使用的是服务器端
JavaBeans,服务器端JavaBeans的概念只在JSP规
范中出现,而其与AWTJavaBeans以及EJB的关
系并不是十分明朗.JSP页面使用的JavaBeans与
AWTJavaBeans组件并不相同[6],这些JavaBeans
只是使用get与set方法将属性暴露出来,其与Java
类之间的差别很小.也就是说,Sun有3种不同的基
于Java的组件——EJB,AWTJavaBeans与服务
器端JavaBeans,初学者很容易混淆这些概念.
J2EE中采取的基于组件的开发范型如图2所
示.一个J2EE程序的开发周期分为3个步骤:
①组件供应商供应各种组件.
②通过组件级的描述符,组件被应用程序组装
员构造成模块.
③应用程序部署员将多个模块组合成应用,部
署到目标运行平台上.
图2 J2EE应用的生命周期[5]
在实际的Web应用开发中,程序员往往是一边
修改页面或程序,一边查看其执行效果.组件的开
发、组装与部署是一个反复的过程,三者的割裂给程
序员带来不便.在不少J2EE的兼容产品中,应用部
署工具是独立于开发环境的,这更增加了应用开发
的不便.
总之,J2EE复杂的体系结构来源于:
①Web应
9418期阮 彤等:
基于Java的应用服务器的设计与实现
务器的多种功能包括支持多种通信协议,兼顾
表示逻辑与应用逻辑等等.②基于组件的开发范型
与普通的面向对象开发范型之间的差距,以及基于
标签的语言与传统的程序设计语言之间的差距.复
杂的体系结构给程序的开发、调试、可维护性都带来
了负面影响,对于用户来说,选择基于Web的应用
开发是必然,虽然Web应用的调试与维护将远远复
杂于传统的应用,而J2EE的复杂性只是Web应用
复杂性的一种体现.同样,融入组件技术是为了增加
应用的开发速度,提高程序的可维护性.然而,在传
统的开发范型中加入新的开发范型与新的技术,在
实践中,效果往往是负面的.
3 应用与组件的版本管理
一个J2EE应用由一个或多个J2EE模块,以及
一个J2EE应用程序描述符组成.应用程序描述符
描述了模块的部署状况.而每个模块又可能由一个
或多个组件以及模块级的描述符组成.每个应用级
和模块级的描述符是用XML的文档类型定义
(documenttypedefinition)描述的.
应用程序描述符包含了模块所需要的申明性信
息以及组合应用程序所需要的信息,如一个组件是
否具有事务属性,组件的JNDI名称等等.然而,其
缺乏一个重要的信息——版本信息,J2EE平台的其
它规范,如EJB等,均未谈及版本控制.
这里的版本管理分为两个级别:
(1)应用部署时的版本,即应用部署工具可以
管理应用、模块以及组件的不同版本,在不同时刻、
不同场合,部署相同模块、组件的不同版本.
(2)应用运行时的版本,即允许相同组件或程
序的不同版本同时运行,允许在应用运行过程中增
加新的组件,允许在应用运行时更新组件,通常称为
热插拔.
对于
(1),需要在规范描述符的DTD中增加版
本元素.而对于
(2),问题要本质得多.基于Web的
应用,例如电子商务,需要的是24×7小时连续可
用,而在基于组件的应用开发中,组件的更新比在普
通的应用中更加频繁.要求组件可以热插拔,是关键
任务应用的必然需求.EJB体系结构缺乏这样的能
力,意味着其无法在一些关键任务领域,如电信、银
行,电子商务等领域与CORBA竞争.
级别
(2)涉及到EJB组件模型的设计.EJB[7]规
范没有定义版本控制标准[8,9],相反,EJB规范声明
将版本控制工作完全留给组件容器供应商,那么如
果J2EE平台供应商、EJB容器供应者、组件供应商
不同,很容易产生冲突.这种版本设计方案与
CORBA完全不同,在CORBA中,对于版本的管理
已经在规范中有明确的定义.
同时,RMI[10]的设计也对组件的热插拔不利.
RMI是Java中客户与服务器通信的基本机制,然
而,在RMI中,其接口与实现的分离并不是那么彻
底.原因在于在RMI中客户端的桩模块是由对象实
现而不是接口生成的.
具体地,在RMI中,客户端桩模块是由RMI工
具从对象实现中生成.例如,Hello.Java,HelloImpl.
Java,HelloClient.Java,分别是一个类的远程接口、远
程对象实现、客户端.生成客户与服务器端桩模块的命
令是:
rmicHelloImpl.而生成的客户与服务器端桩模
块的分别是HelloImplStub.class与HelloImpl
Skel.class.而客户程序HelloClient.Java需要通过
客户端桩模块才能访问服务器实现.该过程与
CORBA中的过程完全不同,在CORBA中,通过
IDL文件生成客户端与服务器端的桩模块,使得客
户端不再依赖于特定的对象实现.在J2EE中,J2EE
的客户需要一个由服务器实现生成的.jar文件才能
够访问服务器端.因此,客户与服务器是一个紧密耦
合的关系.当然,在网络环境中,Java代码本身的可
移动性可以缓解这一问题.
另外一个值得一提的问题是应用与类的重新装
载问题.在J2EE的参考实现中,是通过整个应用包
的名称的修改来实现一个应用的重新部署,这种粗粒
度的实现方法与J2EE这样一个系统级应用平台的
目标不太一致,其完全回避了应用部署的版本问题.
总之,作为一个关键任务应用的支撑平台,
J2EE不仅在版本管理,组件的热插拔,而且在其它
方面,如运行中应用与组件的管理与监控等,都缺乏
相应的标准.
4 JWebFrame的设计与实现
4.1 JWebFrame的体系结构
基于上文的分析,我们设计并实现了一个轻量
级的、面向快速应用开发的Java应用服务器,该服
务器本身完全由Java语言实现.
JWebFrame的体系结构如图3所示.一个
JWebFrame应用程序由一组JWebScript页面与一
些Java类组成.JWebFrame应用服务器提供了一
942计算机研究与发展2001年
稿收到日期:
2000-09-14;修改稿收到日期:
2001-03-13
本课题得到国家自然科学重点基金(69833030)和中国科学院“百人计划”基金资助
基于Java的应用服务器的设计与实现
阮 彤① 李 京① 冯东雷②
①(中国科学院软件研究所计算机科学开放研究实验室对象技术中心 北京 100080)
②(上海交通大学计算机科学与工程系 上海 200030)
(ruan@otcaix.iscas.ac.cn)
摘 要 应用服务器是当前基于Web的软件开发的重要的支撑平台,Sun公司的J2EE(Java2platform,
EnterpriseEdition)是一个基于Java的企业级应用服务器的标准.从Web应用的体系结构和基于组件的软件开发
入手剖析J2EE,指出了其存在的一些缺点,如难以支持版本管理、多层结构与多种技术并存导致概念庞杂,开发与
维护困难等.进一步地,给出了设计和实现的一个Java应用服务器——JWebFrame.
关键词 应用服务器,Java,J2EE,软件体系结构,配置管理
中图法分类号 TP311.5
THEDESIGNANDIMPLEMENTATIONOFJAVA
APPLICATIONSERVER
RUANTong①,LIJing①,andFENGDong-Lei②
①(ObjectTechnologyCenter,LaboratoryofComputerScience,InstituteofSoftware,
ChineseAcademyofSciences,Beijing100080)
②(DepartmentofComputerScienceandEngineering,ShanghaiJiaotongUniversity,Shanghai200030)
Abstract ApplicationserverisachiefplatformofWeb-basedapplication.J2EE(Java2
platform,EnterpriseEdition)isastandardofenterprise-scaleapplicationserver.Inthispaper
J2EEisanalyzedfromthepointofviewofsoftwarearchitectureandWeb-basedapplication
development.SomedefectsofJ2EEarepointedout,suchasJ2EEbeingunabletosupport
versionmanagementanditshavingdiverseconceptsandnotionsduetoitsmulti-tierarchitecture.
Furthermore,alightweightapplicationserver—JWebFrameisdeveloped,whichovercomessome
problemsofJ2EE.
Keywords applicationserver,Java,J2EE,softwarearchitecture,configurationmanagement
1 引 言
3层结构模型比起2层结构模型来说,具有更
高的性能,更好的可扩展性、可维护性与可重用
性[1,2].中间层服务器,即通常所说的应用服务器,作
为3层结构的核心,是业务逻辑与规则的执行场所,
提供连接池管理和分布式事务支持等功能.为比较
后来出现的各种应用服务器,本文将90年代初未融
合Web技术的应用服务器称为传统应用服务器.
Web的出现使得企业级应用有了新的解决方案,由
于Web具有开放、低成本、跨平台等特性,基于
Web的应用服务器很快出现在市场上.Web应用服
务器往往包括一个Web页面设计工具和动态页面
服务器,提供基于Web的客户/服务器计算,此类
Web应用服务器从功能上说只是一个Web网关.
WebFrame执行引擎与4个应用设施:
连接管理
器、安全管理器、表示管理器以及Session管理器.
图3 JWebFrame的体系结构
(1)JWebFrame执行引擎
JWebFrame执行引擎管理JWebFrame页面的
最终执行,包括调用JWebScript编译器,装载每个
页面的目标文件,为每个类创建实例池等.当用户调
用某个页面时,就在实例池中寻找一个运行之;当用
户执行完毕后,就将其返回给实例池.在执行引擎运
行的过程中,会与其它功能部件进行交互,如安全管
理部件,连接管理部件等.这些部件与执行引擎之间
的关系是调用与被调用的关系.
(2)连接管理器
连接管理器管理用户与数据库的连接.连接管
理器通过建立用户页面可用的连接缓冲池,减少了
连接/断开所需的系统开销.在使用初始资源建立缓
冲池中的连接后,其余连接/断开连接所用的系统开
销就不大了,因为这只是重复使用已有的连接而已.
同时连接管理器还使用户能控制到数据服务器产品
的并发连接数.当数据库服务器的许可证协议限定
用户数量时,这一特性是非常有用的.
(3)安全管理器
JWebFrame安全管理器包括访问控制、身份认证
和审计3个部分.在访问控制管理方面,JWebFrame
使用基于角色访问控制RBAC(role-basedaccess
control)模型,其提供2个工具:
用户管理工具与资
源权限分配工具.这2个工具都是独立于应用服务
器提供的.在身份认证方面,JWebFrame提供3种
方式的认证服务.①基于表格的;②基于HTTP基
本验证方式的;③基于安全证书的.
(4)表示转换器
HMTL页面是一些静态页面,而在这些静态页
面中嵌入的JWebScript标签将被应用服务器解释
执行.程序执行的结果,如数据库查询的结果集、数
组变量、浮点数类型的变量等,需要被转换成字符
串,插入到HTML页面中.JWebFrame所有标签的
返回值都被转换成相应的HTML元素,如表格、选
择列表等.这些转换功能由表示转化器提供.
JWebFrame编译器在编译特定标签时,会调用特定的
表示转换器接口.JWebFrame页面也可以直接调用这
个接口,这一接口以JavaAPI的形式提供给用户.
(5)Session管理器
Session管理器用以解决HTTP协议的无连接
问题.在与连接管理器一起使用时,保证了用户对数
据库的连接不会频繁断开.
4.2 JWebScript的设计
JWebScript的标签可以分为5类:
(1)控制与异常处理标签,包括WHILE,IF,
FOREACH,以及FOR与TRYCATCH对等.例
如,While标签的语法是:
〈!
ELEMENTjweb:
while--%jweb.body〉
〈!
ATTLISTjweb:
whileconditionCDATA
IMPLIED〉
〈!
ENTITY%jweb.body“(#PCDATA|
jweb:
while|jweb:
if|jweb:
return|jweb:
for|jweb:
foreach|jweb:
import|jweb:
methocall|jweb:
var|
jweb:
create|jweb:
connection|jwebrepresent)”〉
(2)包导入标签、对象定义与构造标签.例如使
用连接管理器的代码如下:
〈jweb:
importcom.otc.connection.*/〉〈jweb:
varConnectionSecureConnection/〉
〈jweb:
create〉SecureConnection=(user,
password,databasename)〈/jweb:
create〉.
(3)表达式标签,其表达式是作为XML元素
的内容表示的,如:
〈jweb:
methodcall〉Class.forName(“com.
sybase.jdbc.SybDriver”).newInstance()〈/jweb:
methodcall〉.
(4)返回标签是将一个表达式的值转换成字符
串后输出到HTML文件中,如:
〈jweb:
returnex=“newJava.util.Date().
toLocaleString()”/〉.
(5)便利设施标签是为方便Web应用程序的
开发,JWebFrame将对连接管理器、session管理器
等的使用与访问用标签的形式直接提供给客户.例
如,使用连接管理器连接到数据库的方法如下:
〈jweb:
Connectionname=“sampleConnection”
user=“dba”password=“***”datasource=
“ECommerce”/〉.
再如,构造对象时,使用“Session=true”属性可
9438期阮 彤等:
基于Java的应用服务器的设计与实现
问session管理器,例如,使用〈jweb:
create
session=“true”〉shoppingCart〈/jweb:
create〉,
shoppingCart对象就被自动地存储到对象当前的
session中.
例1是一个完整的JWebFrame页面.这是一个
Sun的J2EE参考实现中JSP的一个例子,使用
JW