记得之前写过一篇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-id
,ArthasTunnel
连贯须要应用,因为咱们将会把利用容器通过--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控制台中输出AgentId
为mall-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...