SpringBoot Arthas實(shí)現(xiàn)線上監(jiān)控診斷
Arthas 是一款線上監(jiān)控診斷產(chǎn)品,通過全局視角實(shí)時(shí)查看應(yīng)用 load、內(nèi)存、gc、線程的狀態(tài)信息,并能在不修改應(yīng)用代碼的情況下,對(duì)業(yè)務(wù)問題進(jìn)行診斷,包括查看方法調(diào)用的出入?yún)ⅰ惓?,監(jiān)測方法執(zhí)行耗時(shí),類加載信息等,大大提升線上問題排查效率。
一、Spring Boot 集成 Arthas
通過官方的工具 Arthas Spring Boot Starter 集成到 Spring Boot 項(xiàng)目中,可以非常方便的使用 Arthas。
在我們自己的項(xiàng)目中引入 Arthas 的 starter,在啟動(dòng) Spring Boot 自身應(yīng)用的同時(shí),Spring 會(huì)啟動(dòng) Arthas,并且 attach 自身進(jìn)程。
最后通過暴露 Arhtas 終端的端口的方式,方便用戶進(jìn)入到 Arthas 的終端進(jìn)行調(diào)試。 集成后用戶不再需要去 Arthas 的官網(wǎng)下載 Arthas 的安裝包,也不需將 Arthas 的安裝包拷貝到應(yīng)用容器中。
1、項(xiàng)目集成
1、配置 maven 依賴
<!-- Arthas Spring Boot Starter -->
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>4.1.3</version>
</dependency>2、配置屬性
arthas: # Telnet 連接端口,用于通過 Telnet 客戶端連接 Arthas telnet-port:3658 # HTTP 服務(wù)端口,用于通過瀏覽器訪問 Arthas Web Console http-port:8563
- telnet-port: 暴露這個(gè)端口是為了支持用戶通過 telnet 的方式進(jìn)入 arhtas 的終端進(jìn)行遠(yuǎn)程調(diào)試。
- http-port: 暴露這個(gè)端口是為了支持用戶通過瀏覽器的方式進(jìn)入 arhtas 的終端進(jìn)行遠(yuǎn)程調(diào)試。
2、使用 Arhtas
經(jīng)過上述的配置,Spring Boot 項(xiàng)目啟動(dòng)時(shí),會(huì)自動(dòng)啟動(dòng) Arthas,并 attach 自身進(jìn)程。啟動(dòng)項(xiàng)目控制臺(tái)日志如下:
c.a.arthas.spring.ArthasConfiguration : Arthas agent start success.
1、通過 telnet 進(jìn)入 arhtas 終端
接下來通過 telnet 命令,可以進(jìn)入 Arthas 的終端進(jìn)行遠(yuǎn)程調(diào)試。使用配置文件配置的 telnet-port: 3658 端口。如下所示:
telnet localhost 3658

接下來就可以在 arthas 終端執(zhí)行各種 arthas 指令調(diào)試代碼,詳細(xì)使用方法可以參考 Arthas 文檔。如 dashboard :

整個(gè)過程操作下來不需要像原始的從官網(wǎng)下載 arhtas 安裝包,然后執(zhí)行 java -java arthas-boot.jar 的指令進(jìn)入到 arhtas 終端。
通過集成到自有項(xiàng)目中直接一個(gè) telnet 指令就可以直接進(jìn)入到終端,比之前的方式簡單多了。
2、通過瀏覽器進(jìn)入 arhtas 終端
接下來通過瀏覽器,可以進(jìn)入 Arthas 的 Web Console。使用配置文件配置的 http-port: 8563 端口。如下所示:

3、遠(yuǎn)程使用 Arthas
在生產(chǎn)環(huán)境中,自有 Spring Boot 項(xiàng)目部署在服務(wù)器上,然后再使用 arthas 進(jìn)行遠(yuǎn)程調(diào)試,要額外開啟訪問配置,注意會(huì)有安全風(fēng)險(xiǎn)。
arthas: # Telnet 連接端口,用于通過 Telnet 客戶端連接 Arthas telnet-port:3658 # HTTP 服務(wù)端口,用于通過瀏覽器訪問 Arthas Web Console http-port:8563 # 127.0.0.1 只能本地訪問,0.0.0.0 則可網(wǎng)絡(luò)訪問,但是存在安全問題,需謹(jǐn)慎使用。 ip:0.0.0.0
二、Arthas Tunnel 增強(qiáng)
現(xiàn)如今項(xiàng)目在采用微服務(wù)架構(gòu)時(shí),會(huì)有無數(shù)個(gè) Spring Boot 應(yīng)用,每個(gè)應(yīng)用都有一個(gè) Arthas 客戶端,這樣會(huì)使得 Arthas 操作變得些許麻煩。
我們需要實(shí)時(shí)維護(hù)所有服務(wù)節(jié)點(diǎn)的地址,當(dāng)需要遠(yuǎn)程調(diào)試某個(gè)節(jié)點(diǎn)時(shí),首先需要找到對(duì)應(yīng)節(jié)點(diǎn)的 ip 地址,再通過瀏覽器去訪問該節(jié)點(diǎn)的調(diào)試頁面進(jìn)行調(diào)試。
當(dāng)服務(wù)節(jié)點(diǎn)數(shù)量變多時(shí),這個(gè)過程會(huì)非常麻煩,因此,Arthas 引入了 Arthas Tunnel,Arthas Tunnel 是一個(gè)服務(wù)端。 Arthas Tunnel有點(diǎn)類似于“注冊中心”管理所有的 Arthas 客戶端。
如在流式計(jì)算里,Java 進(jìn)程可以是在不同的機(jī)器啟動(dòng)的,想要使用 Arthas 去診斷會(huì)比較麻煩,因?yàn)橛脩敉ǔ]有機(jī)器的權(quán)限,即使登錄機(jī)器也分不清是哪個(gè)Java 進(jìn)程。
在這種情況下,可以使用 Arthas Tunnel Server/Client。通過 Arthas Tunnel Server/Client 來遠(yuǎn)程管理/連接多個(gè) Agent。
1、Arthas Tunnel Server
首先需要到 GitHub 下載 Arthas Tunnel Server 并啟動(dòng)。 https://github.com/alibaba/arthas/releases
注意點(diǎn)是下載的版本最好和 arthas-spring-boot-starter 這兩個(gè)版本最好保持一致,減少不必要的兼容問題。
執(zhí)行 java -jar -Darthas.enable-detail-pages=true arthas-tunnel-server-4.1.3-fatjar.jar 即可啟動(dòng) arthas-tunnel-server。
參數(shù) Darthas.enable-detail-pages=true 是開啟 Tunnel Server 的管理頁面。如果不配置,是無法通過頁面看到所有的 arthas 客戶端的。
注意:開放管理頁面有風(fēng)險(xiǎn)!管理頁面沒有安全攔截功能,務(wù)必自行增加安全措施,不要開放到公網(wǎng)。
可以通過 http://127.0.0.1:8080/actuator/arthas 查看到具體的連接信息,登錄用戶名是 arthas,密碼在 Tunnel Server的日志里可以找到,比如:
2025-12-26 11:34:40.524 WARN 3740 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: a0ab4417-6c43-4c21-a19a-9888c2d123e4 This generated password is for development use only. Your security configuration must be updated before running your application in production.
可以通過啟動(dòng)命令修改配置文件:
-Dserver.port修改指定 web 端口-Darthas.server.port指定注冊端口
下面的命令就是將 web 端口設(shè)置為 8081,注冊端口設(shè)置為 8888
java -jar -Dserver.port=8081 -Darthas.server.port=8888 -Darthas.enable-detail-pages=true arthas-tunnel-server-4.1.3-fatjar.jar
2、Arthas Tunnel Client
現(xiàn)在需要在自有的 Spring Boot 項(xiàng)目中配置 arthas 參數(shù),告訴 arthas 客戶端需要將自己的地址注冊到 Tunnel Server。
spring:
application:
name:springboot-11-arthas
arthas:
# Telnet 連接端口,用于通過 Telnet 客戶端連接 Arthas
telnet-port:-1
# HTTP 服務(wù)端口,用于通過瀏覽器訪問 Arthas Web Console
http-port:-1
# 127.0.0.1 只能本地訪問,0.0.0.0 則可網(wǎng)絡(luò)訪問,但是存在安全問題,需謹(jǐn)慎使用。
#ip: 0.0.0.0
# 應(yīng)用名稱,用于標(biāo)識(shí)應(yīng)用
app-name:${spring.application.name}
# 默認(rèn)情況下,會(huì)生成隨機(jī)ID,如果 arthas agent 配置了 appName,則生成的 agentId 會(huì)帶上 appName 的前綴。
# 注意,agentId 要保持唯一,否則會(huì)在 tunnel server 上沖突,不能正常工作
agent-id:${spring.application.name}_Don001
# tunnel-server 地址,Arthas 隧道服務(wù)器地址,用于連接 Arthas 隧道服務(wù)器
tunnel-server:ws://127.0.0.1:7777/ws因?yàn)椴恍枰裆鲜瞿菢油ㄟ^ arthas 客戶端的 http 端口或 telnet 端口訪問 arhtas 終端,所以將 telnet-port 和 http-port 都設(shè)置為-1,表示禁用 http 和 telnet 單獨(dú)連接 arthas 客戶端,后續(xù)統(tǒng)一使用 Arthas Tunnel Server 進(jìn)行連接并操作。
啟動(dòng)兩個(gè)應(yīng)用,可以看到 Tunnel Server 中有新的連接:
2025-12-26 11:51:23.006 INFO 3740 --- [Server-boss-1-1] io.netty.handler.logging.LoggingHandler : [id: 0x72e2f7a6, L:/0:0:0:0:0:0:0:0:7777] READ: [id: 0xee929d2a, L:/127.0.0.1:7777 - R:/127.0.0.1:51404] 2025-12-26 11:51:23.007 INFO 3740 --- [Server-boss-1-1] io.netty.handler.logging.LoggingHandler : [id: 0x72e2f7a6, L:/0:0:0:0:0:0:0:0:7777] READ COMPLETE 2025-12-26 11:51:23.098 INFO 3740 --- [rver-worker-3-2] c.a.a.t.server.TunnelSocketFrameHandler : websocket handshake complete, uri: /ws?method=agentRegister&arthasVersion=4.1.3&appName=springboot-11-arthas&id=Don 2025-12-26 11:53:09.824 INFO 3740 --- [Server-boss-1-1] io.netty.handler.logging.LoggingHandler : [id: 0x72e2f7a6, L:/0:0:0:0:0:0:0:0:7777] READ: [id: 0xcc24edb0, L:/127.0.0.1:7777 - R:/127.0.0.1:51506] 2025-12-26 11:53:09.824 INFO 3740 --- [Server-boss-1-1] io.netty.handler.logging.LoggingHandler : [id: 0x72e2f7a6, L:/0:0:0:0:0:0:0:0:7777] READ COMPLETE 2025-12-26 11:53:09.839 INFO 3740 --- [rver-worker-3-3] c.a.a.t.server.TunnelSocketFrameHandler : websocket handshake complete, uri: /ws?method=agentRegister&arthasVersion=4.1.3&appName=springboot-11-arthas&id=Don2
然后訪問管理頁面查看所有已連接的 arthas 客戶端,管理頁面地址是:服務(wù)器ip:端口號(hào)/apps.html。顯示如下圖所示:

