请教下 Java 热替换代码的技术

2022-09-23 10:55:09 +08:00
 8629
场景:把接收处理数据的类 源码放在 web 后台页面中在线编辑,编辑完这个类直接提交到 redis 中。然后线上服务就替换了这部分代码,不需要打包发布实现了更新服务。
请问这是什么技术,什么关键字可以查询,有没有现成的 demo 可以学习下。感谢!
5877 次点击
所在节点    Java
59 条回复
nothingistrue
2022-09-23 10:57:40 +08:00
你这要能实现,得推翻 Java 的编译原理。
sunjiayao
2022-09-23 10:59:11 +08:00
groovy 你值得拥有
XiLingHost
2022-09-23 10:59:25 +08:00
把新的代码自动构建成一个镜像,然后调整服务路由做灰度发布就行了,调用方可以无感
wxw752
2022-09-23 11:00:49 +08:00
就因为这个问题,我们公司到现在还有一块业务用的 PHP
LeegoYih
2022-09-23 11:01:14 +08:00
GitHub 搜 Java HotSwap 还是有挺多 demo 的,不过能替换的程度有限
twinsdestiny
2022-09-23 11:02:21 +08:00
groovy 可以
justicelove
2022-09-23 11:02:24 +08:00
groovy
wangxiaoaer
2022-09-23 11:03:07 +08:00
@nothingistrue ??? 怎么叫推翻呢。

javax.tools 本身就提供了编译 java 文件的途径,再加上 classloader 替换,技术上应该是可行的。
superchijinpeng
2022-09-23 11:04:03 +08:00
superchijinpeng
2022-09-23 11:04:50 +08:00
@nothingistrue 无非是 Class Load 和 Unload 一下
chendy
2022-09-23 11:04:56 +08:00
编译 api+反射,不是替换是新增……
每次生成一个新类名,编译出 class 文件,再把调用的地方的类名替换上去,完事
justicelove
2022-09-23 11:06:22 +08:00
可以搜一下 java 脚本 一般都会选择 Groovy, 也可以使用 spi, 在服务器上替换 jar 包
aguesuka
2022-09-23 11:07:02 +08:00
鉴于有在线编辑的需求, 建议直接用 groovy 脚本. 完全兼容 java 对象, 无需编译, 也就不需要热替换.
Dxxxxs
2022-09-23 11:09:01 +08:00
可以看一下 jvm 提供的 Instrumentation 类。JRebel 、springboot dev tools 、HotSwapAgent 都提供了类似的实现
pannanxu
2022-09-23 11:13:40 +08:00
PF4J
Jooooooooo
2022-09-23 11:20:12 +08:00
自定义 classloader 就行. 加载这个 jar. 然后跑方法的时候用反射拿到你热加载的那个.

我们刚好有这么搞的, 引入算法包天天变, 就用的这个方法不用发版能用上最新的

不过有几个注意点你得考虑下:

1. 有 load 记得要 unload
2. 如果是集群, 要保证所有集群都加载完了再去用, 所以需要维护机器当前加载某个 jar 的状态, 最好有个后台去查看和使用, 全部机器都加载完了才能真正使用
VYSE
2022-09-23 11:37:35 +08:00
关键字: JAVA 反序列化漏洞
这么搞后台得管控好
m2276699
2022-09-23 11:43:47 +08:00
cn.hutool.core.compiler/sofa ark
cpstar
2022-09-23 11:46:32 +08:00
java 语言层面支持。然后就是你的应用底层需要支持。我目前正在用的一个平台微应用化就支持动态加载,关闭某个应用或者打开,更新了 jar 之后动态重加载。
但是我目前用的平台支持 beanshell 、groovy 、javascript 的在线编辑和编译,java 代码的编辑和编译再加载不知道有没有库。javascript 方面使用的是 apache rhino 库,翻译 js 并运行。
ic2y
2022-09-23 11:50:56 +08:00
为什么不用规则引擎,专门处理这种事。例如 Aviator

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/882334

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX