-
Notifications
You must be signed in to change notification settings - Fork 7.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Arthas实践--jad/mc/redefine线上热更新一条龙 #537
Comments
如果有一些类比较复杂,那么有可能 这时,可以在本地修改代码,然后把 有一些服务器的权限比较严格,不允许直接上传文件,那么可以用一些技巧来绕过。比如传用
base64 < Test.class > result.txt
|
mc 内存编译的时候会根据类所在的包路径在服务器生成指定路径,是这样吧? |
mc 不指定输出目录,默认就是target进程的工作目录。可以用 |
本地修改较为复杂的情况, 检查class是否能热更新可在idea中按ctrl+shift+f9 |
nice |
@wangdonghello 看wiki,本地编译上传 |
@hengyunabc 这个有没有什么办法可以处理,我现在想通过 arthas 的这个功能,进行批量操作,所以本地编译class行不通。 |
按流程操作未碰到问题,但是最后验证时并未变更是什么原因,用到了lombok的@builder注解,编译时生成了两个文件 |
背景
尽管在生产环境热更新代码,并不是很好的行为,很可能导致:热更不规范,同事两行泪。
但很多时候我们的确希望能热更新代码,比如:
又比如:
Arthas是阿里巴巴开源的Java应用诊断利器,深受开发者喜爱。
下面介绍利用Arthas 3.1.0版本的
jad
/mc
/redefine
一条龙来热更新代码。Arthas在线教程
下面通过Arthas在线教程演示热更新代码的过程。
在例子里,访问
curl http://localhost/user/0
,会返回500错误:下面通过热更新代码,修改这个逻辑。
jad反编译代码
反编译
UserController
,保存到/tmp/UserController.java
文件里。jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
修改反编绎出来的代码
用文本编辑器修改
/tmp/UserController.java
,把抛出异常改为正常返回:sc查找加载UserController的ClassLoader
可以发现是spring boot的
LaunchedURLClassLoader@1be6f5c3
加载的。mc内存编绎代码
保存好
/tmp/UserController.java
之后,使用mc(Memory Compiler)命令来编译,并且通过-c
参数指定ClassLoader
:$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp Memory compiler output: /tmp/com/example/demo/arthas/user/UserController.class Affect(row-cnt:1) cost in 346 ms
redefine热更新代码
再使用redefine命令重新加载新编译好的
UserController.class
:检验热更新结果
再次访问
curl http://localhost/user/0
,会正常返回:总结
Arthas里
jad
/mc
/redefine
一条龙来线上热更新代码,非常强大,但也很危险,需要做好权限管理。比如,线上应用启动帐号是 admin,当用户可以切换到admin,那么
所以:
最后,Arthas提醒您: 诊断千万条,规范第一条,热更不规范,同事两行泪。
Arthas实践系列
The text was updated successfully, but these errors were encountered: