JAVA神操作--使用Arthas线上热更新实战

热更不规范,同事两行泪

背景

C君是一个javaer,最近在开发用户登出接口的时候,不小心把接口参数拼错了
正确的是:

/api/v1/user/logout?referrer=www.javaer.com

结果不小心把referrer写成了referre,把字母 r 给丢了,带来的影响就是用户登出后再登陆就无法回到正确的地址,而且代码已经上生产了,这可怎么办?!
偷偷发一版?那么多用户已经在线了,如果被发现就GG了。
下一版再修复?那等待时间也太长了,让BOSS知道也是一首凉凉啊,有可能还的找新的BOSS谈。
突然,C君发现Alibaba开源的一款神器Arthas,居然可以热更新!!!真乃神器啊~

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?

开搞

1. 安装Arthas
Arthas的文档非常全面,安装起来当然没有什么难度啦。简单总结就是下载 --> 启动 --> 使用。针对服务器无法使用外网的情况,Arthas也提供了全量安装包,非常的方便。

2. 修复BUG
启动Arthas

java -jar arthas-boot.jar  

然后选择我们需要热更新的JVM进程

[INFO] arthas-boot version: 3.1.0
[INFO] Process 58827 already using port 3658
[INFO] Process 58827 already using port 8563
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 58827 org.apache.catalina.startup.Bootstrap
  [2]: 59288 org.apache.catalina.startup.Bootstrap
  [3]: 59482 org.apache.catalina.startup.Bootstrap
  [4]: 1857 tms-gateway-proxy-0.0.1-SNAPSHOT.jar
  [5]: 59834 org.tanukisoftware.wrapper.WrapperSimpleApp
1

在这台服务器上一共有5个java进程,可以通过ps命令确认我们使用的是哪个。这里我们选择了第一个。
一段启动信息后,就进入了交互模式。
通过sc查找需要修改的class的ClassLoader

$ sc -d *OAuthClient| grep classLoaderHash
classLoaderHash   452c5c14
classLoaderHash   452c5c14 

再使用redefine命令重新加载新编译好的OAuthClient.class

$ redefine -c 452c5c14  /tmp/OAuthClient.class
redefine success, size: 1

注意:

不允许新增加field/method
正在跑的函数,没有退出不能生效

检验热更新结果
再次访问登出接口然后再登陆,就会跳转到正确的地址去了。

最后,Arthas提醒您: 诊断千万条,规范第一条,热更不规范,同事两行泪。

      </div>
posted @ 2019-05-29 14:36  星朝  阅读(2769)  评论(0编辑  收藏  举报