快捷搜索:

J2EE部署建议

先容:

如今你和一些资历较高的J2EE开拓职员交流的话,他们大年夜部分都很愿意给你供给一些不合类型的EJB的细节问题,或者是怎么样来应用JMS来发送和吸收异步的消息。然而很难找到某小我能够描述一个能够确保可测试性,靠得住性,和机能很好的系统构架支配。许多J2EE法度榜样员缺少深入的理解支配。此中一个缘故原由是J2EE specification中包孕的利用法度榜样的支配原先就甚少。把这个难题留给小我去斟酌。以是这导致了许多利诱,比如每一个设计职员都有可能自己支配j2ee利用法度榜样的措施。在此篇文章中,我们首先要先容的是描述不合的J2EE模块和不合的打包布局。随后我们将来一路探究一些可行的支配布局和一些在设计和履行J2EE利用法度榜样中的支配技术。再此之前,你最好要懂得一些J2EE核心技巧,例如JSP,servlet,EJB,XML。

J2EE Modules:

J2EE1.3支持把J2EE application打包成不合的可支配的模块.以下是2种J2EE modules

 Application modules(enterprise application or web application)

 Standalone modules(EJB or resource adapter)

基础上,一个WAR文件(Web Application Archive)是用来支配一个基于web的application。WAR文件中可以包孕 servlets,HTML文件,JSPs及统统与其有关系的图或资本文件。另一方面,一个EAR文件(Enterprise Application Archice)是一个容器可以包孕EJBs 资本适配器(resuorce adapters),和一个或多个web application模块.当在打包enterprise application的时刻部分必要斟酌的是这个application必要用若干个EAR文件.是否要包孕我的所有的EJBs到EAR文件中?这些抉择将会直接影响到法度榜样的运行稳定性,可掩护性,和法度榜样的履行。我们一会就来探究这些,

类加载器的关系(class Loader RelationShip)

常常在设计J2EE application时我们会轻忽不合的模块类型间类加载之间的关系。Java虚拟机(JVM)用类加载器classloader来查找类和工具并把他们载入内存。在默认的环境下,系统的类加载器会根据在系统中的情况变量的classpath的位置来加载类,当然也可以为自己的application供给其余加载的地方而不是默认的。

图1类加器的

图中利用法度榜样真个server用SystemClassLoader加载,并且只能从经由过程系统的classpath才能看到资本。每一个EAR和RAR和WAR模块中中都有分离的零丁的classloader。Classloaders加载器们的关系没有被很明确切实着实定,然则一样平常环境下在4种不合的类加载器中有一种关系便是父与子的关系,就像子类和父类的关系,子类的classloader可以在在父类的classloader中定位class,但反之不可。在J2EE中systemloader便是所有的EAR classloader的父类classloader。然而EAR classloader是WAR和RAR的父类classloader。

图2

根据java规范,一个子类类加载器(classloader)在试图定位自己的了类之前必须先用其父类classloader定位这个类。这虽然听起来感到没什么需要,然则这样是可以阻拦当有多个类加载在同一个JVM里的多个类加载器(classloader)之间的暧昧不清和之间的冲突。有个其余利用法度榜样办事器容许你自己来选择性的查找EAR和WAR类加载器的加载行径。然则不保举这样做,由于这样可能造成其他的麻烦,例如classcastException会在一下环境下发生:当在两个相同version的类然则在不合的类加载器中。

支配布局 (Deployment Architecture)

一个范例的3层enterprise application由3个主要的层组成:

表达层:这个层的义务是认真处置惩罚与用户的交互。

商业逻辑层:这个层平日是扮演server的角色,认本相应来自用户的表达层的哀求。

数据层:这个层包孕数据库和其他连接数据库的组件。

一个大年夜的商业系统的办理规划中,每一个层将被零丁的支配在自己的域内,这样可以容许每个域来满意自己的商业需求。除此之外,负载平衡器将会在表达层之前被支配用来前进靠得住性和支持更好的fail-over,商业逻辑层和数据层倾向与依附聚合技巧来预防fail-over,下图说清楚明了范例的支配布局。

图3

根据现实的商业用例,上图也有一些变更。

对付一个J2EEapplication,表达层平日经由过程应用servlet和JSP来办理实现,而这些servlet和JSPs可以打包成一个或多个WAR文件。商业层平日经由过程session beans来实现,而这些beans可以被打包为一个或多个EAR文件。数据层平日经由过程实体beans(entity beans)(平日用来和数据库的资本连接)或者是资本适配器(节制与lagacy和非JBDC资本的连接,同样确当然可以被打包为一个或多个EAR文件)。下图给我们展示了在J2EE资本和模型中相同的支配布局。

