markdown 使用Arthas进行Spring Boot热更新
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 使用Arthas进行Spring Boot热更新相关的知识,希望对你有一定的参考价值。
# 下载启动arthas-boot
>wget https://alibaba.github.io/arthas/arthas-boot.jar
>java -jar arthas-boot.jar --target-ip 0.0.0.0
# 热更新代码
下面介绍通过jad/mc/redefine 命令实现动态更新代码的功能。
目前,访问 http://localhost/user/0 ,会返回500异常:
>curl http://localhost/user/0
返回值如下
>{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"}
下面通过热更新代码,修改这个逻辑。
## jad反编译UserController
>jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
jad反编译的结果保存在 /tmp/UserController.java文件里了。
然后用vim来编辑/tmp/UserController.java:
>vim /tmp/UserController.java
比如当 user id 小于1时,也正常返回,不抛出异常:
```
@GetMapping(value={"/user/{id}"})
public User findUserById(@PathVariable Integer id) {
logger.info("id: {}", (Object)id);
if (id != null && id < 1) {
return new User(id, "name" + id);
// throw new IllegalArgumentException("id < 1");
}
return new User(id.intValue(), "name" + id);
}
```
## sc查找加载UserController的ClassLoader
>sc -d *UserController | grep classLoaderHash
终端显示如下
>classLoaderHash 1be6f5c3
可以发现是 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
>redefine /tmp/com/example/demo/arthas/user/UserController.class
终端显示如下
>redefine success, size: 1
热修改代码结果
redefine成功之后,再次访问 http://localhost/user/0 ,结果是:
```
{
"id": 0,
"name": "name0"
}
```
以上是关于markdown 使用Arthas进行Spring Boot热更新的主要内容,如果未能解决你的问题,请参考以下文章
JVM实战系列「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康
arthas 获取spring被代理的目标对象
spring booot arthas报错
Arthas 定位 Spring Boot 接口超时
Arthas 定位 Spring Boot 接口超时
用 Arthas 定位 Spring Boot 接口的超时问题,让应用起飞~