Arthas,热更新线上代码神器

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

image.png

前言

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

示例

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

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

image.png

/data/下,下载arthas并启动

2、启动:java -jar arthas-boot.jar

image.png

找到我们要热更新代码的项目,比如输入2,回车

image.png

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

image.png

classLoaderHash这个字段就是hash值


sc -d demo.MathGame | grep classLoaderHash

mc 内存编译

结果:Memory compiler output:
/data/demo/MathGame.class

redefine 热更新代码

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

测试:

image.png

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

image.png

启动arthas

[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

执行如下命令

image.png

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

没关系,可以利用开发工具比如idea,将我们要修改的java类直接在本地编译成class文件再上传到服务器,我这边编译完成后上传到/data/下面

image.png

然后在执行redefine命令

测试:

没修改之前的打印内容

image.png

热更新代码后的打印内容

image.png

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

上一篇:京东联盟-怎么跳转到京东购物小程序领券下单

相关文章
|
Arthas Java 测试技术
记一次使用 Arthas 热更新线上代码
引用参考第二条 - Arthas提醒您:诊断千万条,规范第一条,热更不规范,同事两行泪
1600 0
记一次使用 Arthas 热更新线上代码
|
Arthas Java 测试技术
Arthas可以对线上jar中的代码进行断点查看
Arthas可以对线上jar中的代码进行断点查看
3199 1
|
Arthas 存储 运维
记Arthas实现一次CPU排查与代码热更新
线上代码经常会出现CPU占用过高的情况,按以往经验我会使用top指令,进一步借助于jstack去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,即使是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下Arthas,说是可以进行代码的热更新操作,正好来试一下。
444 0
|
Arthas 存储 运维
60-微服务技术栈(高级):在线检测工具Arthas(实现CPU排查与代码热更新)
线上代码经常会出现CPU占用过高的情况,按以往经验我会使用top指令,进一步借助于jstack去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,即使是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下Arthas,说是可以进行代码的热更新操作,正好来试一下。
403 0
|
Arthas 监控 Java
不停机替换线上代码? 你没听错,Arthas它能做到
不停机替换线上代码? 你没听错,Arthas它能做到
934 0
不停机替换线上代码? 你没听错,Arthas它能做到
|
Arthas 监控 IDE
手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理
一天下午正在摸鱼的时候,测试小姐姐走了过来求助,说是需要改动测试环境 mock 应用。但是这个应用一时半会又找不到源代码存在何处。但是测试小姐姐的活还是一定要帮,突然想起了 Arthas 可以热更新应用代码,按照网上的步骤,反编译应用代码,加上需要改动的逻辑,最后热更新成功。对此,测试小姐姐很满意,并表示下次会少提 Bug。 嘿嘿,以前一直对热更新背后原理很好奇,借着这个机会,研究一下热更新的原理。
手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理
|
Arthas 存储 运维
记 Arthas 实现一次 CPU 排查与代码热更新
线上代码经常会出现 CPU 占用过高的情况,按以往经验我会使用 top 指令,进一步借助于 jstack 去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,及时是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下 Arthas,说是可以进行代码的热更新操作,正好来试一下。
记 Arthas 实现一次 CPU 排查与代码热更新
|
7月前
|
Arthas 监控 Java
Java 诊断利器 Arthas使用
Java 诊断利器 Arthas使用
222 0
|
7月前
|
Arthas 监控 Java
Arthas 可以用于监控和诊断在 Windows 系统下部署的 Tomcat 服务
Arthas 可以用于监控和诊断在 Windows 系统下部署的 Tomcat 服务
850 2
|
Arthas 监控 Java
开源Java诊断工具Arthas:开篇之watch实战
还在为排查Java程序线上问题头痛吗,看我们用阿里开源的诊断神器 Arthas 来帮您
550 1