arthas-实现热部署
Comment前言
正常情况下,如果需要在运行的程序中增加日志、或者修改部分逻辑,那么我们需要提交代码,重新部署后才能生效,这样做,会给我们增加很多不必要的时间成本。所以,支持热部署的重要性就显而易见了。
arthas是阿里出品的代码诊断工具,能有效的协助我们进行问题的定位和处理。本文,我们主要讲的是 如何利用arthas来实现代码热部署,利用arthas-boot.jar包或者使用arthas idea插件都能实现。
注:热部署也算是骚操作了,有风险,不建议在生产环境上操作。
方式一:arthas-boot.jar
运行arthas程序
下载arthas jar包,并启动,然后找到对应的java进程,输入编号进入控制台
1 | wget https://alibaba.github.io/arthas/arthas-boot.jar |
热部署命令步骤
1,在本地修改好java类,也可以使用jad命令直接在服务器上反编译生成java类后修改,如下:
命令:jad –source-only 类Reference地址 > 反编译文件保存的地址
1 | jad --source-only com.test.service.impl.UserServiceImpl > /tmp/arthas/UserServiceImpl.java |
2,编译java类,重新生成class字节码文件
命令:mc -d /生成的class文件保存目录 需要生成class文件的java原文件地址
1 | mc -d /tmp/arthas /tmp/arthas/UserServiceImpl.java |
3,找到jvm里面的classLoaderHash
命令:sc -d -f *类名 | grep classLoaderHash
1 | sc -d *UserServiceImpl |
输出:
1 | classLoaderHash 18b4aac2 |
注:添加 -f 参数可以把类的字段也输出,如:”sc -d -f *类名”。此命令建议不指定grep,这样输出的参数更多,更有助于我们判断加载类是否准确。
4,进行class热部署
命令:redefine -c 【classLoaderHash】 /编译后的class完整路径
1 | redefine -c 【替换为classLoaderHash】 /tmp/arthas/UserServiceImpl.class |
5,部署完成,可以访问最新内容
6,退出arthas
退出,并未关闭arthas服务,可以重新连接进来
1 | 按键:q |
退出并关闭arthas服务
1 | stop 或 shutdown |
7,重新链接arthas
1 | telnet 127.0.0.1 3658 |
shell快速生成操作脚本
脚本名称:arthas.sh
1 |
|
使用示例:
1 | sh arthas.sh com.test.service.impl.UserServiceImpl |
生成脚本示例:
1 | ----------------------start-------------------------- |
方式二:arthas idea插件
安装idea插件
Idea Plugins插件名称:arthas idea,找到安装即可,重启后 在类或方法上 右键,即可看到相关的arthas命令。
生成热部署脚本
1,代码修改完成后,先执行build recompile命令 进行强制性编译
2,然后,在类名上,点击鼠标右键,选择:Arthas Command >> (hot swap)redefine,生成热部署脚本
3,将拷贝到粘贴板的内容保存到“.sh”可执行文件中,上传到服务器上执行。
当然了,你也可以直接执行此命令,不过命令太长了,不推荐在命令行这么操作,如果你非要问为什么?那你试试就知道了!
执行脚本完成热部署
将.sh脚本上传到服务器后,直接用sh命令运行,即可完成代码热部署!
注意:执行命令的服务器上必须要有jdk环境
- 本文作者:沙果栗子本文链接:https://32e.co/2020/06/17/arthas-hot-deployment/版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!