文章目录
- 工程师工具箱系列(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