假如按照上面的模型来支配一个J2EE application将会有很好的机动性,然则这里还有一些其余必要在支配布局形成之前斟酌到。平日觉得remote calls比local calls必要花费更多的光阴,在远程历程呼叫中,本地代理工具必须copy所有的参数并且把他们经由过程电缆传送过来,经由过程RMI,在远程节制工具时,会造成收集交通堵塞和长光阴的相应等待。斟酌到用户在web page上发出一个敕令的细节,而这特殊的哀求轮流的调用servlet,随后便是处置惩罚在session beans和entity beans中的business method。至少4个收集操作都有同时的运行,此中的2个操作都是remote EJB calls。

当session beans call其余 session beans或者多个entity beans时,就必要创建额外的remote calls。假如履行的效果是首先要斟酌到的,就必要在构架和设计时作出调剂。来削减remote calss 的数量,而且要削减remote calls孕育发生的耗损。

这里我们有许多措施来办理perforamce的问题:

我们可以经由过程应用EJB的coarse-grained设计模式来削减收集上的trips。

我们可以经由过程应用本地而不是远程接口或者是实体beans来打消一些不需要的远程呼叫。

我们可以经由过程改变打包布局来使更多的beans支配在一个EAR文件里从而使一些远程呼叫变成本地呼叫

本地接口 VS 远程接口

J2EE1.3中引入本地enterprise beans的观点,它可以容许一个entity beans显示本地接口,这样可以容许以引用reference来通报参数而不是传值value。然而为了使session beans能够造访本地enterprise beans必须将本地enterprise beans打包到和session bean一样相同的EAR文件里。平日有两种措施来实现。

a.在数据层中可以在entiy beans之前创建一个session Facade,这样可以同样可以使entity beans在内部application中起到同样的感化,然而,假如仅仅依附这种session Facade技巧的话,法度榜样运行的效果可能并不是很好。

b.把entity beans放到business层中,并且容许business层的session beans可以直接连接本地enterprise beans。这样可以削减entity beans重复应用的程度。本地的entity beans只能在位于相同的EAR文件里起感化,在application外部的模块中的其他的business beans就无法来与entity beans连接。这将使在不合applicatipn 模块中的相同entity beans的实例(instances)越发。

打包布局

一些J2EE application server例如BEA的weblogic会优化beasns之间的远程呼叫和本地呼叫.假如beans都在相同的EAR中,这很有利于一个session beans呼叫多个session beans或者entity beans.然则这样也有一些晦气之处:

低落可掩护性:所有的打包在同一个EAR的beans必须在同一光阴被支配或者是从新支配,这样会阻拦在运行光阴改变beans的可能性.

平台依附性:不是所有的app server都供给这种要领的优化,而且假如你转变app server vendors的话是没有任何感化的.

可能破坏到设计思路: 许多开拓职员设计beans都假设所有的参数经由过程传值而不是通报引用.假如改变呼叫的约定将会破坏曩昔的假设,分外是假如通报工具的模式被同时用在entity beans中

资本定位的斟酌

另一个区域我们必须斟酌通用资本和库的位置,一条戒律是资本必然要跟着用到的J2EE模块在一路.然而,假如在某种环境下比如一些同用资本被几个模块同时用到时,你可以把他放到一个这些模块都可以获取到这些资本的地方.除此之外,把资本路径放入你的系统的CLASSPATH里将会引起与其他J2EE模块支配到相同的容器的冲突.这样会同样的限定你来支配J2EE利用法度榜样

资本绑定(其他类型的静态资本)resource Bundles (and Other Types of Static Resources)

让我们轻细斟酌一下,在一些web application必要一些包孕一些信息的以.properties为后缀的文件(作为资本绑定),根据类加载器的关系和伶仃的级别,平日有3种要领来放置这些资本文件

1.把资本绑定的拷贝放入每个WAR文件的WEB-INF/classes 目录下,这样做也有毛病,那便是假如某人后期抉择他必要去改动这些文件的信息,他必须要进入每个WAR文件并且每一个都作出相同的改动,这是轻易导致差错的,至少是这么说的.

2.把资本绑定都放入一个能被系统的calsspath能够识别出来的目录下,这样办理了第一点中的毛病即不必要改动相同文件夹下的多个的拷贝.然而这样做同样能够限定你的再次支配application(re-deploy)的功能.由于被系统classloader加载的资本只能经由过程从新启动JVM来再次加载(reload).在这种环境下你做的一些改变将不会实现在你重启动application server之前,在J2EE办理规划中高的实用型可用性是对照紧张的,这样会导致加倍繁杂的系统掩护.

Third-Party Libraries:

平日在J2EE工程中包孕完全免费第三方的软件是不常见的(比如Apache log4j).在这种环境下,一样平常是最好把那些库的JAR文件放入到拟订地址的一个EAR文件里,假如库与现已存在的被application server正在应用的库冲突或者是改变或进级那些库的需求很小时,那么库路径必须放入到CLASSPATH里是最好的.假如你抉择把通用的库放入到EAR模块的内部,这是必须要确保第三方库必须在拟订的地点被加载(eg/lib or /ext)这将会使查找并且处置惩罚故障加倍的方便,经由过程鉴别那些内部组件依附的模块.由于在不合的classloader之间有严格的限定,你必须把第三方库的路径放入MEANIFEST文件或者使J2EE模块.包括WAR文件和EJB文件.

其他一些的建议

J2EE可以经由过程很简单的开拓要领来开拓可进级机能高的和靠得住性高的工程,以是,一个J2EE的开拓构架必须要在仔细斟酌好进级机能和靠得住性的需求之后才能作出抉择.

可进级性(Scalability)

在前面,我们把application分化成在不通层(tiers)的多个单元(units)将给我们供给更高的可进级性高和靠得住性高的模块.然而,必须要仔细斟酌到要在确保颗粒度和模块性与机动性和机能体现之间的平衡关系.

热支配和可掩护性(Maintainability and Hot Deployment)

热支配指的是不必要竣事或者重启动application来进行支配和从新支配.假如你的application必要热支配,那么必须要确保application的资本,寄托第三方库,或者以自身形式打包的其他enterprise模块.避免建立任何依附与系统classpath的模块,确保每一个enterprise application模块可能必要到的器械打包到同一个EAR文件中

安然性(Security)

取决于application的安然性,不合的安然机制如(SSL,VPN,J2EE module declarative security model)可以在不合的层之间履行,从而来供给我们必要的安然级别.只管J2EE规格说到安然需求是由appliacation server供给的.然则没有指定供给一种什么样的安然性,以是,安然需求可所以可所以由厂商来阐明觉定的.入伙你的application 必要在不合的安然治理域经由过程安然身份来鉴别,(比如散播式安然),那么你就必要毫无疑问的和你的供给厂商来协商.在某些环境下可能会有限定,那么你就必要限定你在支配构架中的选择

自动支配(Deployment Automation)

在抱负的环境下,你碰到的所有系统的治理员都是异常认识J2EE和application server的.然而,或许找出只管有一个精晓UNIX或者是Winodws系统治理员,他或她根本就不知道什么是J2EE.以是,为了那些可能支配和治理这个j2ee系统的人而着想,有一个清晰的支配步骤文档是最好的了.那将会是比供给那些若何自动支配的文档加倍的方便.许多application server厂商如今都供给无论是精晓厂商规范的职员照样一样平常职员的治理节制台,或者经由过程Java 治理扩展,(JMX)API(例如 BEA weblogic Management API)然而,基于不合厂商的不合的支配机制,你必要创建响应的平台来适应.

未来偏向(Future Direction)

越来越多的J2EE application的利用法度榜样的宣布,确定在通用的标准的支配和打包一个J2EE利用法度榜样的地方变得越来越紧张了。然而,怎么样支配一个J2ee利用法度榜样仍旧没有标准可以遵照.JSR的目的便是确定一个标准的API ,从而才能使任何的支配对象来支配任何的J2EE application server J2EE模块.分外时要斟酌以下一些标准。

1.安装:支配一个pre-package的组件到container中的能力。

2.设置设置设备摆设摆设:应用标准设置设置设备摆设摆设的机制从新获得设置设置设备摆设摆设的数据的能力。

3.卸载支配:从一个容器中卸载一个支配,从这个角度看,JSR将会包孕到J2EE1.4的规范中,伴跟着新的API,一个application 厂商可以创建支配对象或者脚本,从而可以不用担心不合的支配感化而来自动的支配他自己的application到不合的application server.然则照样有一些部分的区域没有被JSR斟酌到。

4.J2EE资本支配和设置设置设备摆设摆设:支配和设置设置设备摆设摆设J2EE的资本,例如DB连接池,JMS等,这照样得要依附于厂商的。

5.安然设置设置设备摆设摆设:J2EE模块经由过程容许安然角色规范和在支配中的描述符来支持一个清晰的安然模块.然而假如安然信息在支配时改变,系统治理员照样要依附于厂商所供给的机制来作出改变模块的自力性:只管新的标准经由过程支配描述符容许模块的自力性的规范,自力性并没有被追踪,这样卸载支配时,模块所必要的资本不会自动的撤销.

总结:支配照样一个许多J2EE开拓职员不是很认识的部分,假如支配细节不在设计构架时斟酌到,你将会很容使你改变你的构架,综上所述,平日有许多在一开始就要斟酌到的地方来满意你的application的体现性,靠得住性等的需求。

您可能还会对下面的文章感兴趣: