1. Skywalking概述
Skywalking與2016年11月2日由國(guó)人吳晟在Github上傳v1.0版本,用于提供分布式鏈路追蹤功能,從5.x開(kāi)始,成為一個(gè)功能較為完善的APM(Application Performance Management)系統(tǒng),2019年4月17日從Apache孵化器畢業(yè),正式成為Apache頂級(jí)項(xiàng)目。提供分布式追蹤、服務(wù)網(wǎng)格遙測(cè)分析、度量聚合和可視化一體化解決方案。官方對(duì)自己介紹是專(zhuān)為微服務(wù),云原生和基于容器(Docker,Kubernetes,Mesos)架構(gòu)而設(shè)計(jì)。(了解源碼可+求求: 1791743380)
2. Skywalking主要功能
服務(wù),服務(wù)實(shí)例,端點(diǎn)指標(biāo)分析
根本原因分析
服務(wù)拓?fù)鋱D分析
服務(wù),服務(wù)實(shí)例和端點(diǎn)依賴(lài)性分析
慢服務(wù)檢測(cè)
性能優(yōu)化
分布式跟蹤和上下文傳播
數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)指標(biāo)、檢測(cè)慢速數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)語(yǔ)句(包括SQL)
告警
3. Skywalking主要特性
多種監(jiān)控手段,語(yǔ)言探針和service mesh
多語(yǔ)言自動(dòng)探針,Java,.NET Core和Node.JS
多種后端存儲(chǔ)支持
輕量高效
模塊化,UI、存儲(chǔ)、集群管理多種機(jī)制可選
支持告警
優(yōu)秀的可視化方案
4. Skywalking架構(gòu)簡(jiǎn)介
先看一下官方提供的架構(gòu)圖,如圖:

