1. 概述 本地更新腳本是基於arthas工具的retransform命令熱替換class,此方法用於在不重啟項目的前提下,替換更新的class,如關鍵類添加列印日誌,排查線上問題 但是arthas工具的命令稍顯複雜,有那個時間還不如重新部署,因此需要一個可以快速替換的工具來進行替換 2. 方法一: ...
1. 概述
本地更新腳本是基於arthas工具的retransform命令熱替換class,此方法用於在不重啟項目的前提下,替換更新的class,如關鍵類添加列印日誌,排查線上問題
但是arthas工具的命令稍顯複雜,有那個時間還不如重新部署,因此需要一個可以快速替換的工具來進行替換
2. 方法一:ArthasHotSwap插件
使用idea插件 ArthasHotSwap插件,安裝後,選中類名數據右鍵點擊“swap this class”,會複製一個腳本,然後粘貼到項目啟動的伺服器上,可完成替換,具體網上均有教程,此處不多贅述。
3. 方法二:自定義shell腳本
我本人也使用過這個插件,但是試過幾次均沒有成功因此模仿ArthasHotSwap插件的流程,寫了一個自定義腳本。
3.1. ArthasHotSwap 插件流程
大致流程如下:
1.將本地需替換的class文件,編碼成base64文本文件,並上傳至文件伺服器(可能是OSS)
2.提供一個預設執行腳本,給用戶複製
3.用戶拿到複製腳本後,在伺服器上執行
4.腳本下載base64文本文件,並解析成class文件
5.啟動arthas命令,如果用戶沒有安裝,腳本會自動安裝,預設路徑 /home/用戶名xxx/.arthas/
6.執行arthas中的retransform 命令,將解析出來的class文件替換至運行的jvm中
3.2. 自定義腳本
按照這個流程,自定義寫了一個腳本,去掉了上傳文件伺服器步驟,只需要把許替換的文件上傳至伺服器指定目錄,啟動腳本時指定項目包名稱,即可完成指定項目多個class文件熱替換
#熱刷新class指定路徑配置
updateClassPath="/tmp/replace"
#伺服器上arthas路徑
arthasPath="/home/cmp/.arthas/lib/3.6.7/arthas"
#入參 項目包名稱,支持模糊匹配
projectName=$1
rm -f tmp_in
mknod tmp_in p
exec 8<> tmp_in
sh ${arthasPath}/as.sh --select $projectName <&8 &
echo "********************************************* Arthas HotSwap The Java Class *************************************************************"
sleep 1s
echo "
" >> tmp_in
sleep 3s
echo "開熱載入......"
#遍歷目錄中的所有class文件
for file in ${updateClassPath}/*
do
echo ${file}
#如果file尾碼是class 執行替換
if [ "${file##*.}" = "class" ]; then
#開始啟動arthas項目
echo "熱載入${file}"
echo "retransform ${file}" >> tmp_in
fi
done
echo "quit" >> tmp_in