開發與維運

一種簡單快捷的java熱部署方式

Arthas Hot Swap 插件介紹

引言

熱部署是幫助開發人員提高效率的利器,如果你的開發語言是java,開發環境是遠程服務器,遠程服務器debug端口被限制,那麼你可能無法通過debug HotSwap實現熱部署,那麼本文介紹的IntelliJ IDEA插件可以幫助你在遠程服務器實現熱部署,而且操作簡單快捷。本文熱部署插件(Arthas Hot Swap)是基於Arthas redefine命令實現的,使用該插件進行遠程熱部署無需任何配置,無需使用debug端口,只需幾個簡單動作就能完成。

使用方法

  1. IntelliJ IDEA安裝插件“Arthas Hot Swap”,從Releases下載安裝包。
  2. 熱部署使用的是class文件,所以需要先使用“mvn compile”編譯相關工程,後續可以使用IDEA的Recompile編譯單個文件,節省編譯時間。
  3. 選擇需要熱部署的java源文件或者class文件,在類名或方法名上單擊右鍵,選擇“Arthas Hot Swap”的“Swap this class”,插件後臺執行成功後會把熱部署需要的命令複製到粘貼板。
  4. 登錄遠程服務器,粘貼熱部署命令並執行,熱部署完成,該機器運行著最新的class。機器第一次執行熱部署命令,可能失敗,再執行一次試下。

第一步:選擇Arthas Hot Swap插件選項
第一步:選擇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插件執行流程

  1. 根據用戶選擇的源文件找到class文件,默認在/target/classes路徑下面查找,用戶也可以直接選擇class文件。
  2. 使用AES-128加密class文件,輸出base64編碼。
  3. 加密的class文件上傳至oss,返回oss訪問地址。
  4. 渲染熱部署需要執行的腳本,渲染後的腳本也上傳至oss,返回oss訪問地址。
  5. 組裝熱部署命令,並自動複製到粘貼板。

遠程服務端熱部署執行流程

  1. 登錄遠程服務器,粘貼熱部署命令並執行。
  2. 下載熱部署腳本,執行熱部署腳本。
  3. 創建工作空間。
  4. 檢查是否安裝openssl,沒有安裝則進行安裝。
  5. 下載AES-128加密的class文件。
  6. 使用openssl enc解密得到class二進制文件。
  7. 通過腳本方式安裝arthas。
  8. 創建與arthas通信的管道並啟動arthas。
  9. arthas選擇java進程,默認選擇第一個。
  10. arthas執行redefine命令熱替換class文件。
  11. 打印熱替換結果。

Leave a Reply

Your email address will not be published. Required fields are marked *