当前位置: 首页 > 后端技术 > Java

一个Java项目有没有可能把所有的代码逻辑都做到热部署?

时间:2023-04-02 01:51:46 Java

前言首先,我们要明确什么是热部署。热部署是在不重启java虚拟机的情况下自动更新类,从而更新整个运行时逻辑的行为。在java开发领域,热部署一直是一个难以解决的问题。java虚拟机理论上只能实现方法体修改的热部署。对于整个类结构的改变,还是需要重启虚拟机,重新加载类,才能完成更新。操作。其实OSGI在java界也有一些解决方案,比如osgi架构。这东西流传很久了,就是一直没有流行起来。osgi架构的出现可以让java系统变成模块化的形式,使得重启模块成为可能。从某种程度上说,它也是一种热部署方案。可惜这东西是以前开发出来的,感觉很反人类。配置文件多不说,学习成本也很高。结合spring,其实就是一个模块,一个spring上下文系统。而如果模块之间存在调用关系,重启相关模块会导致应用出现短暂的功能震荡,也就是说整个热启动过程并不流畅。估计很多小伙伴都没有听说过这个技术,也逐渐退出历史舞台了。估计很少有公司使用它。ASMASM是一个修改字节码的框架,同类型的框架还有Cglib。这些框架可以加载一个类的信息,用户可以根据自己的需要对信息进行增强和修改,最后输出到一个新的类中。具体的实现过程这里就不展开了。可以百度下载,相关技术实现文章很多。但单纯修改字节码一般需要结合其他技术,仅靠这一点无法完成热更新。虽然ASM类的框架可以修改类,但是这些ASM的修改逻辑也是用java写的,同样需要执行这段代码。的。如果用java写ASM代码,是无法从外部实现热更新的。Javaagent&AttachAPI结合ASM这就是上段提到的ASM需要结合其他技术实现热更新的方案,也是很多开源框架采用的方案。比如大名鼎鼎的Arthas使用javaagent通过AttachAPI在运行时加载目标Java程序,最后使用InstrumentionAPI或者ASM增强类实现代码跟踪和代码热修改特性。不过笔者认为,使用Arthas完成在线代码的热更新只能在一些非常紧急的场景下使用。不能替代常规业务逻辑修改。而且操作起来相当复杂。需要先修改java代码,然后把java代码放到服务器上,在arthas中找到这个类的类加载器的hashcode,然后用arthas提供的命令编译java代码,输出到一个新的class文件,最有用的redefine命令进行热更新。想象一下,如果很多逻辑发生变化。真麻烦。所以更多的是使用arthas来诊断和跟踪线上应用,而热改代码其实是arthas的众多功能之一,而不是主要功能。另一种思路上述解决方案都是基于修改类本身,然后重新加载JVM类加载器。那么有更好的解决方案吗?其实java代码是可以运行一些脚本的。jdk本身是支持调用脚本的。从JDK1.6开始,java支持JSR223。有些脚本语言可以以一致的形式在JVM上执行,可以实时编译。可比。有的同学看到这里可能会疑惑:脚本只能用来改变部分逻辑,不可能把所有的逻辑都写在脚本里,你的文章不是说“是不是所有的逻辑都可以火-更新了“什么?别担心,让我们先确定一件事。你的java应用系统是否需要所有的逻辑都可以热更新?很多代码是大致固定的,比如util类,有的vo定义变化不大,有的固定服务没有热更新需求。只有一些经常变化的决策部分可能需要热更新。那么我们只需要用脚本定义需要经常更改的部分即可。业界有没有类似的开源框架?真的有,而且是高star的热门开源项目,可以帮助大家使用脚本进行热更新业务。开源编排规则引擎可能有小伙伴又要说了:你不是介绍了java代码的热部署吗,怎么把话题转到规则引擎上了?这里要说的是,规则引擎的一大特点就是将决策部分的逻辑剥离到外部,可以实现逻辑变化的快速热变。这次推出的规则引擎框架更加强大。除了剥离逻辑之外,还可以对系统进行解耦,让你所有的逻辑块都可以随意更改。理论上可以实现所有的逻辑都可以改变,而不是部分改变。这就是业界最流行的编排规则引擎框架:LiteFlow。LiteFlow的概念很简单,就是把系统中的每一个逻辑都分成一个个小块,我们称之为组件。这些组件可以由java代码或脚本编写。那么一个完整的业务就是把各个组件放在一起,形成一个完整的业务链。这种模式的好处是不需要热更新的部分可以写成java组件,需要经常改动的部分可以写成脚本。所有组件都可以混合并匹配到一项业务中。如何安排这些组件,LiteFlow创造了ELF语法,它具有非常易于使用的编程语法。作为程序员,十分钟就可以上手。上图中粉色部分是最简单的串联形式。业务环节中的组件可以实时更换或添加,形成新的业务链。同时,定义的组件也可以在其他环节复用。LiteFlow的脚本解决方案也是使用JSR223实现的。目前已经实现的脚本有以下三种:为什么要用LiteFlow编排引擎框架,你所有的逻辑都可以改。因为你可以用脚本组件来实现所有的逻辑,所以LiteFlow提供了非常强大的脚本支持,完全和Java底层打通。你可以在脚本中导入java类,或者调用java类的方法,甚至你可以在脚本中定义方法和类,一切都和java中写的一模一样。更夸张的是,LiteFlow允许你在脚本中调用springcontextbeans,你可以在脚本中调用DAO来获取数据,你可以在脚本中向其他微服务发送rpc。只要你愿意,你完全可以把业务移到脚本组件上,而不用写一行java业务代码。而且你甚至可以随意改变逻辑块的顺序,因为LiteFlow的布局规则和脚本都是可以热改的。LiteFlow还提供了对常用存储中间件的原生支持:LiteFlow支持所有的关系型数据库,zk、etcd、nacos都支持,还提供了额外的扩展接口,方便你扩展成其他存储方式。你有没有想过,你所有的逻辑和基于规则的语法都存在于系统之外。只要改变它的脚本和逻辑,你所有节点的系统都不需要做任何事情,实时进行热更改。而这一切,LiteFlow都非常流畅。所谓顺畅,就是不用担心热改时业务会中断,不会因为热改导致执行环节出现异常。LiteFlow的编排能力有多强大?几个简单的关键词,就能产生超乎想象的效果:结束语在java业务的热部署领域,LiteFlow作为规则引擎提供了一种新的解决方案。除了上面介绍的,LiteFlow框架还有很多高级的特性,可以全方位的提升你系统的灵活性。而且作为开源软件,LiteFlow在国内有着非常好的社区氛围和文化。最后放出LiteFlow的官网和仓库地址。如果你觉得这个开源框架对你的业务有帮助,那就快来了解一下吧。项目官网:https://liteflow.yomahub.comgitee托管仓库:https://gitee.com/dromara/lit...github托管仓库:https://github.com/dromara/li...