java 反射 热更新_云计算环境下实现Java类在线热更新的系统与方法

云计算环境下实现Java类在线热更新的系统与方法

【技术领域】

[0001] 本发明涉及计算机系统技术领域,尤其涉及企业应用系统技术领域,具体是指一 种云计算环境下实现Java类在线热更新的系统与方法。

【背景技术】

[0002] 随着信息技术的发展,许多线下的业务模式正在通过互联网在线上实现虚拟化, 通过线下和线上的融合可以最大限度的确保用户体验。比如某数码品牌门店,线下的实体 门店可以成为用户的体验场所和仓储中心,而线上系统则可以成为传统实体店突破空间和 时间限制的24小时不打烊卖场。线上系统想要提供类似7 X 24小时的用户体验,这就对IT 系统建设提出了更高的要求。

[0003] 在基于Java的应用系统中,如果需要对生产系统升级或者打补丁,一般保守的做 法是先停止服务,再升级系统,最后重启服务,在整个升级期间,系统是不可用的。为解决这 一问题,出现了一种灰度发布的方式,即一次只升级一部分系统,这样可以始终保证有一部 分系统是可用的,之后再逐步扩大升级范围,直至全部升级完成。采用灰度发布能在一定程 度上解决因系统升级带来的服务不可用的问题,但是,这仍然没有彻底解决需要停止服务 的问题。

[0004] 假设有这样一个系统,因为发现了一个bug或者调整业务规则需要修改其中一个 Class类,仅仅就为了更新一个类,就需要对系统进行一次升级。如果没有Class的热更新 机制,这样的代价是很大的。

【发明内容】

[0005] 本发明的目的是克服了上述现有技术的缺点,提供了一种能够实现,使生产环境 中的系统不停机成为可能、应用范围广泛的云计算环境下实现Java类在线热更新的系统 与方法。

[0006] 为了实现上述目的,本发明的云计算环境下实现Java类在线热更新的系统与方 法具有如下构成:

[0007] 该云计算环境下实现Java类在线热更新的系统,其主要特点是,所述的系统包 括:

[0008] 自定义加载模块,用以加载需要热更新类的自定义类加载器;

[0009] 类扫描模块,用以对目标目录进行类文件扫描并通知热更新模块;

[0010] 热更新模块,用以对需要进行热更新的类进行热更新;

[0011] 受管对象创建工厂模块,用以创建作为受管对象的热更新的类的具体实例。

[0012] 本发明还涉及一种云计算环境下实现Java类在线热更新的方法,其特征在于,所 述的方法包括以下步骤:

[0013] (1)系统启动时,所述的类扫描模块扫描目标目录的类文件;

[0014] (2)系统将扫描结果注册至模型注册器;

[0015] (3)使用受管对象实例的模块向所述的受管对象创建工厂模块发出使用请求;

[0016] (4)所述的自定义类加载模块加载需要热更新类的自定义类加载器;

[0017] (5)所述的受管对象创建工厂模块通过所述的自定义类加载器创建受管对象的具 体实例;

[0018] (6)系统运行期间,当热更新事件被触发,所述的热更新模块执行热更新。

[0019] 较佳地,所述的扫描目标目录的类文件,包括如下步骤:

[0020] (1-1)递归遍历特定目录下的所有后缀为.class的文件并确定需要热更新的类;

[0021] (1-2)在模型注册器中保存物理类文件的信息。

[0022] 较佳地,所述的自定义类加载模块加载需要热更新类的自定义类加载器,包括以 下步骤:

[0023] (4-1)所述的自定义类加载模块进行初始化;

[0024] (4-2)所述的自定义类加载模块重写父类的类寻找方法并加载类模型。

[0025] 更佳地,所述的自定义类加载模块重写父类的类寻找方法并加载类模型,包括以 下步骤:

[0026] (4-2-1)根据类寻找方法传入类名并使用父加载器加载以及判断是否加载成功, 如果是,则继续步骤(4-2-3),如果否,则继续步骤(4-2-2);

[0027] (4-2-2)读取该物理文件至byte数组中,调用父类的defineClass方法由JVM完 成加载,然后继续步骤(4-2-3);

[0028] (4-2-3)所述的受管对象创建工厂将加载成功的类模型向模型注册器注册。

[0029] 较佳地,所述的创建受管对象的具体实例,包括以下步骤:

[0030] (5-1)所述的受管对象创建工厂模块判断所述的模型注册器的缓存中是否存在类 模型,如果是,则继续步骤(5-2),否则继续步骤(5-3);

[0031] (5-2)所述的受管对象创建工厂模块从所述的模型注册器的缓存中获取类模型, 然后继续步骤(5-4);

[0032] (5-3)所述的自定义类加载模块创建自定义加载器并用新创建的自定义加载器加 载该类模型,然后继续步骤(5-4);

[0033] (5-4)所述的受管对象创建工厂模块根据所述的类模型创建受管对象的具体实 例;

