前言
arthas 是啥可能大家都晓得了,为了凑字数,我把官网的介绍再抄一下
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者青睐。当你遇到以下相似问题而大刀阔斧时,Arthas 能够帮忙你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相干的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无奈在线上 debug,难道只能通过加日志再从新公布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无奈 debug,线下无奈重现!
- 是否有一个全局视角来查看零碎的运行状况?
- 有什么方法能够监控到 JVM 的实时运行状态?
- 怎么疾速定位利用的热点,生成火焰图?
明天不具体讲如何应用 arthas,因为之前有专门写了一篇博文介绍过,感兴趣的敌人能够查看如下链接
java 利用线上诊断神器 –Arthas
随着容器化的炽热,可能有相当一部分的我的项目都是基于 docker 部署,明天次要就聊下运行在 docker 环境中的 springboot 我的项目,如何启用 arthas
docker 环境中的 springboot 我的项目,如何启用 arthas
计划一、进入容器外部执行相应命令
docker exec -it d2ce06ad8855 /bin/bash
进入容器后,再运行
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
这种计划的弊病在于容器销毁后,下次运行容器后,要再次下载 arthas-boot.jar
计划二、把 arthas 装置到根底镜像
FROM openjdk:8-jdk-alpine
VOLUME /tmp
#ENV JAVA_OPTS="-Dcom.sun.management.jmxremote.port=39083 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
ENV JAVA_OPTS=""
COPY localtime /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ONBUILD COPY app.jar app.jar
ARG ARTHAS_VERSION="3.5.0"
ARG MIRROR=false
ENV MAVEN_HOST=https://repo1.maven.org/maven2 \
ALPINE_HOST=dl-cdn.alpinelinux.org \
MIRROR_MAVEN_HOST=https://maven.aliyun.com/repository/public \
MIRROR_ALPINE_HOST=mirrors.aliyun.com
# if use mirror change to aliyun mirror site
RUN if $MIRROR; then MAVEN_HOST=${MIRROR_MAVEN_HOST} ;ALPINE_HOST=${MIRROR_ALPINE_HOST} ; sed -i "s/dl-cdn.alpinelinux.org/${ALPINE_HOST}/g" /etc/apk/repositories ; fi && \
# https://github.com/docker-library/openjdk/issues/76
apk add --no-cache tini && \
# download & install arthas
wget -qO /tmp/arthas.zip "${MAVEN_HOST}/com/taobao/arthas/arthas-packaging/${ARTHAS_VERSION}/arthas-packaging-${ARTHAS_VERSION}-bin.zip" && \
mkdir -p /opt/arthas && \
unzip /tmp/arthas.zip -d /opt/arthas && \
rm /tmp/arthas.zip
ENTRYPOINT ["/sbin/tini", "--", "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
计划三、应用 arthas-spring-boot-starter
1、在我的项目的 pom.xml 引入
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>${arthas.version}</version>
</dependency>
2、在 yml 进行配置
这边配置又有两种形式
- 2.1、配置 arthas tunnel server 实现远程管理
注: 通过 Arthas Tunnel Server/Client 来远程管理 / 连贯多个 Agent
因而咱们首先要先装置 Arthas Tunnel Server/Client
a、 下载部署 arthas tunnel server
https://github.com/alibaba/arthas/releases
b、启动 arthas-tunnel-server
示例
java -jar arthas-tunnel-server-3.5.0-fatjar.jar
注: 默认状况下,arthas tunnel server 的 web 端口是 8080,arthas agent 连贯的端口是 7777
c、 在我的项目的 yml 做如下配置
arthas:
agent-id: ${ARTHAS_AGENT_ID:hsehdfsfghhwertyfad}
app-name: ${spring.application.name}
tunnel-server: ${ARTHAS_TUNNEL_SERVER:ws://localhost:7777/ws}
注: agentId 要放弃惟一,否则会在 tunnel server 上抵触,不能失常工作
d、 成果演示
- 2.2、间接在我的项目的 yml 做如下配置
arthas:
# 通过 http 拜访的端口
http-port: 8563
# 通过 telnet 拜访的端口
telnet-port: 3658
session-timeout: 1800
# 绑定的 ip
ip: 0.0.0.0
注: 如果配置 arthas.telnetPort 为 -1,则不监听 telnet 端口。如果配置 arthas.telnetPort 为 0,则随机 telnet 端口。arthas.httpPort 相似
成果演示
- a、通过 http 拜访
- b、通过 telnet 拜访
arthas 入门应用
核心思想通过 help 命令,先通过 help 理解一下 arthas 有啥命令
而后过 help 你感兴趣的命令,比方你对 thread 这个命令很感兴趣,则在命令行输出
help thread
示例演示,比方排查我的项目中是否存在死锁
thread -b
咱们也比拟罕用 dashboard 命令来查看 cpu、gc 等信息
dashboard
总结
arthas 的确升高咱们排查 java 问题的难度,但 arthas 的命令那么多,很多时候咱们都记不住,就算能记,我也不会去记,我失常应用的套路是先 help 命令,而后找到相应的示例,最初照猫画虎。
如果应用 http 或者 telnet 的话,基于平安考量,那个 ip 最好是应用 内网 ip,不要像我示例间接 0.0.0.0,我是为了演示不便。
demo 链接
https://github.com/lyb-geek/springboot-learning/tree/master/springboot-arthas