作者:小傅哥
博客:https://bugstack.cn
沉澱、分享、成長,讓自己和他人都能有所收穫!😄
這位同學,你比上一位面試者好多了,你的簡歷中做的幾個項目都不錯。既有業務項目,也有技術項目,看得出你對編程開發是有一定的經驗積累的。那麼我還想了解下,這些項目在運行中的一個數據效果是怎麼樣的。比如;tps、qps、響應時間、數據庫負載等,都是什麼情況,你用的什麼監控工具。另外你這裏還些了微服務的架構,那麼微服務間的鏈路調用是怎麼監控的。
咋樣,是不一下就慌了。張口就喊:“java 崩盤!” 以前靠背題吹牛逼就能入職,現在得把吹的牛逼落地了。而越來越多的面試官也更喜歡用結果推過程,從過程中再考察細節。一上來就問八股文的越來越少了。
所以,做完項目,最好在配上對應的數據,這樣才更有說服力。—— 所以本文小傅哥會教會你,如何配置一套全鏈路監控系統,並完成測試獲取系統運行的數據。此外這是整套《@小傅哥 Java 簡明教程》其中的一節,更多內容可以進入這裏學習;https://bugstack.cn/md/road-map/road-map.html
一、章節目的
本章節通過 Docker 方式部署一套 skywalking 非入侵的全鏈路監控系統,並在對應的測試工程中通過 skywalking-agent 字節碼增強組件,採集系統運行時的各項信息到 skywalking-ui 監控平臺觀察數據。
- 官網:https://skywalking.apache.org/ - 如果你想了解更多關於此類系統的設計和實現,可以閱讀小傅哥的《字節碼編程》
- 源碼:https://gitcode.net/KnowledgePlanet/road-map/skywalking - 這是小傅哥整理好的一套可運行的監控和系統,讀者可以下載後對照本文進行驗證使用。
二、基本環境
- Docker version 1.13.1
- Docker compose - 用於在雲服務器環境中執行的 docker-compose 文件
- Portainer Docker 容器管理面板
以上內容安裝,參考【Java簡明教程/發佈部署】:https://bugstack.cn/md/road-map/road-map.html - 發佈部署
三、監控配置
skywalking 的安裝,需要 elasticsearch - 存放數據、skywalking-oap 接收數據、skywalking-ui 界面展示。以及還需要一個 skywalking-agent 用於配置到應用程序中,採集監控數據。注意這些內容在官網中,都已提供,地址:https://skywalking.apache.org/downloads/
因爲小傅哥這裏提供了Docker的自動部署以及下載好了 skywalking-agent 所以你就不需要一個個去下載安裝了。接下來小傅哥會分別介紹在本地環境
和雲服務器
兩套環境安裝,這樣可以更加方便小夥伴做測試驗證。
在進行下面的步驟前,請先下載 skywalking 監控工程;https://gitcode.net/KnowledgePlanet/road-map/skywalking
1. 本地環境
腳本:/road-map/skywalking/docs/dev-ops/skywalking
- 你可以打開工程找到這個位置,查看最新腳本。
version: '3.8'
services:
elasticsearch:
image: elasticsearch:7.16.2
container_name: elasticsearch
ports:
- "9200:9200"
healthcheck:
test: [ "CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/es_data:/usr/share/elasticsearch/data
oap:
image: apache/skywalking-oap-server:8.9.0
container_name: oap
depends_on:
elasticsearch:
condition: service_healthy
links:
- elasticsearch
ports:
- "11800:11800"
- "12800:12800"
healthcheck:
test: [ "CMD-SHELL", "/skywalking/bin/swctl ch" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
SW_HEALTH_CHECKER: default
SW_TELEMETRY: prometheus
JAVA_OPTS: "-Xms1024m -Xmx1024m"
skywalking-ui:
image: apache/skywalking-ui:8.9.0
container_name: skywalking-ui
depends_on:
oap:
condition: service_healthy
links:
- oap
ports:
- "9090:8080"
environment:
SW_OAP_ADDRESS: http://oap:12800
- 在 Docker 安裝並正確✅啓動後,你就可以點擊這個按鈕了。它會幫你自動運行安裝出整套的 skywalking 監控系統。非常方便。
- 如果你點擊紅圈下面的單個按鈕,那麼代表的是隻安裝當前一個應用。
- 你可以通過命令執行
skywalking-docker-compose.yml
的安裝:/usr/local/bin/docker-compose -f /docs/dev-ops/skywalking/skywalking-docker-compose.yml up -d
- 在雲服務器端也是使用這個命令安裝。
訪問驗證:http://localhost:9090/ - 我設置的端口是9090,如果你是其他的則需要修改。
2. 雲服務器
- 準備一臺2核4G的雲服務器,整個服務啓動後會佔用2-3G左右
- 下載 ssh 工具,用於連接雲服務。這裏小傅哥推薦使用 Termius 非常好用!
- docker-compose 安裝,參考:https://bugstack.cn/md/road-map/road-map.html - 發佈部署,Docker#7
2.1 文件上傳
通過 ssh 的 sftp 工具,把 skywalking/docs 全部上傳到雲服務器。
2.2 執行腳本
[root@dev-ops ~]# cd /docs/
[root@dev-ops docs]# ls
dev-ops skywalking-agent sql
[root@dev-ops docs]# cd dev-ops/
[root@dev-ops dev-ops]# ls
environment skywalking
[root@dev-ops dev-ops]# cd skywalking/
[root@dev-ops skywalking]# ls
skywalking-docker-compose.yml
[root@dev-ops skywalking]# /usr/local/bin/docker-compose -f /docs/dev-ops/skywalking/skywalking-docker-compose.yml up -d
[+] Building 0.0s (0/0)
[+] Running 3/3
✔ Container elasticsearch Healthy 0.5s
✔ Container oap Healthy 1.0s
✔ Container skywalking-ui Running 0.0s
安裝完成記得開放端口;
- 9090 端口;skywalking-ui 界面端口
- 11800 端口;監控數據上報端口
安裝完成後就可以訪問監控界面了;http://180.76.138.**:9090/ - 替換爲你的IP地址
四、數據上報
監控數據的上報使用的是 Javaagent 技術,在程序編譯時候通過字節碼增強技術,在需要監控的位置自動加上額外的監控代碼,來採集系統的運行數據。所以我們這裏可以把 Javaagent 配置到程序啓動上,也可以配置到 Docker 鏡像打包上。
1. 程序啓動 - 加入探針
配置到 IDEA 程序啓動中,VM Options 參數:-javaagent:/Users/fuzhengwei/1024/KnowledgePlanet/road-map/skywalking/docs/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking-app-dev -Dskywalking.collector.backend_service=127.0.0.1:11800
- 注意修改;
地址
、應用名
、IP
【如果是雲服務,就配置雲服務的IP地址】
2. 鏡像打包 - 加入探針
當程序需要運行在雲服務的 Docker 容器了,就不能這樣配置了,需要把配置打包到鏡像裏,更加方便執行。
# 基礎鏡像
FROM openjdk:8-jre-slim
# 作者
MAINTAINER xiaofuge
# 配置
ENV PARAMS=""
# 時區
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 添加應用
ADD /target/skywalking-app.jar /skywalking-app.jar
## 在鏡像運行爲容器後執行的命令
ENTRYPOINT ["java", "-Xmx512m", "-javaagent:/docs/skywalking-agent/skywalking-agent.jar", "-Dskywalking.agent.service_name=skywalking-app", "-Dskywalking.collector.backend_service=180.76.138.41:11800", "-jar", "/skywalking-app.jar"]
- 注意;
/docs/skywalking-agent/skywalking-agent.jar
這個是通過 SFTP 工具上傳到雲服務器端的。但不在 Docker 容器裏,等部署程序的時候還需要做一次文件映射。
五、啓動服務
如果你希望在把應用程序部署到雲服務端,一種是通過 IDEA 連接 Docker 服務,另外一種是把應用程序的鏡像發佈到Docker Hub。這裏我們通過 IDEA 連接 Docker 服務。參考:https://bugstack.cn/md/road-map/road-map.html - 開通 2375 端口,用完記得關閉。
腳本:skywalking/src/bin/main/start.sh
CONTAINER_NAME=skywalking-app
IMAGE_NAME=fuzhengwei/skywalking-app:1.0
PORT=9091
echo "容器部署開始 ${CONTAINER_NAME}"
# 停止容器
docker stop ${CONTAINER_NAME}
# 刪除容器
docker rm ${CONTAINER_NAME}
# 啓動容器 skywalking-agent 下載:https://archive.apache.org/dist/skywalking/java-agent/8.9.0/apache-skywalking-java-agent-8.9.0.tgz
docker run --name ${CONTAINER_NAME} \
-p ${PORT}:${PORT} \
-v /docs/skywalking-agent/:/docs/skywalking-agent/ \
-d ${IMAGE_NAME}
#docker run --name skywalking-app \
#-p 9091:9091 \
#-v /docs/skywalking-agent/:/docs/skywalking-agent/ \
#-d fuzhengwei/skywalking-app:1.2
echo "容器部署成功 ${CONTAINER_NAME}"
docker logs -f ${CONTAINER_NAME}
- 你可以在雲服務執行 start.sh 腳本,或者直接複製 docker run 命令,去執行啓動。
- 注意;
-v /docs/skywalking-agent/:/docs/skywalking-agent/ \
是你的映射地址,只有這樣才能拿到 skywalking-agent - 另外記得按照 MySQL【environment-docker-compose.yml】 到雲服務以及執行 road-map.sql 文件。