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

2022-09-23 10:55:09 +08:00
 8629
场景:把接收处理数据的类 源码放在 web 后台页面中在线编辑,编辑完这个类直接提交到 redis 中。然后线上服务就替换了这部分代码,不需要打包发布实现了更新服务。
请问这是什么技术,什么关键字可以查询,有没有现成的 demo 可以学习下。感谢!
7089 次点击
所在节点    Java
59 条回复
3032
2022-09-23 14:59:05 +08:00
阿里的阿尔萨斯了解下
vvtf
2022-09-23 15:07:16 +08:00
1. 通过 Agent 拿到 Instrumentation
2. 通过 Instrumentation#redefineClasses 替换类即可.
leegradyllljjjj
2022-09-23 15:15:55 +08:00
v 我 50 ,我帮你守着服务器,你一提交代码我就帮你编译发布
zgzhang
2022-09-23 15:23:09 +08:00
这样的东西很成熟呀,我做的类似的项目,核心原理就是 Java 的动态编译+spring bean 的替换,如果有需要可以联系我
BiChengfei
2022-09-23 15:58:53 +08:00
magic-api
warcraft1236
2022-09-23 16:43:22 +08:00
这个跟热更新不是一个原理吗
thisisgpy
2022-09-23 17:45:53 +08:00
先把 class restransform 回来,记录一下当前在用 classloader 的 hashcode ,新的代码编译后找到刚才的 classloader rebase 进去
Znemo
2022-09-23 18:11:57 +08:00
classloader 就能做到,但是这要围绕这种编程模型来架构,一般的业务代码可以这样热替换,核心代码例如 class 的加载、事件调度等就很难做到了,另外方法区的垃圾回收要关注,被替换掉的 class 要有有效的回收机制。除非精心设计,否则需要注意的问题还是蛮多的。
hetal
2022-09-23 19:02:22 +08:00
换成 php 是不是更简单~
viakiba
2022-09-23 20:03:10 +08:00
写过这个介绍, 可以参考 https://blog.viakiba.cn/2020/03/30/java-hot-fix/
byte10
2022-09-23 20:20:01 +08:00
OSGI 框架 应该也可以满足 OP 需求,另外还有一种 hotswap , hook 技术都可以做到,并不是特别复杂的事情,可以多了解下。
iloveios
2022-09-23 21:15:23 +08:00
赞同 49 楼
muhuan
2022-09-23 21:51:22 +08:00
songco
2022-09-24 02:57:49 +08:00
Groovy 加 1

以前做过一个比较大的平台,大量使用 groovy ,还是比较好用的,缺点是复杂逻辑用 groovy 容易埋坑

Classloader 我在项目中也大量使用过,类似实现了一种插件机制,插件的升级就相当于替换了
westoy
2022-09-24 03:56:07 +08:00
@hetal

其实 erlang 那种才是

php 其实并不是热更新,并发大一点很容易在更新时触发一半新版本夹了几个旧版本文件

上古严谨点的 php 项目也是通过部署最新版本到一个新目录,然后启动新服务替代掉老服务,包括 zend 搞的 phpcloud ,推送文件变更后立刻访问也会提示正在重启应用
ychost
2022-09-26 22:29:30 +08:00
建议 Groovy ,别搞 Java 热加载了一堆坑,
LiangLin
2022-09-28 19:54:39 +08:00
jsp 了解以下
b2byco
2022-09-29 10:44:52 +08:00
Janino
http://janino-compiler.github.io/janino/

The ShippingCost class demonstrates how easy it is to use Janino as an expression evaluator.
The ExpressionDemo class implements a command line-based test environment for the expression evaluator.
The ScriptDemo class implements a command line-based test environment for the script evaluator.
The ClassBodyDemo class implements a command line-based test environment for the class body evaluator.
ggbond2233
2022-09-30 15:25:52 +08:00
QLExpress

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

https://ex.noerr.eu.org/t/882334

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

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

© 2021 V2EX