乐趣区

关于java:线上项目出BUG没法调试这款阿里开源的诊断神器自带IDEA插件真香

记得之前写过一篇 Arthas 应用教程,通过应用 Arthas 咱们既能够实现线上调试,还能够实现热修复。最近逛了下 Arthas 的官网,发现它曾经反对间接集成到 SpringBoot 利用中去,并且还出了专用的 IDEA 插件。明天咱们再来体验下它,看看它的性能是不是更弱小了!

SpringBoot 实战电商我的项目 mall(50k+star)地址:https://github.com/macrozheng/mall

Arthas 简介

Arthas 是 Alibaba 开源的 Java 诊断利器,深受开发者青睐,目前在 Github 上已有29K+Star。它采纳命令行交互模式,同时提供丰盛的 Tab 主动补全性能,进一步不便进行问题的定位和诊断。

ArthasTunnel

为了演示一个更加实在的线上环境,接下来咱们将对 Docker 容器中的 SpringBoot 利用进行诊断。咱们将应用 ArthasTunnel 来实现,ArthasTunnel相当于一个 Web 控制台,应用它咱们无需进入利用容器即可对利用进行诊断,十分不便。

  • 首先咱们须要下载 ArthasTunnel 的安装包,下载地址:https://github.com/alibaba/ar…

  • 因为官网只提供了 JAR 包,如果你想通过 Docker 形式启动的话,能够自行打包 Docker 镜像,打包应用的 Dockerfile 脚本如下:
# 该镜像须要依赖的根底镜像
FROM java:8
# 将当前目录下的 jar 包复制到 docker 容器的 / 目录下
ADD arthas-tunnel-server.jar /arthas-tunnel-server.jar
# 申明服务运行的端口
EXPOSE 8080 7777
# 指定 docker 容器启动时运行 jar 包
ENTRYPOINT ["java", "-jar","/arthas-tunnel-server.jar"]
# 指定维护者的名字
MAINTAINER macro
  • 这里再提供一个一键打包运行 ArthasTunnel 容器的执行脚本run.sh,脚本内容如下;
#!/usr/bin/env bash
# 定义利用组名
group_name='mall-tiny'
# 定义利用名称
app_name='arthas-tunnel-server'
# 定义利用版本
app_version='1.0-SNAPSHOT'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译 docker 镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8080:8080 -p 7777:7777 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
  • 接下来吧 ArthasTunnel 的 JAR 包、Dockerfile 文件、执行脚本 run.sh 上传到 Linux 服务器上,而后应用 ./run.sh 命令运行即可;

  • 运行胜利后,能够间接拜访 ArthasTunnel 的 Web 控制台,拜访地址:http://192.168.3.105:8080

SpringBoot 集成

在 SpringBoot 利用中间接集成 Arthas 并应用,无疑是最不便的,接下来咱们将采纳此种办法。

  • 首先在我的项目的 pom.xml 中增加如下依赖,能够比照下 Arthas 应用教程 中的应用办法,间接集成的确简略不少;
<!-- 集成 Java 诊断利器 Arthas-->
<dependency>
    <groupId>com.taobao.arthas</groupId>
    <artifactId>arthas-spring-boot-starter</artifactId>
    <version>3.6.1</version>
</dependency>
  • 而后批改配置文件 application.yml,记住这个agent-idArthasTunnel 连贯须要应用,因为咱们将会把利用容器通过 --link 的形式连贯到 ArthasTunnel 容器,这里的 tunnel-server 按上面进行配置;
management:
  endpoints:
    web:
      exposure:
        # 裸露端点 `/actuator/arthas`
        include: 'arthas'
arthas:
  agent-id: mall-tiny-arthas
  tunnel-server: ws://arthas-tunnel-server:7777/ws
  • 接下来通过之前的 Dockerfile 和 run.sh 打包利用,run.sh与之前比照,只多了一行通过 --link 连贯到 ArthasTunnel 容器的命令;

  • 打包应用的 Dockerfile 和运行脚本 run.sh 都曾经蕴含在示例代码中了,构造如下;

  • 接下来在 ArthasTunnel 的 Web 控制台中输出 AgentIdmall-tiny-arthas,并点击 Connect 按钮即可开始诊断 Java 利用了;

  • 比方通过 dashboard 命令来显示以后零碎的实时数据面板,包含线程信息、JVM 内存信息及 JVM 运行时参数;

  • 再比如说应用 thread 命令查看以后线程信息,查看线程的堆栈,能够找出以后最占 CPU 的线程;

  • 当然 Arthas 的性能十分弱小,远不止这些,反对动静批改日志和热更新等,具体能够参考 Arthas 应用教程。

IDEA 插件

因为 Arthas 的性能很弱小,须要记住的命令很多,有时候切实记不住,于是有了这款 IDEA 插件,该插件次要用于帮忙生成 Arthas 命令。

  • 间接在 IDEA 的插件市场搜寻 arthas 即可找到该插件,而后点击装置即可;

  • 装置实现后咱们来聊聊如何应用,比方当咱们感觉线上代码和预期不统一,能够应用 jad 命令反编译下看看,间接抉择类,右键抉择 Arthas 命令而后抉择 Jad 反编译;

  • 此时将会间接把命令拷贝到剪切板,而后到 ArthasTunnel 右键粘贴即可应用,比手打命令简略多了吧!

  • 如果你想察看办法执行过程中的参数和返回值,能够应用 watch 命令,抉择须要察看的办法右键抉择即可;

  • 这里察看下 Controller 中的办法的执行过程;

  • 咱们还可独自批改某个类的日志级别,选中类名后右键抉择 logger 命令;

  • 先拷贝下 logger sc 命令查看下以后类的日志级别为INFO

  • 拷贝下 ClassLoader 的 Hash 值,这里因为在 Linux 中 Ctrl+C 键有抵触,应用 Ctrl+Insert 组合来拷贝;

  • 接下来输出 ClassLoader 的 Hash 值,批改下日志级别,而后拷贝批改日志级别的命令;

  • 执行完后再查看下日志级别,曾经被改为了 DEBUG 级别

总结

明天体验了一把新版的 Arthas,搭配 ArthasTunnel 和 IDEA 插件应用,的确十分不便!并且它还能和 SpringBoot 无缝集成,的确十分给力,更多 Arthas 的应用能够参考 Arthas 应用教程。

参考资料

  • 我的项目官网:https://github.com/alibaba/ar…
  • Arthas 官网文档:https://arthas.aliyun.com/doc…
  • IDEA 插件应用文档:https://www.yuque.com/arthas-…

我的项目源码地址

https://github.com/macrozheng…

退出移动版