乐趣区

关于arthas:聊聊部署在docker容器里面的springboot项目如何启用arthas

前言

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-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

退出移动版