0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java项目有可能做到所有的代码逻辑均可热部署吗?

OSC开源社区 来源: OSCHINA 社区 作者:铂赛东 2022-11-23 11:47 次阅读

前言

首先我们明确下什么叫做热部署,热部署是在不重启 java 虚拟机的前提下,自动更新 class 的行为,从而更新整个运行时的逻辑。 在 java 开发领域,热部署一直是一个难以解决的问题,java 虚拟机理论上只能实现方法体的修改热部署,对于整个类结构的更改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。

OSGI

其实 java 业界有一些解决方案,比如 osgi 架构,这玩意时间比较长了,但一直没火起来。osgi 架构的出现,可以让 java 系统变成模块化的形式,让模块重启成为可能。从一定程度上也算是个热部署的方案。可惜这玩意以前开发起来就觉得很反人类,配置文件一大堆不说,学习成本也很大。和 spring 结合起来,居然是一个模块一个 spring 上下文体系。并且如果模块之间有调用关系的话,重启相关的模块会让应用出现短暂的功能性休克,也就说,整个热启动过程不平滑。 这项技术现在估计很多小伙伴都没听说过,目前也渐渐的退出历史舞台,用的企业估计很少。

ASM

ASM 是一款修改字节码的框架,同类型的框架还有 Cglib。这些框架能加载一个 class 信息,用户可以按照自己的需求增强修改这些信息,最后输出成一个新的 class。 具体实现过程,这里就不展开了。大家可以百度下,相关技术实现文章不少。 但单纯修改字节码一般要和其他技术结合起来,单靠这个也无法完成热更新,虽然 ASM 类的框架能够修改类,但是这些 ASM 的修改逻辑也是用 java 写的,这段代码也需要执行的。如果你把 ASM 的代码写在 java 里,也无法实现从外部来热更新。

Javaagent&Attach API 结合 ASM

这就是上面一段说的 ASM 要结合其他技术才能实现热更新的方案,也是目前很多开源框架采用的方案。 比如大名鼎鼎的 Arthas,就是利用 javaagent 通过 Attach API 运行时加载目标 Java 程序,最终利用 Instrumention API 或者 ASM 增强 class,来实现代码跟踪,以及代码热修改的特性。 但笔者认为用 Arthas 来完成线上代码的热更新,只能用于一些很紧急的场景。不能替代日常业务逻辑修改。而且操作起来也挺复杂。 你需要先修改 java 代码,然后把 java 代码放到服务器上,在 arthas 里查找这个类的类加载器的 hashcode,然后利用 arthas 提供的命令编译 java 代码输出成新的 class 文件,最用利用redefine命令进行热更新。 试想下,如果大量逻辑的更改。这得有多麻烦。 所以更多的是利用 arthas 对线上应用进行诊断,追踪,热更改代码其实就是 arthas 众多功能中其中一个,并不是主要功能。

换一种思路

以上方案都是基于修改 class 本身,然后让 JVM 的类加载器重新加载来实现的。 那么有没有更好的方案呢? 其实 java 代码可以运行一些脚本的,jdk 本身就支持调用脚本,从 JDK 1.6 开始,java 就支持 JSR223,可以用一致的形式在 JVM 上执行一些脚本语言,而且可实时编译,运行的效率和 java 不相上下的。 有的同学看到这里可能会拍砖了:利用脚本只能更改部分逻辑,不可能把所有的逻辑都用脚本写吧,你这篇文章探讨的不是 “有没有可能所有的逻辑都可热更新” 么? 别急,首先我们来确定一个事情。你的 java 应用系统需不需要所有的逻辑都是可以热更新的?很多代码都是大致固定不变的,比如 util 类,一些 vo 的定义也不大变更的,一些固定的业务也不需要热更新需求的。只有一些经常变更的决策部分,可能需要热更新。 那么我们只要把需要经常变的部分用脚本来定义不就可以了么。 业界有没有类似的开源框架呢? 还真有,而且是高 star 的热门开源项目,能够帮你做到用脚本进行热更新业务。

开源编排规则引擎

