跟我學SpringCloud | 第十五篇:微服務利劍之APM平臺(一)Skywalking
目錄
- SpringCloud系列教程 | 第十五篇:微服務利劍之APM平臺(一)Skywalking
- 1. Skywalking概述
- 2. Skywalking主要功能
- 3. Skywalking主要特性
- 4. Skywalking架構簡介
- 5. Spring Cloud與Skywalking實戰
- 5.1 Skywalking部署構建
- 5.2 Spring Cloud整合Skywalking實戰
- 6. 小結
SpringCloud系列教程 | 第十五篇:微服務利劍之APM平臺(一)Skywalking
Springboot: 2.1.7.RELEASE
SpringCloud: Greenwich.SR2
1. Skywalking概述
Skywalking與2016年11月2日由國人吳晟在Github上傳v1.0版本,用於提供分散式鏈路追蹤功能,從5.x開始,成為一個功能較為完善的APM(Application Performance Management)系統,2019年4月17日從Apache孵化器畢業,正式成為Apache頂級專案。提供分散式追蹤、服務網格遙測分析、度量聚合和視覺化一體化解決方案。官方對自己介紹是專為微服務,雲原生和基於容器(Docker,Kubernetes,Mesos)架構而設計。
2. Skywalking主要功能
- 服務,服務例項,端點指標分析
- 根本原因分析
- 服務拓撲圖分析
- 服務,服務例項和端點依賴性分析
- 慢服務檢測
- 效能優化
- 分散式跟蹤和上下文傳播
- 資料庫訪問指標、檢測慢速資料庫訪問語句(包括SQL)
- 告警
3. Skywalking主要特性
- 多種監控手段,語言探針和service mesh
- 多語言自動探針,Java,.NET Core和Node.JS
- 多種後端儲存支援
- 輕量高效
- 模組化,UI、儲存、叢集管理多種機制可選
- 支援告警
- 優秀的視覺化方案
4. Skywalking架構簡介
先看一下官方提供的架構圖,如圖:
Skywalking總體由四個部分agent
collector
、webapp-ui
、storage
組成。圖10-11從上到下是應用層接入,可以使用無入侵性的agent
探針接入,通過HTTP或者gRPC講資料傳送至Skywalking分析平臺collector
,collector
對接受到的資料進行聚合分析,最後儲存至storage
中,這裡支援多種儲存方式,比較常用的有H2和ElasticSearch,最後可以由webapp-ui
對所有的資料進行展示。
5. Spring Cloud與Skywalking實戰
5.1 Skywalking部署構建
在介紹實戰之前,我們先簡單介紹一下Skywalking部署構建方案。
這裡儲存方式筆者選擇使用ElasticSearch,具體版本是6.5.0,ElasticSearch的構建方式選擇使用Docker,直接使用Linux搭建有點複雜,不適合初學者,使用Docker構建簡單方便。
筆者構建的一些前置條件:
java:1.8
CentOS:7.6
如果當前CentOS上沒有Docker環境,可以使用下面的語句快速構建:
yum install docker
當構建成功後,可以使用下面的語句檢視當前Docker的版本:
docker -v
筆者這裡的輸出是:
Docker version 1.13.1, build 7f2769b/1.13.1
安裝好Docker以後,最好配置一下國內的映象站,否則在網路不好的情況下可能出現Docker下載失敗等情況,可以使用下面的語句來修改映象地址:
vi /etc/docker/daemon.json
筆者這裡使用的是阿里雲的映象加速,如下:
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
各位讀者可以自己去阿里雲上開通自己的映象加速,具體不多做介紹。
使用Docker構建ElasticSearch6.5.0,首先,需要下載ElasticSearch6.5.0的映象,輸入以下命令:
docker pull elasticsearch:6.5.0
等待程式下載完成,完成後就可以啟動映象了,命令如下:
docker run -d --restart=always --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.5.0
ElasticSearch的預設啟動記憶體是1g,如果當前伺服器的記憶體不足1g,可以使用引數-e ES_JAVA_OPTS="-Xms256m -Xmx256m"
限制ElasticSearch的啟動記憶體大小,完整的語句如下:
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
啟動成功以後可以使用如下語句看一下是否啟動成功:
docker ps
結果如圖:
ElasticSearch6.5.0單節點版已經構建完成,為了方便後續操作,需要修改一個ElasticSearch的命名,輸入命令docker exec -it es /bin/bash
進入容器檔案目錄,輸入vi config/elasticsearch.yml
進入ElasticSearch配置檔案,修改cluster.name
的值,筆者這裡修改為CollectorDBCluster
,修改完成後,儲存當前修改,輸入exit
退出容器檔案目錄,輸入docker restart es
重啟當前容器,在瀏覽器輸入http://192.168.44.128:9200/,看到如下資訊可以證明ElasticSearch6.5.0單節點版已經在正常的運行了。
{
"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構建,進入Skywalking官網,進入下載頁面(http://skywalking.apache.org/downloads/ ),如圖:
因為我們是要在CentOS上執行,所以這裡選擇Linux二進位制版,就是已經編譯好的版本,無需我們自己編譯,下載至我們的CentOS後,解壓可以看到目錄結構,如圖:
- agent:探針相關,後面會做更加詳細的介紹。
- bin:這裡放的是oapService和webappService的啟動指令碼,當然也有執行兩個指令碼的合併指令碼
startup.sh
。 - config:這裡主要存放的是collector的配置資訊,我們需要修改這裡的application.yml中的有關ElasticSearch的配置,如下圖:
修改storage.elasticsearch.nameSpace
為我們前面構建ElasticSearch設定的cluster.name
,筆者這裡的值為CollectorDBCluster
,同時修改storage.elasticsearch.clusterNodes
為我們當前構建的ElasticSearch的地址。
- logs:存放collector和webapp-ui生成的日誌。
- webapp:這裡存放的是Skywalking展示UI的jar和配置檔案。
Skywalking中預設使用的埠有8080、11800、12800,請保證這些埠未被佔用,如需修改,可以修改config
目錄中的application.yml
和webapp
目錄中的webapp.yml
。
接下來啟動collector和webapp-ui,進入bin目錄中,執行命令./startup.sh
,如:
開啟瀏覽器訪問http://192.168.44.128:8080/,可以看到webapp-ui的儀表盤,如圖:
Skywalking部署到這裡就結束了,下面我們開始介紹Spring Cloud如何與Skywalking整合使用。
5.2 Spring Cloud整合Skywalking實戰
先簡單介紹一下案例內容,我們將建立4個工程,分別為Zuul-Service、Eureka-Service、Consumer-Service和Provider-Service,請求通過Zuul-Service訪問至Consumer-Service再訪問至Provider-Service完成一次鏈路呼叫。
整體架構圖如圖:
具體實現程式碼列出,各位讀者可以參考GitHub倉庫(https://github.com/meteor1993/SpringCloudLearning/tree/master/chapter15),下面我們介紹Spring Cloud是如何與Skywalking整合的。
這裡我們需要使用到Skywalking的探針agent,我們在工程chapter15的跟目錄中新建一個資料夾,命名為skywalking
,講剛才解壓的Skywalking中的agent整個資料夾copy到skywalking
,這裡我們啟動時只需要配置javaagen命令載入agent探針即可,在idea中使用需要修改啟動配置,點選右上角的Edit Configurations...
,在開啟的視窗中選擇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的方式來載入agent探針,我們將整個maven專案打包,執行mvn install的命令,使用java -jar的方式來啟動,啟動命令中增加啟動引數,如下:
-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
順次啟動四個工程後,使用瀏覽器訪問:http://localhost:8080/client/hello?name=spring,多重新整理幾次後,我們再使用瀏覽器訪問http://192.168.44.128:8080/,如:
- all_heatmap:所有服務響應時間的熱點圖
- all_p99:所有服務響應時間的 p99 值
點選上邊欄的拓撲圖,可以看到當前我們工程的一個依賴拓撲關係,如:
點選上邊欄的追蹤,可以看到左邊是當前所有的訪問請求,隨便點選一個,可以在右邊看到一個詳細的鏈路追蹤過程,如:
點選鏈路,可以看到一些標記資訊,包含端點、跨度型別、成功還是失敗,以及一些Exception資訊,如圖:
點選儀表盤頁面的Service,可以看到一些服務相關的資訊,如平均響應時間、平均吞吐量、平均時延統計,如圖:
- service_instance_sla:服務例項的成功率
- service_instance_resp_time:服務例項的平均響應時間
- service_instance_cpm:服務例項每分鐘呼叫次數
點選儀表盤頁面的Endpoint,可以看到一些端點相關的資訊,如圖:
- endpoint_cpm:端點每分鐘呼叫次數
- endpoint_avg:端點平均響應時間
- endpoint_sla:端點成功率
- endpoint_p99:端點響應時間的 p99 值
點選儀表盤頁面的Instance,可以看到一些JVM相關的資訊,如圖:
至此,Spring Cloud與Skywalking的介紹就結束了,感興趣的朋友可以前往Github的官方網站進行查詢。
6. 小結
這裡總結一下整個案例的啟動順序:
- 啟動ElasticSearch
- 啟動collector
- 啟動web-ui(或者使用整合指令碼啟動)
- 啟動Agent(Eureka、provider、consumer、zuul)
- 應用呼叫
- 訪問web-ui檢視統計資訊
以上啟動順序供各位讀者參考,請各位讀者最好按照以上順序啟動,因為不同的元件之前其實是有相互依賴關係的,如果隨意更改啟動順序可能會造成某些未知問