Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践

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 使用率、线程状态等。

Arthas Tunnel Server 管理页面

三、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 的远程调试功能,并在实际工作中发挥其强大的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像预处理-添加水印

一.ROI切割 类似裁剪图片&#xff0c;但是原理是基于Numpy数组的切片操作(ROI数组切片是会修改原图数据的)&#xff0c;也就是说这个“裁剪”不是为了保存“裁剪”部分&#xff0c;而是为了方便修改等处理。 import cv2 as cv import numpy as npimg cv.imread(../images/dem…

数据结构——八大排序算法

排序在生活中应用很多&#xff0c;对数据排序有按成绩&#xff0c;商品价格&#xff0c;评论数量等标准来排序。 数据结构中有八大排序&#xff0c;插入、选择、快速、归并四类排序。 目录 插入排序 直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 hoare…

吃透LangChain(五):多模态输入与自定义输出

多模态数据输入 这里我们演示如何将多模态输入直接传递给模型。我们目前期望所有输入都以与OpenAl 期望的格式相同的格式传递。对于支持多模态输入的其他模型提供者&#xff0c;我们在类中添加了逻辑以转换为预期格式。 在这个例子中&#xff0c;我们将要求模型描述一幅图像。 …

【Rust 精进之路之第10篇-借用·规则】引用 (``, `mut`):安全、高效地访问数据

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:所有权的“限制”与“变通”之道 在上一篇【所有权核心】中,我们揭示了 Rust 如何通过所有权规则和移动 (Move) 语义来保证内存安全,避免了垃圾回收器的同时,也防止了诸…

剑指Offer(数据结构与算法面试题精讲)C++版——day16

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day16 题目一&#xff1a;序列化和反序列化二叉树题目二&#xff1a;从根节点到叶节点的路径数字之和题目三&#xff1a;向下的路径节点值之和附录&#xff1a;源码gitee仓库 题目一&#xff1a;序列化和反序…

OpenCV 模板与多个对象匹配方法详解(继OpenCV 模板匹配方法详解)

文章目录 前言1.导入库2.图片预处理3.输出模板图片的宽和高4.模板匹配5.获取匹配结果中所有符合阈值的点的坐标5.1 threshold 0.9&#xff1a;5.2 loc np.where(res > threshold)&#xff1a; 6.遍历所有匹配点6.1 loc 的结构回顾6.2 loc[::-1] 的作用6.2.1 为什么需要反转…

产品经理学习过程

一&#xff1a;扫盲篇&#xff08;初始产品经理&#xff09; 阶段1&#xff1a;了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二&#xff1a;准备篇 阶段2&#xff1a;工…

【消息队列RocketMQ】一、RocketMQ入门核心概念与架构解析

在当今互联网技术飞速发展的时代&#xff0c;分布式系统的架构设计愈发复杂。消息队列作为分布式系统中重要的组件&#xff0c;在解耦应用、异步处理、削峰填谷等方面发挥着关键作用。RocketMQ 作为一款高性能、高可靠的分布式消息中间件&#xff0c;被广泛应用于各类互联网场景…

从“链主”到“全链”:供应链数字化转型的底层逻辑

1. 制造业与供应链数字化转型的必然性 1.1. 核心概念与战略重要性 制造业的数字化转型&#xff0c;是利用新一代数字技术&#xff08;如工业互联网、人工智能、大数据、云计算、边缘计算等&#xff09;对制造业的整体价值链进行根本性重塑的过程。这不仅涉及技术的应用&#…

x-ui重新申请ssl证书失败

由于某些需要我们重新申请ssl证书&#xff0c;x-ui自动化脚本不能强制更新&#xff0c;根据x-ui仓库源码&#xff1a; https://github.com/vaxilu/x-ui/blob/main/x-ui.sh 在申请ssl证书的地方稍作修改&#xff0c;得到&#xff0c;运行下面的脚本就可以重新申请ssl证书&#…

Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接

什么是Java NIO&#xff1f; Java NIO&#xff08;New Input/Output&#xff09; 是Java 1.4&#xff08;2002年&#xff09;引入的一种非阻塞、面向缓冲区的输入输出框架&#xff0c;旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO&#xff08;java…

go环境安装mac

下载go安装包&#xff1a;https://golang.google.cn/dl/ 找到对应自己环境的版本下载。 注意有二进制的包&#xff0c;也有图形界面安装的包。图形界面直接傻瓜式点就行了。 二进制的按照下面操作&#xff1a; 1、下载二进制包。 2、将下载的二进制包解压至 /usr/local目录…

LVGL源码(9):学会控件的使用(自定义弹窗)

LVGL版本&#xff1a;8.3 LVGL的控件各式各样&#xff0c;每种控件都有自己的一些特性&#xff0c;当我们想要使用一个LVGL控件时&#xff0c;我们首先可以通过官网去了解控件的一些基本特性&#xff0c;官网链接如下&#xff1a; LVGL Basics — LVGL documentation&#xf…

《软件设计师》复习笔记(1)——考试介绍【新】

目录 一、考试介绍 证书价值 考试要求 二、【新】计算机与软件工程知识 三、软件设计 一、考试介绍 >考试科目>考题形式>考试时长>合格标准计算机与软件工程知识75道单选题&#xff08;每题1分&#xff0c;总分75分&#xff09;2023年11月改革机试后&#…

MCU中的BSS和data都占用SRAM空间吗?

在MCU中&#xff0c;BSS段和data段都占用SRAM空间&#xff0c;但它们的存储方式和用途有所不同。‌ BSS段 BSS段&#xff08;Block Started by Symbol&#xff09;用于存储未初始化的全局变量和静态变量。这些变量在程序启动时会被清零&#xff0c;因此它们不占用Flash空间&a…

Ubuntu 22.04 更换 Nvidia 显卡后启动无法进入桌面问题的解决

原显卡为 R7 240, 更换为 3060Ti 后, 开机进桌面时卡在了黑屏界面, 键盘有反应, 但是无法进入 shell. 解决方案为 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 启动后在开机菜单中(如果没有开机菜单, 需要按shift键), 进入recove…

Python爬虫-爬取猫眼演出数据

前言 本文是该专栏的第53篇,后面会持续分享python爬虫干货知识,记得关注。 猫眼平台除了有影院信息之外,它还涵盖了演出信息,比如说“演唱会,音乐节,话剧音乐剧,脱口秀,音乐会,戏曲艺术,相声”等等各种演出相关信息。 而本文,笔者将以猫眼平台为例,基于Python爬虫…

人工智能-机器学习(线性回归,逻辑回归,聚类)

人工智能概述 人工智能分为:符号学习&#xff0c;机器学习。 机器学习是实现人工智能的一种方法&#xff0c;深度学习是实现机器学习的一种技术。 机器学习&#xff1a;使用算法来解析数据&#xff0c;从中学习&#xff0c;然后对真实世界中是事务进行决策和预测。如垃圾邮件检…

FPGA学习(五)——DDS信号发生器设计

FPGA学习(五)——DDS信号发生器设计 目录 FPGA学习(五)——DDS信号发生器设计一、FPGA开发中常用IP核——ROM/RAM/FIFO1、ROM简介2、ROM文件的设置&#xff08;1&#xff09;直接编辑法&#xff08;2&#xff09;用C语言等软件生成初始化文件 3、ROM IP核配置调用 二、DDS信号发…

【Vue】从 MVC 到 MVVM:前端架构演变与 Vue 的实践之路

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–架构模式的演变背景​三–MVC&#xff1a;经典的分层起点​四–MVP&#xff1a;面向接口的解耦尝试​五–MVVM&#xff1a;数据驱动的终极形态​​六–Vue&#xff1a;MVVM 的现代化实践​​​ 二. 架构模…