前言

arthas是啥可能大家都晓得了,为了凑字数,我把官网的介绍再抄一下

Arthas 是Alibaba开源的Java诊断工具,深受开发者青睐。当你遇到以下相似问题而大刀阔斧时,Arthas能够帮忙你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相干的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无奈在线上 debug,难道只能通过加日志再从新公布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无奈 debug,线下无奈重现!
  5. 是否有一个全局视角来查看零碎的运行状况?
  6. 有什么方法能够监控到JVM的实时运行状态?
  7. 怎么疾速定位利用的热点,生成火焰图?

明天不具体讲如何应用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-alpineVOLUME /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/localtimeRUN echo "Asia/Shanghai" > /etc/timezoneONBUILD COPY app.jar app.jarARG ARTHAS_VERSION="3.5.0"ARG MIRROR=falseENV 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 siteRUN 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.zipENTRYPOINT ["/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