利⽤springloaded进⾏javajarclass的动态替换
之前已经写过⼀篇关于class的动态替换博客,今天我们来介绍⼀下如何⽤springloaded进⾏jar&class的动态替换。
⾸先说⼀下实验过程,结合了⽬前我正在做的项⽬,这个项⽬是⼀个前置系统,分别对接银联和核⼼系统。项⽬⼀开始由⼀个jar包组成,逻辑上可以分为3层:分发层,业务处理层,dao层(数据库操作相关),所有的class⽂件最后都在jar包中,运⾏时,只要启动这个jar包就⾏了,它是⼀个进程,会启动⼀个监听端⼝⽤来接收银联发送过来的报⽂。
这样做的缺点:后期你要修改代码,哪怕只有⼀⾏代码修改,你也要重新打包成jar包,kill掉正在运⾏的进程,然后重新启动!⼀开始对于我这种菜鸟,除了觉得这样做很⿇烦之外,其他也没有觉得什么。后来,仔细⼀分析,在⽣产上运⾏,你停服务,是⼀件不可思议的事,因为所有的交易都要停⽌,像对于⽀付这样的交易,那影响就太⼤了!
所以,⾃然想到热部署⽅案,热部署⽹上也有⼀些相关的博客。但基本都不太“正规”,即都是那种简单的例⼦,看起来就不⼤可⾏。其中⽐较多的是⾃⼰定义classload来重新加载class⽂件,⽽且我看那些⽅法中路径和要重新加载的class⽂件都是写死的,这也太。。。当然,也有我觉得⽐较⾼⼤上的⽅法,就是将现在的系统改造成微服务架构,对于业务上独⽴的交易都改造成⼀个个微服务,那要卸载服务,重新部署
服务⾃然都不在话下。不得不说,这确实是⼀个⽐较好的⽅法,但⼯作量和难度都是⽐较⾼的,想来想去,暂时不考虑,但会作为知识储备来学习,在适当的时间再来改造,因为这是趋势!
直到前⼏天,我偶然发现⼀个关于springloaded的帖⼦,这种⽅法⽐较简单,⽽且从名字可以看成,它是spring旗下的⼀个项⽬,应该来说还是⽐较可靠的,所以就试着⽤这个⽅法来进⾏改造,改造的⽅法也⽐较简单。
⾸先,我们要将jar包中的⼀些业务相关的代码从jar包中抽离出来,具体拆分的⽅法可以为,基本不需要修改的代码或者框架型的代码放在jar包中,⽽后期需要经常修改的代码从jar包冲分离出来。如下图:
spring framework jar包
所有的业务相关的代码(class⽂件)都放在business⽂件夹下,具体做法是创建了⼀个新的⼯程,然后现有的⼯程会依赖这个新的⼯程。同时,可以看到相关的配置⽂件我们也从jar包中分离出来,⽐如mybatis⽂件夹中放的是和数据库操作相关的⽂件。
我们在libs⽂件夹中放⼊
然后,输⼊命令:
这⾥插播⼀下,⼀开始我是上⾯这种写法,但是发现jar替换时不起任何效果,后来我想会不会是顺序的问题,我把-jar后⾯的参数移到最后⾯,发现这时候起作⽤了:
然后参数verbose可以省略,因为加上这个参数,⽇志中会有很多详细的信息,⽣产上不太⽅便查看,测试的时候可以加上。
我们发起⼀笔报⽂,前置系统运⾏结果如下:
我们对这个交易的代码进⾏修改,把“协议⽀付签约触发短信”这⼏个字去掉,然后保存,⽤这个class⽂件替换原先的class⽂件
可以看到,在不⽤停程序的情况下,运⾏结果已经改变了,基本达到我们的需求。
接下来的话就是,如果jar包⾥⾯的代码有修改,那就重新打包来替换旧的jar包,与替换class⽂件类似,我试了⼀下,同样是可以的。
2018-07-25更新
今天我在⽣产上试了⼀种情况,发现更换了class没有⽤,⽐如:a.jar直接调⽤了b.class,⽽b.class⼜调⽤了c.class,现在替换了c.class⽂件,发现不起作⽤。我们上⾯的例⼦是替换了b.class⽂件起作⽤。只有重启,c.class⽂件才起作⽤。这个问题后续值得继续关注!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。