[0034] (5-5)受管对象创建工厂模块将受管对象、具体实例及自定义类加载器注册至模 型注册器;

[0035] (5-6)返回受管对象的具体实例。

[0036] 较佳地,所述的热更新模块执行热更新,包括以下步骤:

[0037] (6-1)所述的热更新模块从触发事件中获取需要热更新的类相关信息;

[0038] (6-2)所述的热更新模块根据类唯一名称从模型注册器中移除该类所关联的受管 对象、具体实例及自定义类加载器;

[0039] (6-3)所述的热更新模块通知使用受管对象实例的模块类文件发生变更需重新加 载。

[0040] 更佳地,所述的通知使用受管对象实例的模块类文件发生变更需重新加载,包括 以下步骤:

[0041] (6-3-1)使用受管对象实例的模块统一热更新通知接口并将实现类注册至所述的 热更新服务模块;

[0042] (6-3-2)依次调用实现了热更新通知接口的实现类的通知方法将此次更新的类名 包装为事件对象传入;

[0043] (6-3-3)在实现类中,移除旧的受管对象的实例的引用;

[0044] (6-3-4)重新向所述的受管对象创建工厂模块提出对象使用申请;

[0045] (6-3-5)由受管对象创建工厂模块完成新类的初始及加载工作,并重新在模型注 册器中注册。

[0046] 采用了该发明中的云计算环境下实现Java类在线热更新的系统与方法,使生产 环境中的系统不停机成为可能,当生产系统需要打补丁或升级时,只需要提供要更新的类 文件即可,无需停机重启,即时更新,即时生效,极大的提高了运维效率,降低了运维成本, 避免了停机事故;同时还增强了系统可移植性和可扩展性;不仅如此,该方法还能够快速 响应业务需求的变化和技术变化,能够支撑建立高度模块化而且又高度整合的软件系统, 适用范围较为广泛,为企业应用软件技术的进一步发展打下了坚实的基础。

【附图说明】

[0047] 图1为本发明的云计算环境下实现Java类在线热更新的方法的对象依赖关系图。

[0048] 图2为本发明的云计算环境下实现Java类在线热更新的方法的热更新过程流程 图。

【具体实施方式】

[0049] 为了能够更清楚地描述本发明的技术内容,下面结合具体实施例来进行进一步的 描述。

[0050] 本发明提出一种云计算环境下实现Java类在线热更新的方法。在技术实现上,要 做到Class热替换,必须要解决两个问题:

[0051] -是旧的Class要被正确回收,如果不回收,多次替换或者有大量Class替换,势 必有OOM的风险,增加系统隐患;对于JVM来说,类的回收是比较苛刻的,需要同时满足下面 3个条件:

[0052] A、该类所有的实例都已经被GC,也就是JVM中不存在该Class的任何实例。

[0053] B、加载该类的ClassLoader已经被GC。

[0054] C、该类对应的java. lang. Class对象没有在任何地方被引用,如不能在任何地方 通过反射访问该类的方法。

[0055] 保证旧的类被回收,是实现热替换的前提条件。

[0056] 二是新的Class要被正确加载,众所周知,在JVM中,同名的Class在同一个 ClassLoader中不允许被重复加载,如何突破这一限制,这也是实现热替换的关键所在。

[0057] 本发明针对上述两个问题提出解决方案,既保证了旧的Class被回收,又保证新 的Class被正确加载,实现了真正意义上的热替换。

[0058] 此发明的关键设计点即在于如图1所示的模型设计。采用一对一的加载模型设 计,能够达到JVM对类回收的三个条件,从而有效保证旧的Class能被正确回收,使运行期 动态热更新Class成为可能。该一对一的加载模型与OSGi中bundle的类加载机制异曲同 工,在OSGi中,一个bundle会对应一个ClassLoader,本发明的实现是一个业务类对应一个 ClassLoader,只有这样,才保证了业务类能够像bundle -样做到热更新。

[0059] 该发明实现了云计算环境下Java类在线热更新,其实现方案包含的主要模块如 下:

[0060] 1、自定义类加载模块:用于加载需要热更新类的自定义ClassLoader。本实例中 以 java. lang. ClassLoader 为父类实现。

[0061] 2、类加载器:对目标目录进行定时或手工扫描,并通知热更新模块。本实例以扫描 固定目录下的类文件为例。

[0062] 3、热更新模块:对需要进行热更新的类进行热更新。

[0063] 4、受管对象创建工厂模块:热更新的类在系统中是受管对象,该模块负责创建受 管对象的具体实例。

[0064] 所述的在云计算环境下实现Java类在线热更新的方法,包括如下步骤(其序列图 参见图2):

[0065] (1)系统启动时通过类加载器,扫描目标目录的类文件;

[0066] (2)扫描完成后,将扫描结果注册至模型注册器;

[0067] (3)系统中受管对象实例的使用者向受管对象创建工厂模块发出使用请求;

[0068] (4)受管对象创建工厂模块通过自定义类加载模块加载的Class,并

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值