Arthas实现线上代码热部署
在实际开发中,经常会出现某一段代码出参和入参都不是理想情况,但是在当时开发的时候并没做日志输出,在我们排查的时候非常搞心态,需要重新提交代码,重新发布,然后看日志输出,最后才能开始排查问题,非常麻烦,希望有一种方式可以在线上进行热部署,这里使用Arthas
https://arthas.aliyun.com/doc/
▼java复制代码@RestController @RequestMapping("/agent") public class AgentController extends BaseController { private static final Logger log = LoggerFactory.getLogger(AgentController.class); @GetMapping("/hello") public AjaxResult hello(String name) { return AjaxResult.success(StrUtil.format("hello {}", name)); } }
现在有一个hello请求,每次请求都会返回下面的json信息
▼java复制代码{"msg":"hello {name}","code":200}
现在假如某次请求会报错,但是因为提交代码的时候 没有日志打印这个参数 现在需要热部署这段代码 直接打印这个参数 省去发布的时间精力
修改hello请求,增加日志输出(需要注意 log 已经在初次发布就带上去了 这里只做log 输出)
▼java复制代码@RestController @RequestMapping("/agent") public class AgentController extends BaseController { private static final Logger log = LoggerFactory.getLogger(AgentController.class); @GetMapping("/hello") public AjaxResult hello(String name) { log.info("hello {}", name); return AjaxResult.success(StrUtil.format("hello {}", name)); } }
在本地使用mvn 重新打包 获得这个类的字节码文件 并上传到服务器上

下载Arthas
▼shell复制代码curl -O https://arthas.aliyun.com/arthas-boot.jar
启动Arthas
▼shell复制代码java -jar arthas-boot.jar
选择对应的java 进程

启动成功

加载新的字节码文件
▼java复制代码redefine /data/agentSys/AgentController.class
看到以下输出 代表加载成功

再次请求
▼shell复制代码http://ip:8080/agent/hello?name=11 http://ip:8080/agent/hello?name=22 http://ip:8080/agent/hello?name=33
可以看到日志可以正常输出

很强大的工具 但是使用起来也是有诸多限制

具体可参考:
其实想要查看 入参watch更合适 但是主要想说一下redefine
关于 watch
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
