
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发语言相信大家在学习软件编程开发的时候应该都不陌生的吧,今天我们就通过案例分析来简单了解一下,Java编程代码部署都有哪些常用方法。
OSGI
其实java业界有一些解决方案,比如osgi架构,这玩意时间比较长了,但一直没火起来。osgi架构的出现,可以让java系统变成模块化的形式,让模块重启成为可能。从一定程度上也算是个热部署的方案。可惜这玩意以前开发起来就觉得很反人类,配置文件一大堆不说,学习成本也很大。和spring结合起来,居然是一个模块一个spring上下文体系。并且如果模块之间有调用关系的话,重启相关的模块会让应用出现短暂的功能性休克,也就说,整个热启动过程不平滑。
这项技术现在估计很多小伙伴都没听说过,目前也渐渐的退出历史舞台,用的企业估计很少。
ASM
ASM是一款修改字节码的框架,同类型的框架还有Cglib。这些框架能加载一个class信息,用户可以按照自己的需求增强修改这些信息,后输出成一个新的class。
具体实现过程,这里就不展开了。大家可以百度下,相关技术实现文章不少。
但单纯修改字节码一般要和其他技术结合起来,单靠这个也无法完成热更新,虽然ASM类的框架能够修改类,但是这些ASM的修改逻辑也是用java写的,这段代码也需要执行的。如果你把ASM的代码写在java里,也无法实现从外部来热更新。
Javaagent&AttachAPI结合ASM
这就是上面一段说的ASM要结合其他技术才能实现热更新的方案,也是目前很多开源框架采用的方案。
比如大名鼎鼎的Arthas,就是利用javaagent通过AttachAPI运行时加载目标Java程序,终利用InstrumentionAPI或者ASM增强class,来实现代码跟踪,以及代码热修改的特性。
但我们认为用Arthas来完成线上代码的热更新,只能用于一些很紧急的场景。不能替代日常业务逻辑修改。而且操作起来也挺复杂。
你需要先修改java代码,然后把java代码放到服务器上,在arthas里查找这个类的类加载器的hashcode,然后利用arthas提供的命令编译java代码输出成新的class文件,用利用redefine命令进行热更新。
试想下,如果大量逻辑的更改。这得有多麻烦。
所以更多的是利用arthas对线上应用进行诊断,追踪,热更改代码其实就是arthas众多功能中其中一个,并不是主要功能。
换一种思路
以上方案都是基于修改class本身,然后让JVM的类加载器重新加载来实现的。
那么有没有更好的方案呢?
其实java代码可以运行一些脚本的,jdk本身就支持调用脚本,从JDK1.6开始,java就支持JSR223,可以用一致的形式在JVM上执行一些脚本语言,而且可实时编译,运行的效率和java不相上下的。
有的同学看到这里可能会拍砖了:利用脚本只能更改部分逻辑,不可能把所有的逻辑都用脚本写吧,你这篇文章探讨的不是“有没有可能所有的逻辑都可热更新”么?
别急,先我们来确定一个事情。你的java应用系统需不需要所有的逻辑都是可以热更新的?很多代码都是大致固定不变的,比如util类,一些vo的定义也不大变更的,一些固定的业务也不需要热更新需求的。只有一些经常变更的决策部分,可能需要热更新。
那么我们只要把需要经常变的部分用脚本来定义不就可以了么。
业界有没有类似的开源框架呢?
还真有,而且是高star的热门开源项目,能够帮你做到用脚本进行热更新业务。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。