java线上bug热更新修复技术_线上热更新代码只需3步 Arthas实战

当我们发现线上出现bug,如何进行不停机热更新代码?

5bc76578ae436d273050a219fb3d0a6d.gif

1、问题背景

当我们发现线上出现bug,在排查时可能不是很好确认问题,并且最好保留现场,才能重现问题,或者需要快速修复bug,才能比较快速或者方便的临时解决紧急问题。这时,热更新就能很好的帮助我们了。虽然可以通过发版进行解决生产问题,但是项目频繁发版会存在一定的风险:

比如用户正在使用对应功能,会影响用户的使用体验。

紧急版本上线可能还需要领导的特别审核。

等到下一版本再修复,等待的时间可能太久了。

这时如果能热更新线上的部分代码,协助我们尽早的找到问题,并且快速解决bug,快速解决问题也能得到领导和同事的认可,所以需要掌握一定的救火技能是极其必须的。

这里就分享下我的使用经验:最近在排查一个生产线程安全问题,在获取主机连接时,出现不能确定是否获取准确的对应连接,即当前连接的机器是否正确的。

大致流程如下:

a514d3d6b4bffcd6082c099c0091d97c.png

这里你可以不理解我的场景需求,只需要看我是怎么使用热更新解决问题即可。

2、排查解决:热更新

我这边需要增加日志打印来确定获取的连接是否正确。那么怎样将线上代码进行热更新呢?

这里还是使用阿里提供的强大工具Arthas帮我们解决问题。

85ee78a3dd7bfa7b321a40478a0c9771.png

1)第一步,修改代码

在代码中增加相应的日志代码,并且将相应的Java代码文件编译成class字节码文件HostFactoryImpl.class。将字节码文件上传到生产服务器。

2)第二步,获取类加载哈希值启用Arthas,只需要使用java -jar  arthas-boot.jar即可,并且使用sc命令查找对应的字节码文件(因为我们要替换它),并且要找到它的类加载哈希码,因为是类加载器加载类,所以我们需要使用同一个类加载器才行。

1dd6d4bbbde7ebed5bc592bc3c5e7a1d.png

以上就是目标类的相关信息。

0736b12b50e3233d83057e8bad3bc372.png

筛选出我们关注的类加载器哈希值。这里为什么有两个?一个是接口,一个是实现类。找到对应的类加载哈希:38af3868。

3)第三步,替换字节码文件将刚才上传到服务器的字节码文件加载到JVM中。使用redefine命令进行替换:

997f224786297898bfc5bbb9f07a2a6b.png

返回success,说明替换成功!

9e4f3bf15144fd96d7195509ab01b3b1.png

马上去观察日志打印,确实生效了。但是这是针对新的请求执行才会生效,正在执行的代码还是跟之前一样。

注意:Arthas热更新目前不支持在类增加/删除属性field或方法method操作。假如你增加了属性或者方法则会出现下面的提示:

ab15e3ca68c40bc19e631d91d0ca1ba6.png

3、总结

1)使用Arthas命令:sc和redefine。2)正在执行的代码不会生效,新的请求执行才会生效。3)不支持增加或删除属性field和方法method。

往期Arthas生产实战:

Arthas官方文档sc命令:https://alibaba.github.io/arthas/sc.html

参考:https://www.jianshu.com/p/efa46ccdd7f0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值