注:如果要自定義配置 agent-id 參數(shù),則必須包含 _ 符號(hào),且同服務(wù)實(shí)例需要相同的前綴,類似自動(dòng)生成的規(guī)則。
具體見源碼 com.alibaba.arthas.tunnel.server.app.web#tunnelApps
點(diǎn)擊服務(wù) springboot-11-arthas,進(jìn)入服務(wù)的實(shí)例頁面,顯示如下圖所示:

點(diǎn)擊某一實(shí)例,進(jìn)入實(shí)例頁面,顯示如下圖所示:

3、認(rèn)證
可以在配置文件里添加 arthas.username 和 arthas.password 來設(shè)置用戶名和密碼,然后訪問管理頁面時(shí)需要輸入用戶名和密碼。
arthas:
# Telnet 連接端口,用于通過 Telnet 客戶端連接 Arthas
telnet-port:-1
# HTTP 服務(wù)端口,用于通過瀏覽器訪問 Arthas Web Console
http-port:-1
# 127.0.0.1 只能本地訪問,0.0.0.0 則可網(wǎng)絡(luò)訪問,但是存在安全問題,需謹(jǐn)慎使用。
#ip: 0.0.0.0
# 應(yīng)用名稱,用于標(biāo)識(shí)應(yīng)用
app-name:${spring.application.name}
# 默認(rèn)情況下,會(huì)生成隨機(jī)ID,如果 arthas agent 配置了 appName,則生成的 agentId 會(huì)帶上 appName 的前綴。
# 注意,agentId 要保持唯一,否則會(huì)在 tunnel server 上沖突,不能正常工作
#agent-id: Don
# tunnel-server 地址,Arthas 隧道服務(wù)器地址,用于連接 Arthas 隧道服務(wù)器
tunnel-server:ws://127.0.0.1:7777/ws
username:admin
password:admin首先需要在終端使用 auth 指令進(jìn)行認(rèn)證,認(rèn)證通過后才能執(zhí)行其他 arthas 指令, 執(zhí)行 auth -username admin admin 通過 arhtas 的認(rèn)證,然后執(zhí)行 session 指令查看當(dāng)前 session 的信息:
[arthas@15432]$ session Error! command not permitted, try to use 'auth'command to authenticates. [arthas@15432]$ auth Authentication result: false, Need authentication: true [arthas@15432]$ auth -username admin admin Authentication result: true, username: admin [arthas@15432]$ auth Authentication result: true, Need authentication: true [arthas@15432]$ session Name Value ------------------------------------------------------------- JAVA_PID 15432 SESSION_ID c7929c0c-0d30-4563-827b-1babeff98f7c AGENT_ID springboot-11-arthas_SX0SZK8T5ZJWUYPJOMOJ TUNNEL_SERVER ws://127.0.0.1:7777/ws TUNNEL_CONNECTED true [arthas@15432]$
三、總結(jié)
1、首先講述了自有的 Spring Boot 應(yīng)用集成 Arthas Spring Boot Starter 的方式,便于快速使用 Arthas 進(jìn)行調(diào)試。
2、然后借助 Arthas Tunnel Server/Client 來遠(yuǎn)程管理/連接多個(gè)服務(wù)器下的 Java 服務(wù),輕松實(shí)現(xiàn)多個(gè)服務(wù)器下的 Java 服務(wù)的遠(yuǎn)程調(diào)試。
注:Tunnel Server 開放管理頁面有風(fēng)險(xiǎn)?。?!管理頁面沒有安全攔截功能,務(wù)必自行增加安全措施,不要開放到公網(wǎng)。
到此這篇關(guān)于SpringBoot Arthas實(shí)現(xiàn)線上監(jiān)控診斷的文章就介紹到這了,更多相關(guān)SpringBoot Arthas線上監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用SpringBoot 工廠模式自動(dòng)注入到Map
這篇文章主要介紹了使用SpringBoot 工廠模式自動(dòng)注入到Map,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java Instrumentation從概念到基本用法詳解
Java Instrumentation是java.lang.instrument包提供的 API,允許開發(fā)者在類被JVM 加載時(shí)對(duì)其進(jìn)行修改,或者在運(yùn)行時(shí)重新定義類的字節(jié)碼,本文給大家介紹Java Instrumentation從概念到基本用法詳解,感興趣的朋友一起看看吧2025-09-09
java讀取文件內(nèi)容的三種方法代碼片斷分享(java文件操作)
本文介紹java讀取文件內(nèi)容的三種方法,代碼可以直接放到程序中使用,大家參考使用吧2014-01-01
從零開始使用IDEA創(chuàng)建SpringBoot項(xiàng)目(圖文)
這篇文章主要介紹了從零開始使用IDEA創(chuàng)建SpringBoot項(xiàng)目(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
Java 高并發(fā)二:多線程基礎(chǔ)詳細(xì)介紹
本文主要介紹Java 高并發(fā)多線程的知識(shí),這里整理詳細(xì)的資料來解釋線程的知識(shí),有需要的學(xué)習(xí)高并發(fā)的朋友可以參考下2016-09-09
帶你了解如何使用Spring基于ProxyFactoryBean創(chuàng)建AOP代理
這篇文章主要介紹了Spring基于ProxyFactoryBean創(chuàng)建AOP代理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-08-08
基于Java實(shí)現(xiàn)Word中插入附件的操作指南(支持所有文件格式)
文章介紹了如何使用Java在Word文檔中嵌入附件,并通過OLE方式實(shí)現(xiàn),主要步驟包括:引入依賴、組裝附件圖標(biāo)、默認(rèn)附件圖標(biāo)、組裝Ole對(duì)象、插入附件到Word文檔以及使用模板,文章末尾提供了實(shí)現(xiàn)代碼和下載OLE模板的鏈接,需要的朋友可以參考下2025-12-12