Skywalking總體由四個(gè)部分agent、collector、webapp-ui、storage組成。圖10-11從上到下是應(yīng)用層接入,可以使用無(wú)入侵性的agent探針接入,通過(guò)HTTP或者gRPC講數(shù)據(jù)發(fā)送至Skywalking分析平臺(tái)collector,collector對(duì)接受到的數(shù)據(jù)進(jìn)行聚合分析,最后存儲(chǔ)至storage中,這里支持多種存儲(chǔ)方式,比較常用的有H2和ElasticSearch,最后可以由webapp-ui對(duì)所有的數(shù)據(jù)進(jìn)行展示。
5. Spring Cloud與Skywalking實(shí)戰(zhàn)
5.1 Skywalking部署構(gòu)建
在介紹實(shí)戰(zhàn)之前,我們先簡(jiǎn)單介紹一下Skywalking部署構(gòu)建方案。
這里存儲(chǔ)方式筆者選擇使用ElasticSearch,具體版本是6.5.0,ElasticSearch的構(gòu)建方式選擇使用Docker,直接使用Linux搭建有點(diǎn)復(fù)雜,不適合初學(xué)者,使用Docker構(gòu)建簡(jiǎn)單方便。
筆者構(gòu)建的一些前置條件:
java:1.8
CentOS:7.6
如果當(dāng)前CentOS上沒(méi)有Docker環(huán)境,可以使用下面的語(yǔ)句快速構(gòu)建:
yum install docker
當(dāng)構(gòu)建成功后,可以使用下面的語(yǔ)句查看當(dāng)前Docker的版本:
docker -v
筆者這里的輸出是:
Docker version 1.13.1, build 7f2769b/1.13.1
安裝好Docker以后,最好配置一下國(guó)內(nèi)的鏡像站,否則在網(wǎng)絡(luò)不好的情況下可能出現(xiàn)Docker下載失敗等情況,可以使用下面的語(yǔ)句來(lái)修改鏡像地址:
vi /etc/docker/daemon.json
筆者這里使用的是阿里云的鏡像加速,如下:
{"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]}
各位讀者可以自己去阿里云上開(kāi)通自己的鏡像加速,具體不多做介紹。
使用Docker構(gòu)建ElasticSearch6.5.0,首先,需要下載ElasticSearch6.5.0的鏡像,輸入以下命令:
docker pull elasticsearch:6.5.0
等待程序下載完成,完成后就可以啟動(dòng)鏡像了,命令如下:
docker run -d --restart=always --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.5.0
ElasticSearch的默認(rèn)啟動(dòng)內(nèi)存是1g,如果當(dāng)前服務(wù)器的內(nèi)存不足1g,可以使用參數(shù)-e ES_JAVA_OPTS="-Xms256m -Xmx256m"限制ElasticSearch的啟動(dòng)內(nèi)存大小,完整的語(yǔ)句如下:
docker run -d --restart=always -e ES_JAVA_OPTS="-Xms256m -Xmx256m" --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.5.0
啟動(dòng)成功以后可以使用如下語(yǔ)句看一下是否啟動(dòng)成功:
docker ps
結(jié)果如圖:

ElasticSearch6.5.0單節(jié)點(diǎn)版已經(jīng)構(gòu)建完成,為了方便后續(xù)操作,需要修改一個(gè)ElasticSearch的命名,輸入命令docker exec -it es /bin/bash進(jìn)入容器文件目錄,輸入vi config/elasticsearch.yml進(jìn)入ElasticSearch配置文件,修改cluster.name的值,筆者這里修改為CollectorDBCluster,修改完成后,保存當(dāng)前修改,輸入exit退出容器文件目錄,輸入docker restart es重啟當(dāng)前容器,在瀏覽器輸入http://192.168.44.128:9200/,看到如下信息可以證明ElasticSearch6.5.0單節(jié)點(diǎn)版已經(jīng)在正常的運(yùn)行了。
{"name":"V-N2_ZQ","cluster_name":"CollectorDBCluster","cluster_uuid":"r9bFZ90WRyqSpMz80u61Yg","version": {"number":"6.5.0","build_flavor":"default","build_type":"tar","build_hash":"816e6f6","build_date":"2018-11-09T18:58:36.352602Z","build_snapshot":false,"lucene_version":"7.5.0","minimum_wire_compatibility_version":"5.6.0","minimum_index_compatibility_version":"5.0.0"},"tagline":"You Know, for Search"}
Skywalking構(gòu)建,進(jìn)入Skywalking官網(wǎng),進(jìn)入下載頁(yè)面(http://skywalking.apache.org/downloads/?),如圖:

因?yàn)槲覀兪且贑entOS上運(yùn)行,所以這里選擇Linux二進(jìn)制版,就是已經(jīng)編譯好的版本,無(wú)需我們自己編譯,下載至我們的CentOS后,解壓可以看到目錄結(jié)構(gòu),如圖:

agent:探針相關(guān),后面會(huì)做更加詳細(xì)的介紹。
bin:這里放的是oapService和webappService的啟動(dòng)腳本,當(dāng)然也有執(zhí)行兩個(gè)腳本的合并腳本startup.sh。
config:這里主要存放的是collector的配置信息,我們需要修改這里的application.yml中的有關(guān)ElasticSearch的配置,如下圖:

修改storage.elasticsearch.nameSpace為我們前面構(gòu)建ElasticSearch設(shè)置的cluster.name,筆者這里的值為CollectorDBCluster,同時(shí)修改storage.elasticsearch.clusterNodes為我們當(dāng)前構(gòu)建的ElasticSearch的地址。
logs:存放collector和webapp-ui生成的日志。
webapp:這里存放的是Skywalking展示UI的jar和配置文件。
Skywalking中默認(rèn)使用的端口有8080、11800、12800,請(qǐng)保證這些端口未被占用,如需修改,可以修改config目錄中的application.yml和webapp目錄中的webapp.yml。
接下來(lái)啟動(dòng)collector和webapp-ui,進(jìn)入bin目錄中,執(zhí)行命令./startup.sh,如:

打開(kāi)瀏覽器訪(fǎng)問(wèn)http://192.168.44.128:8080/,可以看到webapp-ui的儀表盤(pán),如圖:

Skywalking部署到這里就結(jié)束了,下面我們開(kāi)始介紹Spring Cloud如何與Skywalking整合使用。
5.2 Spring Cloud整合Skywalking實(shí)戰(zhàn)
先簡(jiǎn)單介紹一下案例內(nèi)容,我們將創(chuàng)建4個(gè)工程,分別為Zuul-Service、Eureka-Service、Consumer-Service和Provider-Service,請(qǐng)求通過(guò)Zuul-Service訪(fǎng)問(wèn)至Consumer-Service再訪(fǎng)問(wèn)至Provider-Service完成一次鏈路調(diào)用。
整體架構(gòu)圖如圖:

具體實(shí)現(xiàn)代碼列出,各位讀者可以參考GitHub倉(cāng)庫(kù)(https://github.com/meteor1993/SpringCloudLearning/tree/master/chapter15),下面我們介紹Spring?Cloud是如何與Skywalking整合的。
這里我們需要使用到Skywalking的探針agent,我們?cè)诠こ蘡hapter15的跟目錄中新建一個(gè)文件夾,命名為skywalking,講剛才解壓的Skywalking中的agent整個(gè)文件夾copy到skywalking,這里我們啟動(dòng)時(shí)只需要配置javaagen命令加載agent探針即可,在idea中使用需要修改啟動(dòng)配置,點(diǎn)擊右上角的Edit Configurations...,在打開(kāi)的窗口中選擇Environment->VM Options,配置如下腳本:
-javaagent:D:\Development\SpringCloudLearning\chapter15\skywalking\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=zuul-service
-Dskywalking.collector.backend_service=192.168.44.128:11800
如圖:

還可以使用java -jar的方式來(lái)加載agent探針,我們將整個(gè)maven項(xiàng)目打包,運(yùn)行mvn install的命令,使用java -jar的方式來(lái)啟動(dòng),啟動(dòng)命令中增加啟動(dòng)參數(shù),如下:
-javaagent:D:\Development\SpringCloudLearning\chapter15\skywalking\agent\skywalking-agent.jar -Dskywalking.agent.service_name=consumer-service -Dskywalking.collector.backend_service=192.168.44.128:11800 -jar zuul-0.0.1-SNAPSHOT.jar
順次啟動(dòng)四個(gè)工程后,使用瀏覽器訪(fǎng)問(wèn):http://localhost:8080/client/hello?name=spring,多刷新幾次后,我們?cè)偈褂脼g覽器訪(fǎng)問(wèn)http://192.168.44.128:8080/,如:

all_heatmap:所有服務(wù)響應(yīng)時(shí)間的熱點(diǎn)圖
all_p99:所有服務(wù)響應(yīng)時(shí)間的 p99 值
點(diǎn)擊上邊欄的拓?fù)鋱D,可以看到當(dāng)前我們工程的一個(gè)依賴(lài)拓?fù)潢P(guān)系,如:

