开启生长之旅!这是我参与「日新方案 2 月更文挑战」的第 9 天,点击查看活动概况

大家好,我是小悟

Arthas,热更新线上代码神器

前言

日常开发过程中,可能会遇到小问题,本地代码改完后,总得从头打包布置,线上代码才会生效,这样太麻烦了,这个时候就可以考虑运用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

Arthas,热更新线上代码神器

/data/下,下载arthas并发动

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

Arthas,热更新线上代码神器

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

Arthas,热更新线上代码神器

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

Arthas,热更新线上代码神器

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

测验:

Arthas,热更新线上代码神器

2、war包的状况:

因为war包是直接放在tomcat发动的,发动arthas有点不一样,我们先经过ps -ef|grep java指令查找tomcat中的java进程pid

Arthas,热更新线上代码神器

发动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

履行如下指令

Arthas,热更新线上代码神器

我们事先在服务器上布置了一个war包

jad操作和jar包一样,但当在操作mc指令时,可能会报错

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

Arthas,热更新线上代码神器

然后在履行redefine指令

测验:

没修正之前的打印内容

Arthas,热更新线上代码神器

热更新代码后的打印内容

Arthas,热更新线上代码神器

您的一键三连,是我更新的最大动力,谢谢

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

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