可能有小伙伴又要说了:你不是介绍 java 代码热部署么,怎么话题转到规则引擎上去了? 这里要说下,规则引擎的一大特性就是把决策部分逻辑剥离到外面,能够实现逻辑的变动快速热变更。 而这次介绍的规则引擎框架则更为强大,除了能剥离逻辑,还能解耦系统,让你的所有的逻辑块均可随意变更。理论上能实现所有的逻辑都可变更,不是部分哦。 这就是业界现在 很火的编排式规则引擎框架:LiteFlow。 LiteFlow 的理念很简单,就是把系统中的各个逻辑切分成一小块一小块的,称之为组件,这些组件可以由 java 代码来写,也可以用脚本来写。然后一个完整业务就是把各个组件组搭一起,形成一个完整业务链。

3c90e9e4-667d-11ed-8abf-dac502259ad0.png


这种模式的好处就是,不需要热更新的部分可以用 java 组件来写,需要经常变的部分可以用脚本来写。所有的组件均可混搭成为一个业务。如何编排这些组件,LiteFlow 独创了 ELF 语法,拥有非常好上手的编排语法。程序员的话,十分钟就可以上手。上图粉色部分就是最简单的一种串联形式。 业务链路中组件可实时更换,也可实时增加,形成一个新的业务链。同时定义好的组件也可复用在其他的链路中。

3cb80c68-667d-11ed-8abf-dac502259ad0.png


LiteFlow 的脚本方案也是利用 JSR223 来实现的,目前已经实现的脚本有三种:

3ce1f2c6-667d-11ed-8abf-dac502259ad0.png


为什么说利用 LiteFlow 编排引擎框架,你的所有逻辑都是可以变更的呢。因为你完全可以把所有的逻辑都用脚本组件来实现,LiteFlow 提供了非常强大的脚本支持,完全和 Java 底层打通,你可以在脚本中 import java 的类,也可以调用 java 的类方法,甚至于可以在脚本中去定义方法,定义类,一切写法和 java 中完全一样。 更夸张的是,LiteFlow 允许你在脚本中调用 spring 上下文的 bean,你可以在脚本中调用 DAO 取数据,可以在脚本中发送 rpc 给其他微服务。只要你愿意,你可以一行 java 业务代码不写,完全把业务搬到脚本组件中去。 而且连逻辑块的顺序你也可以随意变动,因为 LiteFlow 的编排规则和脚本均可实现热变更。 LiteFlow 为经常用的存储中间件也提供了原生支持:

3d196af8-667d-11ed-8abf-dac502259ad0.png


LiteFlow 支持所有的关系型数据库,另外 zk,etcd,nacos 均可支持,还提供了额外的扩展接口,供你自己扩展成其他的存储方式。 有想过么,你所有的逻辑和规则编排语法,都是存在于系统之外的。只要更改其脚本和逻辑,你所有节点的系统不需要做任何事,实时的进行热变更。 而这一切,LiteFlow 做到了非常平滑,所谓平滑的意思是,不用担心在热变更的时候你的业务会受到任何的中断,也不会因为热变更造成正在执行的链路产生任何的异常。 LiteFlow 编排能力有多强大呢,简单的几个关键字就可以编排出超乎想象的效果:

3d3eb9a2-667d-11ed-8abf-dac502259ad0.png

3d5fac7a-667d-11ed-8abf-dac502259ad0.png

结语

在 java 的业务热部署领域,LiteFlow 作为一款规则引擎,给出了一种新的解决思路。 除以上文中介绍的之外,LiteFlow 框架还拥有众多的高级特性,从各个方位提升你系统的灵活性。 并且作为开源软件,LiteFlow 拥有国内非常好的社区氛围和文化。 最后放出 LiteFlow 的官网和仓库地址,如果你觉得这款开源框架对你的业务有帮助,赶紧来了解一下吧 。

项目官网: https://liteflow.yomahub.com gitee

托管仓库: https://gitee.com/dromara/liteFlow github

托管仓库: https://github.com/dromara/liteflow

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102989
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66746
  • 虚拟机
    +关注

    关注

    1

    文章

    854

    浏览量

    27370

