Spring Boot系列之使用Arthas Tunnel Server 進行遠程調試實踐
前言
在開發和運維 Java 應用的過程中,遠程診斷和調試是一個不可或缺的需求。尤其是當生產環境出現問題時,能夠快速定位并解決這些問題至關重要。Arthas 是阿里巴巴開源的一款強大的 Java 診斷工具,它可以在不修改代碼、不重啟應用的情況下,實時診斷和分析 Java 應用的運行狀態。而 Arthas Tunnel Server 則為遠程連接提供了支持,使得我們可以通過 Web 管理頁面遠程連接到目標應用的 Arthas Agent,進行實時診斷。本文將詳細介紹如何通過 Arthas Tunnel Server 實現 Spring Boot 應用的遠程診斷,并提供詳細的操作步驟和使用示例。
一、環境準備
1.1 工具與版本
- JDK:1.8 或更高版本
- Spring Boot:2.3.0 或更高版本
- Arthas Tunnel Server:4.0.5 版本
- 操作系統:Linux 或 Windows(推薦使用 Linux)
1.2 下載 Arthas Tunnel Server
從 GitHub Releases 下載 arthas-tunnel-server-4.0.5-fatjar.jar
,并將其放置在服務器的指定目錄(如 /home/arthas
)。
二、啟動 Arthas Tunnel Server
2.1 配置啟動參數
在啟動 Arthas Tunnel Server 時,可以通過命令行參數配置服務的端口和管理頁面的訪問權限。以下是推薦的啟動命令:
java -jar arthas-tunnel-server-4.0.5-fatjar.jar \--server.port=8080 \ # Web 管理頁面的端口--arthas.server.port=7777 \ # 與 Arthas Agent 通信的端口--arthas.enable-detail-pages=true # 啟用管理頁面
--server.port
:Web 管理頁面的端口,默認為 8080。--arthas.server.port
:與 Arthas Agent 通信的端口,默認為 7777。--arthas.enable-detail-pages
:是否啟用管理頁面,默認為false
。
如果要后臺啟動并保存一下運行日志:
nohup java -jar arthas-tunnel-server-4.0.5-fatjar.jar --arthas.enable-detail-pages=true --server.port=8080 --arthas.server.port=7777 > /opt/logs/arthas.log 2>&1 &
2.2 訪問管理頁面
啟動后,訪問 http://<服務器IP>:8080/
,即可查看已連接的 Arthas Agent 列表。管理頁面提供了以下功能:
- Agent 列表:顯示所有已連接的 Arthas Agent,包括 Agent ID、連接狀態、連接時間等信息。
- 連接操作:可以對每個 Agent 進行連接、斷開連接等操作。
- 實時監控:查看 Agent 的實時監控數據,如 CPU 使用率、線程狀態等。
三、Spring Boot 應用集成 Arthas
3.1 添加 Arthas 依賴
在 Spring Boot 項目的 pom.xml
文件中添加 Arthas 的 Spring Boot Starter:
<dependency><groupId>com.taobao.arthas</groupId><artifactId>arthas-spring-boot-starter</artifactId><version>4.0.5</version>
</dependency>
3.2 配置 Arthas
在 application.yml
文件中配置 Arthas 的隧道服務器地址:
arthas:telnetPort: -1httpPort: -1ip: 127.0.0.1appName: arthas_testagent-id: your_agent_id # 唯一標識,用于區分不同的 Agenttunnel-server: ws://<tunnel-server-ip>:7777/ws # Tunnel Server 的 WebSocket 地址
telnetPort
:telnetPort為 -1 ,則不listen telnet端口,為 0 ,則隨機telnet端口httpPort
:httpPort為 -1 ,則不listen telnet端口,為 0 ,則隨機telnet端口ip
:127.0.0.1,本地訪問,0.0.0.0,網絡訪問appName
:應用名稱agent-id
:唯一標識,用于區分不同的 Agent,可以自定義。默認情況下,會生成隨機ID,如果 arthas agent配置了 appName,則生成的agentId會帶上appName的前綴。tunnel-server
:Tunnel Server 的 WebSocket 地址,格式為ws://<tunnel-server-ip>:<tunnel-server-port>/ws
。
3.3 啟動 Spring Boot 應用
啟動應用后,Arthas Agent 會自動連接到指定的 Tunnel Server。如果連接成功,你可以在 Tunnel Server 的管理頁面中看到該 Agent 的信息。
四、遠程診斷示例
4.1 登錄管理頁面
在瀏覽器中訪問 http://<服務器IP>:8080/
,查看已連接的 Arthas Agent。
如果要查看actuator,訪問http://127.0.0.1:8080/actuator/arthas,賬號名是arthas,密碼需要在啟動日志里找,返回:
{"clientConnections":{"VDYNUIRO0A7Q1QQCKZE7":{"host":"192.168.61.109","port":64113}},"version":"4.0.5","properties":{"server":{"host":"0.0.0.0","port":7777,"ssl":false,"path":"/ws","clientConnectHost":"192.168.62.78"},"embeddedRedis":null,"enableDetailPages":true,"enableIframeSupport":true},"agents":{"e9a2d4f3b8c7":{"host":"192.168.61.109","port":64020,"arthasVersion":"3.6.7"}}}
4.2 連接到目標 Agent
選擇需要診斷的 Agent,點擊“連接”按鈕,即可進入 Arthas 的命令行界面。在命令行界面中,你可以執行各種 Arthas 命令來診斷應用。
4.3 執行診斷命令
以下是一些常用的 Arthas 命令示例:
4.3.1 查看線程狀態
thread
該命令可以查看當前應用的所有線程狀態,包括線程 ID、線程名稱、線程狀態(如 RUNNABLE、WAITING 等)、CPU 使用率等信息。通過該命令,你可以快速定位到占用 CPU 過高的線程,或者處于等待狀態的線程。
4.3.2 查看方法執行情況
trace com.example.demo.controller.HelloController sayHello
該命令可以跟蹤指定方法的執行情況,包括方法的調用次數、執行時間、參數值、返回值等信息。通過該命令,你可以分析方法的性能瓶頸,或者查看方法的調用鏈路。
4.3.3 查看類加載信息
sc com.example.demo.model.User
該命令可以查看指定類的加載信息,包括類加載器、類的路徑、類的加載狀態等信息。通過該命令,你可以排查類加載問題,或者查看類的加載路徑。
五、常見問題與解決方法
5.1 無法連接到 Tunnel Server
- 原因:網絡連接問題或防火墻限制。
- 解決方法:檢查網絡連通性,確保 Tunnel Server 的端口未被防火墻阻止。可以使用
telnet <tunnel-server-ip> <tunnel-server-port>
命令測試網絡連通性。
5.2 管理頁面無法訪問
- 原因:未啟用
--arthas.enable-detail-pages
參數或端口被占用。 - 解決方法:確保啟動命令中包含
--arthas.enable-detail-pages=true
,并檢查端口是否被占用。可以使用netstat -an | grep <port>
命令查看端口占用情況。
5.3 Agent 無法注冊到 Tunnel Server
- 原因:配置的
tunnel-server
地址與實際運行的 Tunnel Server 不匹配。 - 解決方法:確保
application.yml
中的tunnel-server
地址和端口正確。可以使用ping <tunnel-server-ip>
命令測試網絡連通性。
六、總結
通過 Arthas Tunnel Server,我們可以輕松實現 Spring Boot 應用的遠程診斷和調試。這種方案在生產環境中非常實用,特別是在需要快速定位和解決問題時。希望本文能幫助你快速上手 Arthas 的遠程調試功能,并在實際工作中發揮其強大的作用。