1. 鏈路追蹤概述
什么是鏈路追蹤
微服務(wù)架構(gòu)是通過業(yè)務(wù)來劃分服務(wù)的,使用 REST 調(diào)用。對外暴露的一個(gè)接口,可能需要很多個(gè)服務(wù)協(xié)同才能完成這個(gè)接口功能,如果鏈路上任何一個(gè)服務(wù)出現(xiàn)問題或者網(wǎng)絡(luò)超時(shí),都會形成導(dǎo)致接口調(diào)用失敗。隨著業(yè)務(wù)的不斷擴(kuò)張,服務(wù)之間互相調(diào)用會越來越復(fù)雜。

隨著服務(wù)的越來越多,對調(diào)用鏈的分析會越來越復(fù)雜。它們之間的調(diào)用關(guān)系也許如下:

面對以上情況,我們就需要一些可以幫助理解系統(tǒng)行為、用于分析性能問題的工具,以便發(fā)生故障的時(shí)候,能夠快速定位和解決問題,這就是所謂的 APM(應(yīng)用性能管理)。
什么是 SkyWalking
目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking;Apache SkyWalking 是觀察性分析平臺和應(yīng)用性能管理系統(tǒng)。提供分布式追蹤、服務(wù)網(wǎng)格遙測分析、度量聚合和可視化一體化解決方案。

- Skywalking Agent: 使用 JavaAgent 做字節(jié)碼植入,無侵入式的收集,并通過 HTTP 或者 gRPC 方式發(fā)送數(shù)據(jù)到 SkyWalking Collector。
- SkyWalking Collector: 鏈路數(shù)據(jù)收集器,對 agent 傳過來的數(shù)據(jù)進(jìn)行整合分析處理并落入相關(guān)的數(shù)據(jù)存儲中。
- Storage: SkyWalking 的存儲,時(shí)間更迭,SW 已經(jīng)開發(fā)迭代到了 6.x 版本,在 6.x 版本中支持以 ElasticSearch(支持 6.x)、Mysql、TiDB、H2、作為存儲介質(zhì)進(jìn)行數(shù)據(jù)存儲。
- UI: Web 可視化平臺,用來展示落地的數(shù)據(jù)。
SkyWalking 功能特性
- 多種監(jiān)控手段,語言探針和服務(wù)網(wǎng)格(Service Mesh)
- 多語言自動探針,Java,.NET Core 和 Node.JS
- 輕量高效,不需要大數(shù)據(jù)
- 模塊化,UI、存儲、集群管理多種機(jī)制可選
- 支持告警
- 優(yōu)秀的可視化方案
2. SkyWalking 服務(wù)端配置
基于 Docker 安裝 ElasticSearch
官方推薦的方案是 ElasticSearch ,所以我們需要先安裝 ElasticSearch。
docker-compose.yml
version: '3.3'
services:
elasticsearch:
image: wutang/elasticsearch-shanghai-zone:6.3.2
container_name: elasticsearch
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
cluster.name: elasticsearch
其中,9200 端口號為 SkyWalking 配置 ElasticSearch 所需端口號,cluster.name Elasticsearch集群名稱,運(yùn)行Skywalking需要與此名稱保持一致。
測試是否啟動成功
瀏覽器訪問 http://192.168.198.131:9200/ ,瀏覽器返回如下信息即表示成功啟動

2. 安裝SkyWalking
這里采用docker-compose的方式部署skywalking。部署所用的docker-compose.yml如下,skywalking-oap中掛載的配置文件volume來自于:https://github.com/apache/incubator-skywalking/tree/master/docker中的config目錄。
這里用的是最新版本6.1.0
skywalking文檔中也提示重要提示:請?jiān)赨I上選擇時(shí)區(qū),使其與OAP后端服務(wù)器的時(shí)區(qū)匹配。
version: '3.3'
services:
elasticsearch:
image: elasticsearch:6.8.0
container_name: skywalking-es
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
discovery.type: single-node
TZ: Asia/Shanghai
oap:
image: apache/skywalking-oap-server:6.1.0
container_name: skywalking-oap
depends_on:
- elasticsearch
links:
- elasticsearch
restart: always
#前邊為外網(wǎng)端口號,后邊為容器應(yīng)用端口號
ports:
- 11800:11800
- 12800:12800
environment:
# 設(shè)置時(shí)區(qū)
TZ: Asia/Shanghai
# volumes:
# - /home/skywalking/apache-skywalking-apm-bin/config/application.yml
# - ./config:/skywalking/config:ro
ui:
image: apache/skywalking-ui:6.1.0
container_name: skywalking-ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 18080:8080
#設(shè)置環(huán)境,配置覆蓋yml的配置
environment:
collector.ribbon.listOfServers: oap:12800
訪問 ip:18080 就可以登錄了
默認(rèn)的用戶名密碼為:admin/admin,登錄成功后,效果如下圖

由于使用Agent探針,所以需要下載SkyWalking。官方已經(jīng)為我們準(zhǔn)備好了編譯過的服務(wù)端版本,下載地址為 http://skywalking.apache.org/downloads/,這里我們需要下載 6.x releases 版本
配置 SkyWalking
下載完成后解壓縮,進(jìn)入 apache-skywalking-apm-incubating/config 目錄并修改 application.yml 配置文件

