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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM