用它调试线上 bug,真得劲

2023-10-31

webconsole

webconsole 是 arthas 提供的 web 页面,它可以让用户在自己的电脑上,连接远程服务器的 arthas 执行命令,命令的执行方式和在服务器直接操作没有任何区别

webconsole 连接远程服务器成功后是这样的,是不是和服务器的界面一样

图片

因为需要访问远程服务器,所以要在远程服务器上对本地网络开放 ip 和端口策略,否则无法使用 webconsole

在远程服务器上启动 arthas,启动时要指定 ip 和端口

java -jar arthas-boot.jar --target-ip 119.196.154.133 --http-port 8563 31178

图片

java -jar arthas.jar:启动命令 
--target-ip:指定 webconsole 连接的 ip,也就是服务器的外网ip 
--http-port:指定 webconsole 连接的端口,也就是服务器对外暴露的端口 
31178:要监听的 java 程序的进程 id

远程服务器上 arthas 启动成功后,打开本地浏览器,在地址栏输入对应的 ip 和端口即可打开 webconsole 页面

第一次打开 webconsole 页面,默认会连接本机的 arthas,也就是 127.0.0.1:3658。需要改成远程服务器的 ip 和端口,然后点击 Connect 按钮,就可以连接到远程的 arthas 服务

其实,如果远程服务器开放了 ip 和端口策略,也可以在本地使用 telnet 命令进行远程连接,不需要使用浏览器

使用 telnet 连接,远程服务器启动 arthas 时需要使用 --telnet-port 参数指定端口

java -jar arthas-boot.jar --target-ip 119.196.154.133 --telnet-port 3658 31178

当然,也可以同时指定 telnet 端口和 http 端口,这样本机既可以通过 telnet 连接也可以通过 webconsole 连接。

java -jar arthas-boot.jar --target-ip 119.196.154.133 --http-port 8563 --telnet-port 3658 31178

webconsole 默认使用 8563 端口,--http-port 参数可以修改 webconsole 端口

telnet 默认使用 3658 端口,--telnet-port 可以修改 telnet 端口

注意:

webconsole 需要服务器暴露 ip 和端口,如果服务器是云端部署,需要考虑网络安全的问题,比如端口只开放给某一个来源 ip

使用 arthas tunnel servel 连接远程 arthas

除了直接使用浏览器连接 arthas 进行 webconsole 外,还有一种方式可以进行 webconsole,那就是 tunnel servel

tunnel servel 最大的优点在于支持分布式部署,它承担注册中心的功能,可以同时支持多个远程服务器的 arthas 注册到 tunnel-server,用户浏览器登录上 tunnel server 后,可以选择对 某一个arthas 进行监听

tunnel server 访问的原理如下

图片

# 说明: 
1.远程服务器的 arthas 会向 tunnel-server 注册服务,注册成功后每个 arthas 会得到一个 agentid 
2.浏览器访问 tunnel-server 服务,选择 aegnt-id 后通过 tunnel-server 代理到对应的 arthas 服务

下面介绍 tunnel-server 服务的搭建。首先,需要下载 arthas-tunnel-server.jar,可以直接去 github 下载

# github下载地址 
https://github.com/alibaba/arthas/releases

将 arthas-tunnel-server.jar 上传到服务器,该服务器需要和 arthas 所在的服务器集群网络互通。

arthas-tunnel-server.jar 是一个 spring-boot 项目,可以通过 java -jar 启动,启动成功后如下图

java -jar arthas-tunnel-server-3.4.1.jar

图片

arthas-tunnel-server 默认使用 8080 和 7777 两个端口,如果启动报错端口被占用,可以对这两个端口进行修改

8080 是服务的 web 端口,浏览器通过该端口连接 tunnel-server 服务,启动时通过-Dserver.port 参数修改

// 将默认的8080端口修改为8081 
java -jar -Dserver.port=8081 arthas-tunnel-server-3.4.1.jar