這里需要做三件事:
- 注釋 H2 存儲方案
- 啟用 ElasticSearch 存儲方案
- 修改 ElasticSearch 服務(wù)器地址
Java Agent 服務(wù)器探針
參考官網(wǎng)給出的幫助 Setup java agent,我們需要使用官方提供的探針為我們達(dá)到監(jiān)控的目的,按照實(shí)際情況我們需要實(shí)現(xiàn)三種部署方式
- IDEA 部署探針
- Java 啟動方式部署探針(我們是 Spring Boot 應(yīng)用程序,需要使用
java -jar的方式啟動應(yīng)用) - Docker 啟動方式部署探針(需要做到一次構(gòu)建到處運(yùn)行的持續(xù)集成效果,本章節(jié)暫不提供解決方案,到后面的實(shí)戰(zhàn)環(huán)節(jié)再實(shí)現(xiàn))
探針文件在 apache-skywalking-apm-incubating/agent 目錄下

IDEA 部署探針
繼續(xù)之前的案例項(xiàng)目,創(chuàng)建一個(gè)名為 hello-spring-cloud-external-skywalking 的目錄,并將 agent 整個(gè)目錄拷貝進(jìn)來

修改項(xiàng)目的 VM 運(yùn)行參數(shù),點(diǎn)擊菜單欄中的 Run -> EditConfigurations...,此處我們以 nacos-provider 項(xiàng)目為例,修改參數(shù)如下
-javaagent:D:\Workspace\Others\hello-spring-cloud-alibaba\hello-spring-cloud-external-skywalking\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=nacos-provider
-Dskywalking.collector.backend_service=192.168.198.131:11800

-
-javaagent:用于指定探針路徑 -
-Dskywalking.agent.service_name:用于重寫agent/config/agent.config配置文件中的服務(wù)名 -
-Dskywalking.collector.backend_service:用于重寫agent/config/agent.config配置文件中的服務(wù)地址
Java 啟動方式
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=nacos-provider -Dskywalking.collector.backend_service=192.168.198.131:11800 -jar yourApp.jar
測試監(jiān)控
啟動 nacos-provider 項(xiàng)目,通過觀察日志可以發(fā)現(xiàn),已經(jīng)成功加載探針

訪問之前寫好的接口 http://localhost:9000/nacos-consumer-feign/echo/hi?token=123
之后再刷新 SkyWalking Web UI,你會發(fā)現(xiàn) Service 與 Endpoint 已經(jīng)成功檢測到了


至此,表示 SkyWalking 鏈路追蹤配置成功

訪問路徑:http://localhost:9000/nacos-consumer-feign/echo/hi?token=123




上圖中展示了服務(wù)在一定時(shí)間范圍內(nèi)的相關(guān)數(shù)據(jù),包括:
服務(wù)可用性指標(biāo) SLA
每分鐘平均響應(yīng)數(shù)
平均響應(yīng)時(shí)間
服務(wù)進(jìn)程 PID
服務(wù)所在物理機(jī)的 IP、Host、OS
運(yùn)行時(shí) CPU 使用率
運(yùn)行時(shí)堆內(nèi)存使用率
運(yùn)行時(shí)非堆內(nèi)存使用率
GC 情況
附:Maven Assembly 插件
什么是 Assembly Plugin
Assembly 插件目的是提供一個(gè)把工程依賴元素、模塊、網(wǎng)站文檔等其他文件存放到單個(gè)歸檔文件里。
Assembly 支持的歸檔文件類型
- zip
- tar.gz
- tar.bz2
- jar
- dir
- war
使用步驟
此處以將 SkyWalking 探針打包為 tar.gz 為例,為后期持續(xù)集成時(shí)構(gòu)建 Docker 鏡像做好準(zhǔn)備
POM
在 pom.xml 中增加插件配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<!-- 配置執(zhí)行器 -->
<execution>
<id>make-assembly</id>
<!-- 綁定到 package 生命周期階段上 -->
<phase>package</phase>
<goals>
<!-- 只運(yùn)行一次 -->
<goal>single</goal>
</goals>
<configuration>
<finalName>skywalking</finalName>
<descriptors>
<!-- 配置描述文件路徑 -->
<descriptor>src/main/resources/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
assembly.xml
創(chuàng)建 src/main/resources/assembly.xml 配置文件
<assembly>
<id>6.0.0-Beta</id>
<formats>
<!-- 打包的文件格式,支持 zip、tar.gz、tar.bz2、jar、dir、war -->
<format>tar.gz</format>
</formats>
<!-- tar.gz 壓縮包下是否生成和項(xiàng)目名相同的根目錄,有需要請?jiān)O(shè)置成 true -->
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<!-- 是否把本項(xiàng)目添加到依賴文件夾下,有需要請?jiān)O(shè)置成 true -->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<!-- 將 scope 為 runtime 的依賴包打包 -->
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<!-- 設(shè)置需要打包的文件路徑 -->
<directory>agent</directory>
<!-- 打包后的輸出路徑 -->
<outputDirectory></outputDirectory>
</fileSet>
</fileSets>
</assembly>
打包
mvn clean package
mvn clean install
- package:會在 target 目錄下創(chuàng)建名為
skywalking-6.0.0-Beta.tar.gz的壓縮包 - install:會在本地倉庫目錄下創(chuàng)建名為
hello-spring-cloud-external-skywalking-1.0.0-SNAPSHOT-6.0.0-Beta.tar.gz的壓縮包