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

 

成品圖是這樣的,指標還沒出來,因為還需要一個服務,明天再搞

 

 待續。。。。。

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM