使用Arthas实现不停机更新

背景

生产服务器的缺陷往往需要进行紧急更新,即使是多节点部署也避免不了需要重新启动服务器,使新的逻辑代码更新,所以不停机更新文件显得至关重要,今天介绍一下使用阿里的arthas实现不停机更新文件。

大致思路:我们都知道class文件的加载都是依附于类加载器的,所以我们要做的就是让原本的类加载器重新去加载类文件,这样就可以实现不重启服务器更新应用。而arthas做的就是面向jvm,拿到指定的累加器和待更新的class编译文件,剩下的交给arthas就可以了。

测试前的demo应用返回值:
在这里插入图片描述

下载安装

  • 下载
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
  • 安装启动
java -jar arthas-boot.jar
  • 选择对应的应用程序
    输入序号或者进程号即可

查询需要替换的文件的类加载器

  • 查询指定类的信息
 sc -d *UserController

sc为search class的简写,-d参数表示输出当前类的详细信息,详细信息如下:
在这里插入图片描述

  • 查询指定类的类加载器
    如上图所示,class-loader参数即为类加载器的信息,还可以使用grep进行查询过滤
sc -d *UserController | grep class-loader

在这里插入图片描述

我们要的就是类加载器的hash值,用于后面class文件加载指定

加载指定的class文件

  • 将修改后的文件上传至服务器
  • 指定上述的类加载器去加载新的class文件
redefine -c 33909752 /root/secKill/UserController.class

当返回success时,即为替换成功。
查询验证即可
在这里插入图片描述

附:在线修改class文件

  • 使用jad命令对指定class文件进行反编译,并指定生产的java文件路径
jad --source-only  com.imooc.miaoshaproject.controller.UserController > /root/secKill/decompile/UserController.java
  • 使用vim修改对应的java文件
  • 编译最后的java文件,并指定class文件路径
mc -c 33909752 /root/secKill/decompile/UserController.java -d /root/secKill/compile/

此时,对应的文件夹下面就会生成一个class文件

  • 重新加载class文件
redefine  /root/secKill/compile/UserController .class

此时不需要再次指定类加载器类了,因为上一步已经使用指定的加载器完成编译操作,只需要重新加载class文件即可

注意

当然了,Arthas虽然功能强大,但也不是万金油

1、不能增加或删除field/method
2、没有退出的函数不能生效,比如一个函数体内是一个where(true)循环,永远不会结束,那么我们修改的代码也永远不会生效。

更多命令和高阶用法,可以参考官方文档,友情链接一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值