面试官:怎样使用arthas进行热部署,解决线上问题?

arthas 热部署的使用场景主要有以下几个:

  1. 调试时快速修改代码:在不需要重启应用的情况下,可以快速修改代码,进行调试。
  2. 补丁修复:当线上出现紧急 bug 时,可以通过热部署方式及时修复问题,避免影响线上的正常业务。
  3. 性能优化:通过热部署可以动态修改代码,方便进行性能优化和相关问题的调试。
  4. 动态调整应用配置:通过修改应用配置参数等信息,可以调整应用的行为,进一步优化应用的性能和响应速度。
  5. 监控应用状态:可以通过 arthas 热部署实时监控应用状态和各种指标,快速定位问题并进行优化。

总的来说,arthas 热部署可以提高开发和调试的效率,快速定位和解决线上问题,以及优化应用的性能。

下面是代码实践:

使用SpringBoot启动一个Http接口。

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}
复制代码

jad 反编译可以看到:

arthas@96830]$ jad com.example.demo.controller.HelloController

ClassLoader:
+-jdk.internal.loader.ClassLoaders$AppClassLoader@9e89d68
  +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@5a8e68a3

Location:
/Users/xxxx/IdeaProjects/AdvancedJava/demo/target/classes/

       /*
        * Decompiled with CFR.
        */
       package com.example.demo.controller;

       import org.springframework.web.bind.annotation.GetMapping;
       import org.springframework.web.bind.annotation.RestController;

       @RestController
       public class HelloController {
           @GetMapping(value={"/hello"})
           public String hello() {
/*15*/         return "Hello World!";
           }
       }

Affect(row-cnt:1) cost in 247 ms.
复制代码

现在我们针对这个类的源代码进行修改。

源代码获取也可以通过命令行:

jad --source-only com.example.demo.controller.HelloController > /opt/HelloController.java
复制代码

通过idea的Build工具进行Recompile重编译源码

或者使用mc进行编译

mc /Users/xxx/Downlxoads/HelloController.java -d /Users/xxx/Downloads/
复制代码

idea提示是否要重启SpringBoot,这个时候直接点Cancel,取消。如果重启了就会导致新的代码被加载到新进程啦。

这时候我们可以再使用jad来看这个类的情况,会发现还是原来的代码,Hello World!

然后开始使用retransform来热部署新的class文件。

class文件路径:

/Users/xxxx/IdeaProjects/AdvancedJava/demo/target/classes/com/example/demo/controller/HelloController.class

执行命令:

加载外部的.class文件,retransform jvm 已加载的类。

retransform /Users/xxxxx/IdeaProjects/AdvancedJava/demo/target/classes/com/example/demo/controller/HelloController.class
复制代码

使用vmtool获取对象,再用对象调用方法

[arthas@47968]$ vmtool --action getInstances --className com.example.demo.controller.HelloController --express 'instances[0].hello()'
@String[Hello Ketty!]
复制代码

我们可以看到,对应的代码被我们重新加载啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值