原文标题:Java项目有可能做到所有的代码逻辑均可热部署吗?

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [转帖]JAVA私塾关于实训项目的总结

    :绝对要指导学生亲自动手做,而不是看和听,所以尽量不要选择现成代码项目,演示用的项目也最好不配发代码,让学生能够跟着做出来才是真的掌握了
    发表于 01-03 12:04

    如何做到每天写代码

    了。安排、利用好周末时间。对大多数人来说,利用周末时间做业余项目项目取得大进展的绝好机会。而对于我来说,如果直到周末业余项目能做好我会对自己很失望。之前我很少能完成
    发表于 04-25 19:16

    Java工程师必须掌握的技术哪些?

    )spirngMvc 等等的其他一些相似的框架,还有项目架构中经常会用到的缓存框架例如memcached ,ehcache,oscache等Java缓存框架,需要掌握基本使用,部署,性能调优,配置4. 数据库基础数据库
    发表于 02-09 16:18

    详解java代码优化方法

    Java代码优化是Java编程开发很重要的一个步骤,Java代码优化要注重细节优化,一个两个的细节的优化,产生的效果不大,但是如果处处都能注
    发表于 04-02 15:43

    用AD8367做音频AGC不能做到AGC

    上面的解法 CAGC电容也换过 CHP与C4都换过 RB改为电位器也只能改变放大倍数不能做到AGC求解是还有什么地方需要修改还是哪里问题谢谢
    发表于 08-22 10:18

    docker中java环境的部署

    docker 部署java环境以及常用应用(持续更新)
    发表于 05-24 15:44

    Linux部署maven(war包)web 项目

    一、说明Linux配置Java环境及安装Tomcat,请参考博文点击打开链接Linux部署maven步骤分为以下几点:1.Eclipse导出war包2.拷贝war包到Linux3.Linux下解压
    发表于 07-04 06:40

    linux的java项目部署

    b.因为tomcat的安装依赖于Java jdk,所以我们需要在判断linux系统下面是否安装jdk
    发表于 07-25 08:41

    是否可能通过引导加载器从sd卡下载可执行代码的闪存程序?

    大家好,我一个项目,包括一个串行tft显示器+触摸屏+sd卡,图18F46K22我的问题是:是否可能通过引导加载器,从sd卡下载可执行代码
    发表于 09-10 14:16

    是否可能通过配置寄存器关闭所有的LED?

    只是想知道,是否可能通过配置寄存器关闭所有的LED?我问的原因是…Led非常适合于设置和运行,但是在一些应用中,每天运行很少闪烁的LED会非常烦人。如果通过软件他们可以关闭,这将是美妙的…我试图找出如果其中一种模式可以
    发表于 10-22 11:59

    Java语言哪些特性

    ,大大简化了程序设计人员的资源释放管理工作。  Java提供了丰富的类库、API文档以及第三方开发包,另外还有大量基于Java的开源项目。JDK(Java开发者工具箱)已经开放源
    发表于 12-14 17:18

    嵌入式部署或模式的相关资料分享

    DB。Java DB两个部署选项: Embedded和Network Server 。这篇文章是关于嵌入式部署或模式的。 1.嵌入式 在嵌入式模式下:该数据库只能从一个应用...
    发表于 12-27 06:17

    如何避免在每次部署部署到RAM时闪烁代码

    每次部署都需要很长时间的编程和验证。我们想加快部署过程。到目前为止,我们所有的 IDE 都允许将图像部署到 RAM。MCUxpresso
    发表于 03-27 06:51

    程序员为什么记不住所有的代码如何解决这个问题

    在程序员的职业生涯中,记住所有你接触过的代码是一件不可能的事情!那么我们该如何解决这一问题?
    的头像 发表于 12-15 08:51 6949次阅读

    eclipse怎么运行java项目

    代码添加到项目中。您可以通过右键单击项目名称,然后选择“New” > “Class”来创建一个新的Java类。在弹出的对话框中,输入类的名称和
    的头像 发表于 12-06 11:25 1029次阅读