Arthas 应用诊断利器学习及使用(十一) arthas-boot的默认启动过程

931 阅读2分钟

这是我参与更文挑战的第9天,活动详情查看: 更文挑战

本文内容基于arthas 3.5.2 版本,介绍arthas-boot的默认启动过程。

一.开始使用arthas

官网文档中推荐使用arthas-boot.jar的方式来使用arthas。命令如下:

curl -O https://arthas.aliyun.com/arthas-boot.jar

java -jar arthas-boot.jar

二.如何debug arthas-boot

通过github中arthas仓库的issue Debug Arthas In IDEA 中的介绍可以知道如何debug arthas-boot.jar, 方便了解启动过程。

三.开始debug

这里选择远程debug。

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar arthas-boot.jar

在idea中新增一个remote配置,设置的端口要与执行arthas-boot.jar时的一致,如下图所示。

1.输出arthas-boot版本

image.png 通过Bootstrap.class.getPackage可以获得当前arthas-boot的版本,可以看到为3.5.2

image.png

2.解析执行参数

image.png 接下来,将执行的参数注入到创建出来的bootstrap的实例中。而com.taobao.middleware.cli这个工具是用于方便命令行工具的开发,基于vert.x,后续有空再研究下,这里只要知道大概的作用就可以了。

3.选择仓库镜像

image.png

首先默认选择中央仓库(center),如果是东八区的即国内的环境下,默认选择的仓库镜像为阿里云的镜像仓库(aliyun),因为下载速度相对国外的中央仓库要快很多,而且不容易出错中断。

4.选择要监听的应用程序

image.png

这里只要看ProcessUtils.select(bootstrap.isVerbose(), telnetPortPid, bootstrap.getSelect())中的逻辑即可,debug进去。

首先会执行listProcessByJps(v),通过执行命令jps -l获得现在正在运行的java程序。 ExecutingCommand.runNative(command)实际是封装了Runtime.getRuntime().exec来执行该命令并返回结果,返回的结果中会过滤掉arthas-boot的进程以及jps的进程。

image.png 选择要监听的java程序,这里选择4,返回进程pid为696。

5.找到arthas home

image.png

arthas-boot.jar所在的位置即认为是arthas home的位置。如果该文件夹下不存在arthas-core.jararthas-agent.jararthas-spy.jar这三个jar包的话,则抛出错误。如果还是没找到的话则远程下载arthas。

6.远程下载arthas

image.png 首先,判断~/.arthas/lib目录是否存在,如果不存在则创建。并获取该目录下arthas文件夹名称的列表并排序。默认为arthas版本号,所以可以获得当前本地目录中的arthas的最新版本。

image.png DownloadUtils.readLatestReleaseVersion获取远程最新版本,通过访问https://arthas.aliyun.com/api/latest_version即可获得远程最新版本。

若获取远程版本失败则需要手动下载arthas全量包。远程版本号与本地的arthas版本做比较,如果本地不是最新的版本则需要重新下载最新的。 DownloadUtils.downArthasPackaging下载并解压arthas-packaging-3.5.1-bin.zip压缩包。

ProcessUtils.startArthasCore启动arthas-core.jar,实际执行的命令为

${JAVA_HOME}"/bin/java \
       ${opts} \
       -jar "${arthas_lib_dir}/arthas-core.jar" \
       -pid ${TARGET_PID} \
       -target-ip ${TARGET_IP} \
       -telnet-port ${TELNET_PORT} \
       -http-port ${HTTP_PORT} \
       -core "${arthas_lib_dir}/arthas-core.jar" \
       -agent "${arthas_lib_dir}/arthas-agent.jar"

image.png 通过URLClassLoader,加载arthas-client.jar并执行TelnetConsole中的main方法。是为了启动Telnet服务,默认端口为3658。

到这里,arthas-boot的主要启动流程就基本介绍完了。后续将看看agent机制。