熱更不規范,同事兩行淚
背景
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>
