记得之前写过一篇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...