Arthas,热更新线上代码神器

在这里插入图片描述
前言
日常开发过程中,可能会遇到小问题,本地代码改完后,总得重新打包部署,线上代码才会生效,这样太麻烦了,这个时候就可以考虑使用Arthas(阿尔萨斯)工具来热更新线上代码,先使线上的功能能使用,后面有大的迭代版本的时候再打包部署。笔者使用了这个工具,发现这个操作实在是骚的很,太好用了,在此做下笔记,以供后续参考。
官方文档地址:

示例
本文示例根据项目打包部署的格式不同分为两种情况,一种是jar包,一种是war包。
本文以 Arthas 3.3.3 版本为例,主要使用到 jad/sc/mc/redefine 三个指令。
首先,下载 arthas-boot.jar,进入服务器某个目录下,比如是/data/下,执行

1、下载:curl -O https://alibaba.github.io/arthas/arthas-boot.jar
2、启动:java -jar arthas-boot.jar

1、jar包的情况:
进入服务器某个目录下,比如是/data/下,下载官方demo并启动
arthas-demo是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果,我们想要热更新代码,在打印的信息上加上“打印出信息来看===”这几个字

1、下载:curl -O https://alibaba.github.io/arthas/arthas-demo.jar
2、启动:java -jar arthas-demo.jar

在这里插入图片描述
/data/下,下载arthas并启动

1、下载:curl -O https://alibaba.github.io/arthas/arthas-boot.jar
2、启动:java -jar arthas-boot.jar

在这里插入图片描述
找到我们要热更新代码的项目,比如输入2,回车
在这里插入图片描述
在这里插入图片描述
Arthas 修改热更的逻辑主要分为三步:

jad 命令反编译出内存中的字节码,生成 class 文件

修改代码,使用 mc 命令内存编译新的 class 文件

redefine 重新加载新的 class 文件

从而达到热更新的效果

jad反编译
控制台输入,注意,–source-only后面的文件路径,开始是从/src/main/java/下面开始的,比如 com.xxx.xxx

jad --source-only demo.MathGame > MathGame.java

在/data/下面会生成MathGame.java文件,我们用开发工具或者vi命令打开修改MathGame.java内容,在打印的语句里面加上“打印出信息来看===”这几个字保存

sc 查找类加载器hash值

控制台输入

sc -d demo.MathGame

在这里插入图片描述
classLoaderHash这个字段就是hash值

Arthas 支持 grep,你也可以简化该操作为:

sc -d demo.MathGame | grep classLoaderHash

mc 内存编译

执行:mc -c 55f96302 /data/MathGame.java -d /data
结果:Memory compiler output:
/data/demo/MathGame.class

redefine 热更新代码

执行:redefine /data/demo/MathGame.class
结果:redefine success, size: 1

测试:
在这里插入图片描述
2、war包的情况:
因为war包是直接放在tomcat启动的,启动arthas有点不一样,我们先通过ps -ef|grep java命令查找tomcat中的java进程pid
在这里插入图片描述
启动arthas

java -jar /data/arthas-boot.jar 2854

如果遇到如下问题,就根据提示修改

[INFO] arthas-boot version: 3.3.3
[INFO] Process 6870 already using port 8563
[ERROR] Target process 2854 is not the process using port 8563, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 6870, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to use different http port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port 9999

执行如下命令

java -jar /data/arthas-boot.jar --telnet-port 9998 --http-port 9999 2854

在这里插入图片描述
我们事先在服务器上部署了一个war包
jad操作和jar包一样,但当在操作mc命令时,可能会报错

Memory compiler error, exception message: java.lang.RuntimeException: Wasn't able to open jar:file:/data/tomcat/webapps/gyl/WEB-INF/lib/shiro-core-1.4.0.jar!/ as a jar file, please check $HOME/logs/arthas/arthas.log for more details.

没关系,可以利用开发工具比如idea,将我们要修改的java类直接在本地编译成class文件再上传到服务器,我这边编译完成后上传到/data/下面
在这里插入图片描述
然后在执行redefine命令

redefine /data/MicroAppController.class

测试:
没修改之前的打印内容
在这里插入图片描述
热更新代码后的打印内容
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空码字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值