7777 是注册端口,远程服务器的 arthas 通过该端口注册到 tunnel-server。使用压缩工具打开arthas-tunnel-server.jar包,在application.properties配置文件中可以修改该端口

tunnel-server 启动成功后,打开本地浏览器输入 tunnel-server 的 ip 和端口进行连接,连接成功后如下图

图片

此时,需要输入 AgentId 才能对远程 arthas 进行监控。每个 arthas 注册到 tunnel-server 成功后,会生成一个 AgentId,所以要拿到 AgentId 需要先启动 arthas 服务

在远程服务器上启动 arthas,并注册到 tunnel-server,使用 --tunnel-server 参数指定注册的地址

java -jar arthas-boot.jar --tunnel-server 'ws://119.196.154.132:7777/ws'

arthas 启动成功后日志中最后一行的 id 就是我们需要的 AgentId

图片

回到浏览器输入 AgentId,就可以连接远程 arthas 服务愉快的进行调试了

图片

AgentId 是随机生成的,每次启动时都不相同,所以在浏览器中输入的时候需要到服务器上查看日志,比较麻烦。使用 --agent-id 参数可以指定 AgentId,建议把 arthas 所在服务器的 ip 作为 AgentId 来使用,方便记忆

java -jar arthas-boot.jar --tunnel-server 'ws://119.196.154.132:7777/ws' --agent-id 119.196.154.133
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用它调试线上 bug,真得劲 的相关文章

  • 来源和出口有什么区别?

    我正在编写一个 shell 脚本 以读取具有 key value 对的文件并将这些变量设置为环境变量 但我有疑问 如果我这样做source file txt是否会将该文件中定义的变量设置为环境变量 或者我应该逐行读取文件并使用导出命令设置它
  • Spring Rest-API - 403 禁止错误响应

    我是 Spring 新手 我正在编写 REST API 我收到 403 删除 放置禁止错误 以下是我正在处理的示例 RequestMapping value noteId method RequestMethod PUT public Re
  • 为什么 DragHandler exportAsDrag 禁用我的 MouseMotionListener?

    我想实现一个简单的 JComponent 拖放 并带有 O Reilly Swing Hacks 的预览 我的问题是 如果 TransferHandler 启动 Drag MouseMotionListener 停止执行 mouseDrag
  • 在 scp 的简单函数包装中使用波形符 ~ 时出现问题

    我想放置一个简单的bash功能在我的 bashrc围绕着scp通过接受 源 参数和 目标 参数来命令 到目前为止已经尝试过 function send eval scp 1 user annoyingly long server name
  • 为 OpenWrt 编写和编译程序

    我有一个在 OpenWRT 下运行的具有 MIPS 架构的嵌入式设备 系统类型 MediaTek MT7628AN ver 1 eco 2机器 WRTnode2P 处理器 0CPU型号 MIPS 24KEc V5 5 我想通过我的电脑 ub
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • splitByWholeSeparatorPreserveAllTokens 和 split 之间的区别

    有什么区别StringUtils splitByWholeSeparatorPreserveAllTokens and String split With splitByWholeSeparatorPreserveAllTokens 我们可
  • 跨 CPU 内核的 rdtsc 精度

    我从一个线程发送网络数据包 并在运行于不同 CPU 核心上的第二个线程上接收回复 我的流程测量每个数据包发送和接收之间的时间 类似于 ping 我使用 rdtsc 来获得高分辨率 低开销的计时 这是我的实现所需要的 所有测量结果看起来都很可
  • 如何使用 JAVA 和 ADB 命令检查 Appium 中键盘是否打开

    我正在尝试检查 Android 默认键盘是否打开 我没有找到任何可以在 Appium 中使用 JAVA 和 ADB 命令检查键盘的内容 我发现这个 ADB 命令可以检查键盘是否打开 adb shell dumpsys input metho
  • Java中通过FTP创建文件夹层次结构

    Java 是否有现成的功能可以在远程 FTP 服务器上创建文件夹层次结构 Apache Commons 确实提供了 FTP 客户端 但我找不到创建目录层次结构的方法 它确实允许创建单个目录 makeDirectory 但创建整个路径似乎并不
  • Restful WS 中的 WSDL 等价物是什么?如果没有,消费者如何生成所需的客户端类?

    比如说 我在java中有生产者 在 net中有消费者 生产者有一个方法 需要 员工作为方法参数并在数据库中创建员工 对于基于 SOAP 的 ws dot net 客户端将调用 WSDL 并创建存根 包括 dot net 中的员工数据表示 现
  • 在Java中使用==而不是equals来比较不可变对象可以吗

    考虑调用静态工厂方法 valueOf 的两个 Integer 类型的引用 如下所示 Integer a Integer valueOf 10 Integer b Integer valueOf 10 考虑到Integer是不可变的 使用 而
  • 这个finally子句包含close()调用的原因是什么

    我正在学习在线java课程 使用 Java 编程简介 http math hws edu javanotes index html 在 I O 章节中 引入了以下代码 顺便说一下 在本程序的末尾 您将发现我们第一个有用的 try 语句中的
  • 如何强制初始化 Hibernate JPA 代理以在 JSON 调用中使用它

    我有一个 Spring 3 JPA 2 0 应用程序 在我的 Controller我需要一个初始化的对象 但我有代理 我需要能够以编程方式初始化它 我需要类似的功能org hibernate Hibernate initialize Obj
  • 我们可以用java定制一个垃圾收集器吗?

    我们知道java的垃圾收集器是一个低优先级线程 在java中我们可以创建任何具有高优先级的线程 那么是否有可能拥有我们自己定制的具有可变优先级的垃圾收集器线程 我们可以根据内存管理的级别进行设置 有人尝试过吗 如果是的话 您能分享一些关于如
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • 如何检测java控制台中而不是GUI中的箭头键? [复制]

    这个问题在这里已经有答案了 我正在编写一个应用程序 我需要检测其中的箭头键 C 有getch 函数 我们想要获取输入 然后添加对 ASCII 值的检查 我们如何检测输入箭头键 谢谢 我写了一个Java类原始控制台输入 http www so
  • JTable中动态加载大量数据

    这是我的问题 我目前有一个 JTable 其中包含 5 000 到超过 200 000 行 你知道我要说什么了 数据已经加载到内存中了 这不是问题 但是如何 我可以创建一个高效的 JTable 以便它只加载以下行 是可见的 并且任何事件仅作
  • JBoss 5 截断 base64 cookie 字符串的尾部 =

    从 JBoss 4 升级到 JBoss 5 后 我注意到最烦人的回归 它截断 base64 cookie 值的尾部等号 我花了很长时间才明白问题不是我的代码而是 JBoss 的 我用 google 搜索了一下 发现这是一个已知的问题issu
  • 错误:运算符不存在:整数 = 字符变化,使用 Postgres 8.2

    我有一个用旧版本的 Eclipse Ganymede 如果我没记错的话 开发的 Java EE Web 应用程序 我最近迁移到 Kubuntu 12 04 LTS 并将应用程序迁移到 Eclipse Kepler 我从 Eclipse 网站

