工程师工具箱系列(3)Arthas

文章目录

    • 工程师工具箱系列(3)Arthas
      • 安装与准备
      • Arthas插件使用场景
        • 查看某个变量值
        • ognl方式调用Bean方法
        • tt(TimeTunel)方式调用Bean的方法
        • ognl调用带参数方法
      • 资源总览

工程师工具箱系列(3)Arthas

Java诊断利器

安装与准备

  • windows下推荐安装arthas,直接下载jar包
curl -O https://arthas.aliyun.com/arthas-boot.jar  //下载
java -jar arthas-boot.jar  //启动
  • linnx/mac下的推荐安装arthas,使用脚本as.sh脚本
curl -L https://arthas.aliyun.com/install.sh | sh

启动后arthas自动检测可以应用的程序:

要选择应用程序,输入对应的序号就行

dashboard命令示意:

  • 在idea中安装arthas插件:直接在应用市场中搜索arthas即可

使用的基本流程如下:

Arthas插件使用场景

启动arthas并已应用到应用程序

查看某个变量值

  • 静态变量的例子
    假设要获取下面这个static field变量值

首先选中这个变量,右键弹出菜单,然后选择Arthas Command一级菜单,再选择Ognl To Get Static Method Field二级菜单命令

成功后弹出以下窗口,点击copy sc command

