
作者 | 周忠太 阿裡巴巴淘系技術部的一個搬磚工
【Arthas 官方社群正在舉行征文活動,參加即有獎品拿~
點選投稿】
Arthas Hot Swap 插件介紹
引言
熱部署是幫助開發人員提高效率的利器,如果你的開發語言是 java,開發環境是遠端伺服器,遠端伺服器 debug 端口被限制,那麼你可能無法通過 debug HotSwap 實作熱部署,那麼本文介紹的 IntelliJ IDEA 插件可以幫助你在遠端伺服器實作熱部署,而且操作簡單快捷。
本文熱部署插件(Arthas Hot Swap)是基于 Arthas redefine 指令實作的,使用該插件進行遠端熱部署無需任何配置,無需使用 debug 端口,隻需幾個簡單動作就能完成。gitHub 位址:
https://github.com/xxxtai/arthas-hotswap使用方法
- IntelliJ IDEA 安裝插件“Arthas Hot Swap”,從 gitHub Releases 下載下傳安裝包;
- 熱部署使用的是 class 檔案,是以需要先使用“mvn compile”編譯相關工程,後續可以使用 IDEA 的 Recompile 編譯單個檔案,節省編譯時間;
- 選擇需要熱部署的 java 源檔案或者 class 檔案,在類名或方法名上單擊右鍵,選擇“Arthas Hot Swap”的“Swap this class”,插件背景執行成功後會把熱部署需要的指令複制到粘貼闆;
- 登入遠端伺服器,粘貼熱部署指令并執行,熱部署完成,該機器運作着最新的class。機器第一次執行熱部署指令,可能失敗,再執行一次試下。
第一步:選擇 Arthas Hot Swap 插件選項
第二步:登入遠端伺服器粘貼指令并執行
第三步:執行完成,熱部署成功
熱部署的限制
由于是基于 Arthas 的 redefine 指令實作的熱部署,redefine 又是基于 Instrumentation API 實作的熱部署,是以和 IDEA 的 debug HotSwap 是有一樣的限制。限制如下:無法修改類名、方法名,無法修改類屬性名稱,無法新增類屬性,無法新增非靜态方法。由于本插件暫時無法擷取内部類的 class 檔案,是以暫時不支援修改内部類。
Arthas Hot Swap 插件原理
Arthas 是阿裡巴巴開源的 Java 代碼診斷工具。Arthas 的 redefine 指令是基于 Instrumentation API 實作的熱部署,是以和 HotSwap 熱部署方式一樣,有同樣的限制。Arthas 的 redefine 指令其實是把 Instrumentation API 的redefineClasses 方法包裝後提供給使用者,那麼我們就可以根據 redefine 指令發揮想象力,實作熱部署。
Arthas 官方文檔推薦使用 jad/mc/redefine 等一連串指令實作 class 遠端熱替換,流程大概是:jad 指令對老 class 進行反編譯 ->vim 編輯源碼 ->mc 指令編譯源碼 ->redefine 熱替換 class。這種方式存在兩個問題:一是太麻煩,二是 mc 編譯大機率會失敗。如果能這樣就好,本地修改代碼編譯後上傳 class 檔案到遠端伺服器,再使用 redefine 指令熱替換 class。是以官方文檔又推薦,首先将 class 二進制檔案轉換成 base64 編碼,然後再複制粘貼到遠端伺服器,再把 base64 編碼轉換成 class 檔案,最後,使用 redefine 進行熱替換。這麼麻煩,還不如重新部署呢。是以 redefine 指令比較雞肋。
Arthas 官方推薦的熱替換方法最大的問題在于,上傳 class 檔案到遠端伺服器進行熱替換的流程太麻煩,那麼這些麻煩且固定的流程為何不交給機器來做呢。是以,本文推薦的“Arthas Hot Swap”插件就有必要了,該插件就是為了提升使用 Arthas 進行熱替換的效率,幾個簡單的動作就能熱替換一個 class 檔案,可以解決開發過程中 80% 的熱部署需求,剩下的 20% 用重新部署解決就好了。
Arthas Hot Swap 插件執行流程
- 根據使用者選擇的源檔案找到 class 檔案,預設在 /target/classes 路徑下面查找,使用者也可以直接選擇 class 檔案;
- 使用 AES-128 加密 class 檔案,輸出 base64 編碼;
- 加密的 class 檔案上傳至 oss,傳回 oss 通路位址;
- 渲染熱部署需要執行的腳本,渲染後的腳本也上傳至 oss,傳回 oss 通路位址;
- 組裝熱部署指令,并自動複制到粘貼闆。
遠端服務端熱部署執行流程
- 登入遠端伺服器,粘貼熱部署指令并執行;
- 下載下傳熱部署腳本,執行熱部署腳本;
- 建立工作空間;
- 檢查是否安裝 openssl,沒有安裝則進行安裝;
- 下載下傳 AES-128 加密的 class 檔案;
- 使用 openssl enc 解密得到 class 二進制檔案;
- 通過腳本方式安裝 arthas;
- 建立與 arthas 通信的管道并啟動 arthas;
- arthas 選擇 java 程序,預設選擇第一個;
- arthas 執行 redefine 指令熱替換 class 檔案;
- 列印熱替換結果。
Arthas 征文活動火熱進行中
Arthas 官方正在舉行征文活動,如果你有:
- 使用 Arthas 排查過的問題
- 對 Arthas 進行源碼解讀
- 對 Arthas 提出建議
- 不限,其它與 Arthas 有關的内容
歡迎參加征文活動,還有獎品拿哦~
“ 阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公衆号。”