Arthas Hot Swap 插件介紹
引言
熱部署是幫助開發人員提高效率的利器,如果你的開發語言是java,開發環境是遠端伺服器,遠端伺服器debug端口被限制,那麼你可能無法通過debug HotSwap實作熱部署,那麼本文介紹的IntelliJ IDEA插件可以幫助你在遠端伺服器實作熱部署,而且操作簡單快捷。本文熱部署插件(
Arthas Hot Swap)是基于Arthas redefine指令實作的,使用該插件進行遠端熱部署無需任何配置,無需使用debug端口,隻需幾個簡單動作就能完成。
使用方法
- IntelliJ IDEA安裝插件“Arthas Hot Swap”,從 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檔案。
- 列印熱替換結果。