美文网首页
聊聊部署在docker容器里面的springboot项目如何启用

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

作者: linyb极客之路 | 来源:发表于2021-05-11 18:02 被阅读0次

    前言

    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、 效果演示

    image.png
    • 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访问


      image.png
    • b、通过telnet访问
    image.png

    arthas入门使用

    核心思想通过help命令,先通过help了解一下arthas有啥命令

    image.png

    然后过help 你感兴趣的命令,比如你对thread这个命令很感兴趣,则在命令行输入

    help thread
    
    image.png

    示例演示,比如排查项目中是否存在死锁

    thread -b
    
    image.png

    我们也比较常用dashboard命令来查看cpu、gc等信息

    dashboard
    
    image.png

    总结

    arthas确实降低我们排查java问题的难度,但arthas的命令那么多,很多时候我们都记不住,就算能记,我也不会去记,我正常使用的套路是先help 命令,然后找到相应的示例,最后照猫画虎。

    如果使用http或者telnet的话,基于安全考量,那个ip最好是使用内网ip,不要像我示例直接0.0.0.0,我是为了演示方便。

    demo链接

    https://github.com/lyb-geek/springboot-learning/tree/master/springboot-arthas

    相关文章

      网友评论

          本文标题:聊聊部署在docker容器里面的springboot项目如何启用

          本文链接:https://www.haomeiwen.com/subject/pyxndltx.html