基于J2EE的模块热部署实现技术

2016-05-30 10:48高沈钢傅启明
企业科技与发展 2016年8期
关键词:模块

高沈钢 傅启明

【摘 要】热部署技术可以提高项目部署效率、降低部署难度,在不中断系统服务的情况下更能提高用户的使用体验。文章总结了业界实现Java热部署的2种实现方式,并另辟蹊径地从项目模块的角度提出实现J2EE项目热部署的一种机制,最后展望了热部署的发展前景。

【关键词】J2EE;热部署;模块

【中图分类号】TP393.08 【文献标识码】A 【文章编号】1674-0688(2016)08-0023-03

0 引言

在国有大中型企业中,项目的运行和维护工作占据了很重要的一环,特别是发布新版本的部署工作,关系着系统的稳定运行,成为运行和维护工作的重中之重。J2EE目前在国企中得到了广泛应用,因此研究能简化部署步骤、缩短新版本发布时对外中断服务时间的J2EE热部署技术有着极其重要的意义。

1 Java热部署概念

J2EE追本溯源是Java,从技术层面讲,Java热部署指的是在不重启Java虚拟机的前提下,能自动侦测到class文件的变化并更新运行时class的行为。反映到项目上,就是不需要停止并重新启用Java程序(web服务器或者Java的应用),只需替换相应的Java资源(如jar包),就能使运行中的程序加载新的资源改变原有的业务逻辑。

2 Java热部署实现方式

受到Java虚拟机类装载机制和其语言本身的限制,目前业界的Java热部署技术的基本方案都是实现了自己的类加载器,在运行时再通过重新构造类加载后实现的。在此方案的基础上,实现方式可以大致分为2类。

2.1 遵照OSGI方式实现

OSGI(Open Service Gateway Initiative,Java动态模块化系统规范)是一个通用框架,著名的可扩展开发平台Eclipse(3.0以后)就是基于它实现的。OSGI框架划分为4个层次:L0运行环境、L1模块、L2生命周期管理、L3服务注册,为组件(Bundle)提供了一个标准环境。基于OSGI开发的组件可被动态安装、开启、关闭、更新和卸载,实现比较复杂。

2.2 基于J2EE容器特性实现

直接利用J2EE容器特性实现热部署,如weblogic的开发模式及其10.3.6以上版本实现的对热部署的支持。由于基于J2EE容器特性实现部署粒度较大(应用级),因此热部署时会出现session会话丢失和内存泄漏等问题,且不能做到真正的零间隔热部署。

3 基于模块实现的热部署

为了解决实现过于复杂而效率低下、受容器限制、session丢失和部署时停止服务等问题,江苏电力信息技术有限公司经过十多年的java项目开发经验的积累与探索,提出了一种基于模块的热部署实现技术。

3.1 技术核心

基于J2EE项目实现模块热部署的技术核心在于类装载器ClassLoader的几个基本特性。

(1)共享特性:此特性源于Java的双亲委派机制。ClassLoader有继承关系时,子类装载器载入类时可设置为优先搜索父装载器。因此,公用的非模块类可由父ClassLoader装载以达到子ClassLoader的共享。

(2)隔离特性:没有继承关系的ClassLoader之间,其互相的代码可看作是完全隔离的。这个特性保证了基于无继承关系的ClassLoader的模块互不影响。

(3)装载特性:作为对象的子ClassLoader可被父ClassLoader重新载入。老的子ClassLoader会被卸载,即当该子ClassLoader中所有关联的Object都不再被引用时,此时JVM在适当的时机就会对关联Object和ClassLoader进行垃圾回收。

(4)通信特性:在子ClassLoader中实例化出来的变量,可保存至父ClassLoader变量中。父ClassLo-

ader不能随意访问,只能通过类反射机制或转化为父ClassLoader中的一个类或接口进行访问。

3.2 基本原理

通过引入自实现的轻量级热部署工具包,将项目本身的应用作为热部署实现的容器,项目的业务模块则作为热部署的资源。热部署时,应用本身没变化,变化的只是需要替换业务逻辑的业务模块资源包。应用将对资源包进行重新加载与解释执行。

3.3 Java通用实现方式

通用实现方式定义与实现如下。

(1)定制类加载器(ConfigurableClassLoader):用于动态指定Classpath和指定查找类顺序(如是否优先查找父Classloader),重新实现资源的载入机制。

(2)动态模块(DynamicModule):一个动态模块对应一个热部署单元(即业务模块资源包)。包括了ConfigurableClassLoader和DynamicModuleCfg。

(3)动态模块配置器(DynamicModuleCfg):用于动态模块的配置,主要包括对模块名、classpath、jar资源在部署包中的路径等信息的描述。

(4)动态模块管理器(CfgDynamicModuleMgr):用于动态模块的管理,如动态模块的添加、停止、重新加载,同时提供所有对外的接口。

3.4 J2EE的实现方式

考虑到J2EE的多层架构,我们将热部署与J2EE深度融合后做出如下组件设计:定制类加载器、动态模块管理器、Bean容器管理器、MVC转发器。

图1中,定制类加载器、动态模块、动态模块管理器即通用实现中的概念。在基于J2EE项目的模块热部署实现中,动态模块包含MVC转发器和Bean容器管理器。其中,MVC转发器主要是Controller类,Bean容器主要管理J2EE项目中各种Service和Dao类及之间的依赖关系。热部署工具包中利用注解实现了MVC的URI映射、各种Bean的定义、实例化和相互的依赖关系,供动态模块使用。

3.5 模块热部署的优点

这种基于J2EE的模块热部署实现对比业界Java热部署实现具有如下优点。

(1)模块熱部署比基于J2EE容器特性的热部署颗粒度小,热部署过程中模块间互不影响,且不依赖于J2EE的容器特性。

(2)代码开发比遵照OSGI实现的方式更简单,减少了开发人员的学习成本;热部署工具包中各种常用功能的注解实现,更节约了开发成本。

(3)热部署工具包是一个轻量级的jar包,放入J2EE项目侵入性小,由工具包实现了热部署的模块管理控制台,可方便地进行热部署的管理工作。

4 结语

本文所述的基于J2EE项目的模块热部署技术,从开发角度来看,技术原理更容易理解且热部署代码简单可控。从运维角度来看,模块热部署迅速,对外无中断延迟,且系统会话保持不丢失。

在企业内使用该基于J2EE模块的热部署技术,可以避免停用服务更新版本的困扰,提高用户使用系统的体验,同时提高了部署效率、降低了部署的难度和对运维人员的技术要求。从企业长远发展的角度来看,使用该项技术更可以加快企业的技术积累,为自动化部署打下基础,提高企业的信息化开发与运维能力。

参 考 文 献

[1]周志明.深入理解JAVA虚拟机[M].第2版.北京:机械工业出版社,2013.

[2]许令波.深入分析Java Web技术内幕[M].北京:电子工业出版社,2014.

[3]李海骋.热部署技术的依赖修复问题研究[D].南京:南京大学,2015.

[责任编辑:钟声贤]

猜你喜欢
模块
28通道收发处理模块设计
“选修3—3”模块的复习备考
三个必修模块 教学各有侧重
IR推出易用的μHVIC系列构建模块,有效简化设计
集成水空中冷器的进气模块