随机推荐

  • Linux centos搭建web服务器

    文章目录 前言 1 本地搭建web站点 2 测试局域网访问 3 公开本地web网站 3 1 安装cpolar内网穿透 3 2 创建http隧道 指向本地80端口 3 3 配置后台服务 4 配置固定二级子域名 5 测试使用固定二级子域名访问本
  • Linux配置都对ping静态地址ping不通解决方案(亲测搞了很久)

    CentOS7配置静态网络ping www baidu com或114 114 114 114 失败 首先root用户下vim etc sysconfig network scripts ifcfg ens33 esc wq 保存退出 se
  • 立体仓库货架设计

    目 录 摘要 3 Abstract 4 1 绪论 5 2 AS RS仓库主要参数确定 12 2 1单元货格尺寸的确定
  • u盘中病毒解决方法 (文件夹变成exe文件)

    上机课的电脑机子有毒 u盘刚插上去 就中病毒了 文件夹都变成exe文件了 上课就只顾杀毒 救我的u盘了 下面是我的杀毒 挽救u盘里的文件的具体步骤 亲测好用有效 1 下个 火绒 安全软件 链接 https www huorong cn 然后
  • 如何用css画出三角形

  • c++将数字转换为字符串

    include
  • C语言——计算阶层求和

    利用两次for循环进行求和 include
  • 中国跨境电商品牌营销白皮书

    导读 报告显示 近年来 中国品牌在走向国际市场的过程中面临着诸多挑战 跨文化 和 品牌形象接受度低 成为中国品牌在海外营销中的主要问题 由于国内外文化存在差异 中国品牌在营销方面遇到了困难 许多品牌往往照搬国内的广告模式 无法吸引国外消费者
  • SVG主要的画图元素以及几个基本的几何图形介绍

    本文主要介绍SVG画图中的两种主要画图元素 Path和Text 以及SVG的几个基本的几何形状 如线条 折线 多边形 椭圆 矩形 圆等等 本文主要采取理论 例子的方式来介绍 这种方式向来都是解释介绍的王道 同时也是学习的一种好方法 第一 首
  • 413 Request Entity Too Large

    一 字面意思是请求体太大 一般出现在上传文件 二 主要问题 Nginx默认最大能够上传1MB文件 大于1MB的文件自然无法上传 打开nginx conf 没权限找运维人员 在http 中设置 client max body size 50m
  • empire-web可视化

    首先说明我的安装系统为kali 教程同样适用于ubantu系统 1 首先安装Empire 没有安装的可以去先参考其他教程安装 2 下载empire web git clone https github com interference se
  • 【Python 笔记】Linux下安装pip方法的全总结

    本文研究记录了 Linux 下安装 pip 的全部方法 文章目录 1 通过 Linux 系统的包管理工具安装 1 1 apt 包管理工具安装 pip 1 1 1 安装 1 1 2 升级 1 1 3 issue5599 1 2 yum 包管理
  • 矩阵分解——谱分解

    文章目录 先修知识 幂等矩阵 谱分解定理 谱分解的流程 谱分解的推论 谱分解的应用 先修知识 幂等矩阵 谱分解定理 谱分解的流程 谱分解的推论 谱分解的应用
  • 浅析Bootstrap中Tab(标签页)的使用方法

    Bootstrap 导航元素使用相同的标记和基类 改变修饰的class 可以在不同的样式间进行切换 如 nav pills 胶囊式导航 与 nav tabs 标签式导航 创建一个标签式的导航菜单 以一个带有class nav 的无序列表开始
  • xxl-job任务操作源码分析(四)

    手动执行任务 页面上点击 执行 按钮 前端会发送一个请求 jobinfo trigger post 请求 param id 任务ID controller最终会调用service的方法进行处理 public ReturnT
  • 浅谈sql中的in与not in,exists与not exists的区别

    1 in和exists in是把外表和内表作hash连接 而exists是对外表作loop循环 每次loop循环再对内表进行查询 一直以来认为exists比in效率高的说法是不准确的 如果查询的两个表大小相当 那么用in和exists差别不
  • js遍历字典

    for var key in data html
  • eclipse使用pthread.h遇到“pthread_create”未定义的问题。

    解决方法 a 需要在编译时添加 lpthread参数 g XXXXX cpp lpthread o XXXXX o b 在eclipse中配置 project gt properties gt c c Build gt GCC C Link
  • 并行前缀加法器 verilog

    并行前缀加法器verilog实现 关于并行前缀加法器的介绍 请看这里 前缀网络用KS树 64位加法器的verilog实现如下 module cal union input g2 p2 g1 p1 output G P assign G g2
  • 用它调试线上 bug,真得劲

    webconsole webconsole 是 arthas 提供的 web 页面 它可以让用户在自己的电脑上 连接远程服务器的 arthas 执行命令 命令的执行方式和在服务器直接操作没有任何区别 webconsole 连接远程服务器成功