點(diǎn)擊上邊欄的追蹤,可以看到左邊是當(dāng)前所有的訪(fǎng)問(wèn)請(qǐng)求,隨便點(diǎn)擊一個(gè),可以在右邊看到一個(gè)詳細(xì)的鏈路追蹤過(guò)程,如:

點(diǎn)擊鏈路,可以看到一些標(biāo)記信息,包含端點(diǎn)、跨度類(lèi)型、成功還是失敗,以及一些Exception信息,如圖:

點(diǎn)擊儀表盤(pán)頁(yè)面的Service,可以看到一些服務(wù)相關(guān)的信息,如平均響應(yīng)時(shí)間、平均吞吐量、平均時(shí)延統(tǒng)計(jì),如圖:

service_instance_sla:服務(wù)實(shí)例的成功率
service_instance_resp_time:服務(wù)實(shí)例的平均響應(yīng)時(shí)間
service_instance_cpm:服務(wù)實(shí)例每分鐘調(diào)用次數(shù)
點(diǎn)擊儀表盤(pán)頁(yè)面的Endpoint,可以看到一些端點(diǎn)相關(guān)的信息,如圖:

endpoint_cpm:端點(diǎn)每分鐘調(diào)用次數(shù)
endpoint_avg:端點(diǎn)平均響應(yīng)時(shí)間
endpoint_sla:端點(diǎn)成功率
endpoint_p99:端點(diǎn)響應(yīng)時(shí)間的 p99 值
點(diǎn)擊儀表盤(pán)頁(yè)面的Instance,可以看到一些JVM相關(guān)的信息,如圖:

至此,Spring Cloud與Skywalking的介紹就結(jié)束了,感興趣的朋友可以前往Github的官方網(wǎng)站進(jìn)行查詢(xún)。
6. 小結(jié)
這里總結(jié)一下整個(gè)案例的啟動(dòng)順序:
啟動(dòng)ElasticSearch
啟動(dòng)collector
啟動(dòng)web-ui(或者使用整合腳本啟動(dòng))
啟動(dòng)Agent(Eureka、provider、consumer、zuul)
應(yīng)用調(diào)用
訪(fǎng)問(wèn)web-ui查看統(tǒng)計(jì)信息
以上啟動(dòng)順序供各位讀者參考,請(qǐng)各位讀者最好按照以上順序啟動(dòng),因?yàn)椴煌慕M件之前其實(shí)是有相互依賴(lài)關(guān)系的,如果隨意更改啟動(dòng)順序可能會(huì)造成某些未知問(wèn)題。