zoukankan      html  css  js  c++  java
  • docker部署spring boot并接入skywalking【探索篇】

    docker部署spring boot并接入skywalking【探索篇】

    一、问题引入

      最近忙标书的事,或者是一些技术含量不高的,写下来恐贻笑大方,难登大雅之堂。。。

      这个课题是最近闲起来自己找事做的,因为写的标书里面有提到什么灰度发布呀,docker镜像恢复呀,各种监控呀。首先我一开始并不知道skywalking是什么来的,是某强告诉我的,只知道ELK 7版本有个APM的东西,然后我经理叫我点进去,说有空研究下。

      然后研究不下去,倒是部署下来了,如下图:

       当我想搞清楚页面每个指标代表啥意思的时候(老实说,即使知道中文意思也挺懵逼的,估计开发才了解),发现并没有很多参考文档,而且elk官网对这个APM都是全英解释,关键的是,做报警监控的时候还有短板,说是内测阶段。看着研究价值不高,而且感觉会死很多脑细胞,干脆放弃了,问某强公司用的APM工具是什么,然后这个skywalking出场了,是针对微服务用得非常普遍的APM工具。

      单纯单机版在操作系统运行,指定下agent收集器跑jar包(目前我们线上业务就是操作系统跑的jar微服务),完事~

      但上面说到标书是要用docker,也就是标如果中了,这个是趋势,docker下跑jar包,方便回滚操作,然后什么高大上的灰度发布,滚动升级,用户无感知。。。k8s应该以后也是会用到的,从简单入手,我就先研究这个了。

    二、问题探索

      昨天搞的时候一点进度都木有,可能过急了,就是跳跃式,越快越好,不仅jar包无法注册到nacos服务中心,而且skywalking也监控不到跑起来的jar包服务。我直接改以前docker版pipeline的jenkins发布任务,因为我以为很简单 = =,无非就是把jar包打到skywalking基础镜像上,然后指定agent跑起来就好。才发现,出问题很难定位问题原因。

      参考文档:https://www.jb51.net/article/210119.htm

      首先讲下我是怎么做这个东西的。测试的排版目录长这样:

     说明:

    (1)build目录:

    以 apache/skywalking-base:8.4.0-es6 作为基础镜像,把启动脚本startup.sh打进去,最终构建出 “服务名:sw” 的新镜像 

    [root@170 builds]# more 服务名/Dockerfile 
    FROM apache/skywalking-base:8.4.0-es6 
    
    WORKDIR /app
    COPY startup.sh /app/startup.sh
    
    # 赋予运行权限
    RUN chmod +x /app/startup.sh
    
    # 指定容器时区:东八区
    ENV TZ=Asia/Shanghai 
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    ENV SW_AGENT_COLLECTOR_BACKEND_SERVICES="192.168.0.170:11800" 
        SW_AGENT_NAME="api-gateway_sw"
    
    # 进行运行脚本
    CMD [ "sh", "-x", "/app/startup.sh" ]

    docker build -t 服务名:sw ./服务名/

    (2)services目录:映射运行目录到docker里面,包括jar包和日志,方便我在docker容器外看日志

    (3)yaml 目录:装有docker-compose.yaml文件,用于运行微服务

    [root@170 test_sw]# more yaml/docker-compose.yml 
    version: '3.5'
    
    ## 微服务
    services:
      服务名:
        image: 服务名:sw    #builds 目录构建出来的镜像
        container_name: 服务名
        volumes:
          - /root/test_sw/services/服务名:/app
        ports:
          - 8080:8080
        environment:
          - TZ="Asia/Shanghai" 

      然后讲下我怎么查出来的,看日志!jenkins发布完竟然说是success的,但是docker ps 压根没有看到微服务!

      于是,我手动运行  “docker-compose start 服务” 是跑不动的,说容器里面找不到jar包,我就纳闷了,明明build的时候弄进去了的。没办法,只能docker run这个“服务名:sw”的镜像去查

    三、排查流程:

    1)把微服跑起来
    docker run -itd --name 微服务-sw  -p 8081:8081 -v /root/test_sw/services/微服务:/app 微服务:sw bash
    
    (2)进去容器
     docker exec -it 容器id bash 
    
    (3)在容器里面手动跑jar包
    java -Duser.timezone=GMT+08 -verbose:gc  -XX:+PrintGCDetails -Xms512m -Xmx512m -Xloggc:微服务-gc.log -javaagent:/skywalking/agent/skywalking-agent.jar -jar 微服务.jar >> out_微服务.log     

    记录下解决问题的几个关键点

    1、dockerfile构建镜像的时候,记得用skywalking-base 这个基础镜像,这个镜像已经有java环境,不用担心跑不了jar

    FROM apache/skywalking-base:8.4.0-es6

    2、以这个基础镜像打进去的jar包,或者运行脚本,启动jar包时有些参数是不支持的,譬如在我测试中,这两个参数就报错

    -XX:+PrintGCTimeStamps
    -XX:+PrintHeapAtGC

    3、诸如这种127.0.0.1的报错,要检查相关配置文件,都改到docker外的宿主机ip上,不然通信不了

    (1)skywalking报错:连接拒绝

    这个启动文件 startup.sh

    SW_AGENT_COLLECTOR_BACKEND_SERVICES  如果写成 127.0.0.1 会报如下错误
    Caused by: org.apache.skywalking.apm.dependencies.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: /127.0.0.1:11800
    Caused by: java.net.ConnectException: Connection refused
     
    (2)服务中心nacos报错:微服务无法注册

    要检查下配置文件,或者启动脚本

      nacos报错,叫开发修改BOOT-INF/classes/bootstrap-test.properties 的配置,写成127.0.0.1是无法注册上去的,因为是容器内,要写成操作系统ip,因为已经映射出来,注意docker下的容器之间的网络是隔离的。

    spring.cloud.nacos.config.server-addr=http://127.0.0.1:8848   #127.0.0.1需要改成操作系统ip  

      这个文件改了之后,还要确保application-test.yml也要修改,改成当前服务器的ip,我这里是192.168.0.170,原来写的是127.0.0.1

    成品图是这样的,指标还没出来,因为还需要一个服务,明天再搞

     待续。。。。。

      

      

  • 相关阅读:
    排序操作
    逻辑回归
    二叉树的建立以及相关操作,平衡二叉树
    【AMAD】cookiecutter-django -- 是一个构建Django项目的脚手架工具
    【AMAD】django-allauth
    【AMAD】django-formapi -- 一个DJANGO API框架,可使用签名request,可使用form作为API的验证工具
    【AMAD】django-cities -- 为Django项目提供国家,城市数据
    【AMAD】django-countries -- 为Django app的form提供country选项,为model提供CountryField
    【AMAD】django-social-auth -- 让django使用社交网络oauth鉴权变得极为轻松!
    每周分享第9期(2019.6.1)
  • 原文地址:https://www.cnblogs.com/windysai/p/15350506.html
Copyright © 2011-2022 走看看