共计 3269 个字符,预计需要花费 9 分钟才能阅读完成。
记得之前写过一篇 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…