記得之前寫過一篇Arthas使用教程 ,通過使用Arthas我們既可以實現線上除錯,還可以實現熱修復。最近逛了下Arthas的官網,發現它已經支援直接整合到SpringBoot應用中去,並且還出了專用的IDEA外掛。今天我們再來體驗下它,看看它的功能是不是更強大了!
SpringBoot實戰電商專案mall(50k+star)地址:https://github.com/macrozheng/mall
Arthas簡介
Arthas是Alibaba開源的Java診斷利器,深受開發者喜愛,目前在Github上已有29K+Star
。它採用命令列互動模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
ArthasTunnel
為了演示一個更加真實的線上環境,接下來我們將對Docker容器中的SpringBoot應用進行診斷。我們將使用ArthasTunnel
來實現,ArthasTunnel
相當於一個Web控制檯,使用它我們無需進入應用容器即可對應用進行診斷,非常方便。
- 首先我們需要下載
ArthasTunnel
的安裝包,下載地址:https://github.com/alibaba/ar...
- 由於官方只提供了JAR包,如果你想通過Docker方式啟動的話,可以自行打包Docker映象,打包使用的Dockerfile指令碼如下:
# 該映象需要依賴的基礎映象
FROM java:8
# 將當前目錄下的jar包複製到docker容器的/目錄下
ADD arthas-tunnel-server.jar /arthas-tunnel-server.jar
# 宣告服務執行的埠
EXPOSE 8080 7777
# 指定docker容器啟動時執行jar包
ENTRYPOINT ["java", "-jar","/arthas-tunnel-server.jar"]
# 指定維護者的名字
MAINTAINER macro
- 這裡再提供一個一鍵打包執行
ArthasTunnel
容器的執行指令碼run.sh
,指令碼內容如下;
#!/usr/bin/env bash
# 定義應用組名
group_name='mall-tiny'
# 定義應用名稱
app_name='arthas-tunnel-server'
# 定義應用版本
app_version='1.0-SNAPSHOT'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包編譯docker映象
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8080:8080 -p 7777:7777 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
- 接下來吧
ArthasTunnel
的JAR包、Dockerfile檔案、執行指令碼run.sh
上傳到Linux伺服器上,然後使用./run.sh
命令執行即可;
- 執行成功後,可以直接訪問
ArthasTunnel
的Web控制檯,訪問地址:http://192.168.3.105:8080
SpringBoot整合
在SpringBoot應用中直接整合Arthas並使用,無疑是最方便的,接下來我們將採用此種方法。
- 首先在專案的
pom.xml
中新增如下依賴,可以對比下Arthas使用教程 中的使用方法,直接整合確實簡單不少;
<!--整合Java診斷利器Arthas-->
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>3.6.1</version>
</dependency>
- 然後修改配置檔案
application.yml
,記住這個agent-id
,ArthasTunnel
連線需要使用,由於我們將會把應用容器通過--link
的方式連線到ArthasTunnel
容器,這裡的tunnel-server
按下面進行配置;
management:
endpoints:
web:
exposure:
# 暴露端點`/actuator/arthas`
include: 'arthas'
arthas:
agent-id: mall-tiny-arthas
tunnel-server: ws://arthas-tunnel-server:7777/ws
- 接下來通過之前的Dockerfile和
run.sh
打包應用,run.sh
與之前對比,只多了一行通過--link
連線到ArthasTunnel
容器的命令;
- 打包使用的Dockerfile和執行指令碼
run.sh
都已經包含在示例程式碼中了,結構如下;
- 接下來在
ArthasTunnel
的Web控制檯中輸入AgentId
為mall-tiny-arthas
,並點選Connect
按鈕即可開始診斷Java應用了;
- 比如通過
dashboard
命令來顯示當前系統的實時資料皮膚,包括執行緒資訊、JVM記憶體資訊及JVM執行時引數;
- 再比如說使用
thread
命令檢視當前執行緒資訊,檢視執行緒的堆疊,可以找出當前最佔CPU的執行緒;
- 當然Arthas的功能非常強大,遠不止這些,支援動態修改日誌和熱更新等,具體可以參考Arthas使用教程 。
IDEA外掛
由於Arthas的功能很強大,需要記住的命令很多,有時候實在記不住,於是有了這款IDEA外掛,該外掛主要用於幫助生成Arthas命令。
- 直接在IDEA的外掛市場搜尋
arthas
即可找到該外掛,然後點選安裝即可;
- 安裝完成後我們來聊聊如何使用,比如當我們覺得線上程式碼和預期不一致,可以使用
jad
命令反編譯下看看,直接選擇類,右鍵選擇Arthas命令然後選擇Jad反編譯;
- 此時將會直接把命令拷貝到剪下板,然後到
ArthasTunnel
右鍵貼上即可使用,比手打命令簡單多了吧!
- 如果你想觀察方法執行過程中的引數和返回值,可以使用
watch
命令,選擇需要觀察的方法右鍵選擇即可;
- 這裡觀察下Controller中的方法的執行過程;
- 我們還可單獨修改某個類的日誌級別,選中類名後右鍵選擇
logger
命令;
- 先拷貝下
logger sc
命令檢視下當前類的日誌級別為INFO
;
- 拷貝下ClassLoader的Hash值,這裡由於在Linux中
Ctrl+C
鍵有衝突,使用Ctrl+Insert
組合來拷貝;
- 接下來輸入ClassLoader的Hash值,修改下日誌級別,然後拷貝修改日誌級別的命令;
- 執行完後再檢視下日誌級別,已經被改為了
DEBUG
級別
總結
今天體驗了一把新版的Arthas,搭配ArthasTunnel和IDEA外掛使用,確實非常方便!並且它還能和SpringBoot無縫整合,確實非常給力,更多Arthas的使用可以參考Arthas使用教程 。
參考資料
- 專案官網:https://github.com/alibaba/ar...
- Arthas官方文件:https://arthas.aliyun.com/doc...
- IDEA外掛使用文件:https://www.yuque.com/arthas-...