获取到一个在命令行执行的命令: sc -d com.wangji92.arthas.plugin.demo.controller.StaticTest
复制到命令行下执行如下:1处是复制来要执行的命令,2处是得到的hashcode
![外在这里插入图片描述

复制hashcode到插件弹窗,填入输入框中,执行前最好先clean cache下,然后点击copy command,得到最终过的查询脚本语句:

ognl -x 3 '@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_NAME' -c 2dd83cd2

复制到命令窗口,输入后执行,得到变量当前的值

ognl方式调用Bean方法

SpringContext也是静态的,所以我们也能通过ognl命令来获取,获得了上下文容器后,可以调用Bean,基本可以为所欲为了。

获取的方式是通过:ApplicationObjectSupport#getApplicationContext

我们来尝试调动下CommonController这个Bean的getRandomInteger方法,拿到classload的hashcode后,采用下面的命令(这是ognl语法糖,不清楚也没关系,后面会介绍如何通过插件来达到同样效果):

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("commonController").getRandomInteger()' -c 2dd83cd2

看到结果输出了一个随机数453

接下来我们尝试通过插件来完成同样的效果,在这之前,我们要先要把项目的SpringContext配置下
首先代码中要有能获取SpringContext的方法

然后把这个类的路径配置到插件的 Spring static Context Ognl setting
配置内容如下:

@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context

完成后我们选择commonController#getRandomInteger方法,按照下面顺序操作

得到下面弹窗,然后根据步骤1-4分别与命令行交替执行下,如果classloader没变,那直接执行第4步即可

观察第4步获得的命令,就是之前介绍的ognl语法糖

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("commonController").getRandomInteger()' -c 2dd83cd2

再次执行,同样得到一个随机数,不过这次是240

PS:顺便说一嘴,插件提供了3种方式来调用Bean方法,先有个认知,其它方式具体的操作后续的章节再详细展开,包括带参数的如何调用

1 是通过静态的容器获取Bean进行调用(需要额外获取springContext的实现类比如:
ApplicationContextProvider)

2 是通过Watch方式进行调用(不需要额外实现类,单需要额外触发)

3 是通过tt的方式进行调用(不需要额外实现类,需要额外触发)

tt(TimeTunel)方式调用Bean的方法

同样是选中你要执行的方法,然后在菜单中选择tt方式,弹窗中非常明显的给出了执行的步骤

1 先copy command在后台执行

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod -n 5

2 通过浏览器或Postman工具随便调用个接口额外触发下,后台会捕获请求引用,可以看到命令行后台的刷新了,看到了调用类以及方法名,这是属于第二步的工作

3 执行第三步,copy command得到:

tt -w 'target.getApplicationContext().getBean("commonController").getRandomInteger()' -x 3 -i 1000

粘贴到后台执行,可以看到调用正常,进行多次调用也没问题(watch的方式和tt类似,更加简单点就不演示了)

ognl调用带参数方法

等待被调用的方法,包含两个参数,一个是Integer,一个是List,前者是一个简单对象,后者属于复杂对象

按照示意图使用插件调用

通过插件,我们发现插件也只能提供简单参数的自动填充,而复杂对象需要我们自己去构造(参考对应文档)

完成后的命令如下:

ognl  -x  3  '#user=new com.wangji92.arthas.plugin.demo.controller.User(),#user.setName("wangji"),#user.setAge(27L),@com.wangji92.arthas.plugin.demo.controller.StaticTest@invokeStaticMethodParamObjListUser(0,{#user,#user})' -c 2dd83cd2

拷贝到命令行中执行,可以得到一个调用结果

在这里插入图片描述

Arthas本身是一个非常强大的运维类工具,Arthas插件给我们提供了许多的方便,替代了我们去记忆很长的脚本语法。

要想灵活的使用它,你还需要完整的阅读官方文档,去了解下,本文就不做详述了,本文目的是入门,相信你看完后至少应该入门了。

插件支持的命令全景图:

文末是一些参考资料,值得你更加全面和深入的进行学习。

资源总览

  • Arthas文档地址:https://arthas.aliyun.com/doc/
  • B站视频:https://www.bilibili.com/video/BV1K7411Q7mW/
  • 语雀文档:https://www.yuque.com/docs/share/01217521-2fdb-4261-8904-ef6e20d4f5ea?#
  • 示例工程地址:https://github.com/WangJi92/arthas-plugin-demo
  • 扩展阅读博客:http://hengyunabc.github.io/
  • idea插件下载地址:https://plugins.jetbrains.com/plugin/13581-arthas-idea
  • 插件源码地址:https://github.com/WangJi92/arthas-idea-plugin

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大厂常见算法50题-两数相加

专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法! 文章目录 题目解法总结 题目 解法 定义一个节点pre,用于初始化结果链表的头部,cur指向pre,它将在遍历过程中用于构建新的链表。初始化进位变…

微服务部署不迷茫:4大部署模式深度解析,轻松驾驭云原生时代

微服务部署最全详解(4种常见部署模式) 微服务多实例部署 每个微服务都独立部署在自己的运行环境中,这是微服务架构的核心思想。 一般会采用每个主机多个服务实例,如下所示: 这是一种传统的应用部署方法,每个服务实例在一个或多个…

腐烂的橘子BFS

题目: 腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子…

FMEA再什么情况下应用——SunFMEA软件

FMEA作为一种系统性的方法,旨在识别和评估潜在的故障模式、其可能的影响以及相应的预防措施,因此,它的适用场景广泛且多样。今天SunFMEA软件系统和大家一起探讨什么情况下应用FMEA? 首先,在产品设计阶段,F…

对比分析汽车灯罩材料使用聚碳酸酯(PC)和PMMA(亚克力)的优缺点,汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

对比分析汽车灯罩材料使用聚碳酸酯(PC)和PMMA(亚克力)的优缺点,并给出建议。 要求: 1. 对比分析两种材料的性能、成本、耐用性、安全性等方面的差异。 2. 给出针对不同应用场景(如夜间照明…

通过GRE隧道实现OSPF、BGP、IS-IS的套接使用

正文共:999 字 9 图,预估阅读时间:1 分钟 书接上文(专线入云场景能否配置动态路由协议?),我们发现通过一定的配置,具体就是组合使用IBGP和静态路由,在使用云专线接入到资…

应用层(上篇)

应用层 应用层协议原理 网络应用程序体系解构 应用程序体系结构: 由应用程序研发者设计规定了如何在各种端系统上组织该应用程序。在选择应用程序体系结构时,应用程序研发者很可能利用现代网络应用程序中所使用的两种主流体系结构之一:客户-服务器体系结构或对等…

快解析Tplink端口映射如何设置

Tplink作为国内知名路由器品牌,有着广泛的用户群体。使用快解析端口映射是实现内网服务器被外网访问必须要做的设置,很多对网络不懂得小白不知道该到哪里去做,下面我就讲解一下tplink路由器如何做端口映射。 1:访问路由器 &#…

Co-Driver:基于 VLM 的自动驾驶助手,具有类人行为并能理解复杂的道路场景

24年5月来自俄罗斯莫斯科研究机构的论文“Co-driver: VLM-based Autonomous Driving Assistant with Human-like Behavior and Understanding for Complex Road Scenes”。 关于基于大语言模型的自动驾驶解决方案的最新研究,显示了规划和控制领域的前景。 然而&…

通过钉钉卡片进行工单审批

我们通常通过钉钉机器人来发送通知,提醒审批人名下有待办工单需要处理。这种通知方式仅能提醒审批人到ITSM中处理,审批人需要打开电脑登陆平台处理,我们就考虑是否能有一种方式能够满足移动端审批? 这里我们可以使用ITSM的移动端版…

使用Flask部署Web应用:从入门到精通

文章目录 第一部分:准备工作第二部分:部署Flask应用到AWS部署到AWS Lambda 第三部分:部署Flask应用到腾讯云服务器部署到腾讯云服务器 第四部分:优化和扩展结论 在现代软件开发中,Web应用的部署是一个至关重要的环节。…

前端铺子-uniapp移动端:跨平台开发新篇章

一、引言 在移动应用开发领域,随着技术的不断进步,用户对应用的需求也日益多样化。如何快速、高效地开发跨平台应用成为了前端开发者面临的一大挑战。uni-app作为一款使用Vue.js开发所有前端应用的框架,凭借其一次编写、多端运行的特性&…

LaTeX 2024软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! LaTeX 2024是一款基于ΤΕΧ技术的专业排版系统,特别适用于制作科技和数学文档,输出高品质印刷效果。它不仅能处理学术报告、…

一篇文章拿下Redis 通用命令

文章目录 Redis数据结构介绍Redis 通用命令命令演示KEYSDELEXISTSEXPIRE RedisTemplate 中的通用命令 本篇文章介绍 Redis 的通用命令, 通用命令在 Redis 的所有数据类型下都使用, 学好通用命令可以让我们更好的使用 Redis. Redis数据结构介绍 Redis 是一个key-value的数据库&…

cookie、session、token、表单、json、jsonp、websocket、ajax都是什么

前后端数据交互的几种方式 1.cookie Cookie是服务器保存在客户端的一小段数据,(使用Cookie的前提是客户端浏览器允许使用Cookie并对此做出相应的设置。) cookie是一种存储在用户计算机上的小型数据文件,常用于在web应用程序中跟…

postgis导出shp中文乱码

使用postgis导出shp数据,发现中文内容乱码 网上搜到的解决方案,都是添加环境变量PGCLIENTENCODINGGBK 但是添加之后,不仅没有解决我的问题,反而导出直接报错了 经过个人简单分析之后,发现这个应该跟导入的数据编码格…

Jmeter(三十九) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 上篇(详解教程)

宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了,因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂,就算修改了也是…

ALV 可编辑性(二)

前言 前面介绍了Abap ALV的整体可编辑、列可编辑和单元格可编辑,但是有时会有根据行项目某个字段的值来控制其他单元格的可编辑性的需求,其中还涉及到ALV刷新的功能。 实战 单元格数据修改后自动刷新 单元格中的数据被修改后,将ALV单元格中的…

人工智能|深度学习——PlotNeuralNet简单教程

一、简介 PlotNeuralNet是一个强大的开源Python库,它专为简化和美化神经网络图的绘制而设计 二、安装 需要下载的工具包括:MikTeX,Python代码编辑器(这个肯定会有的吧),Git bash(可选)&#xff…

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

🔍 目的 使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。 🔍 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…