前言
如今分散式、微服務盛行,面對拆分服務比較多的系統,如果線上出現異常,需要快速定位到異常服務節點,假如還用傳統的方式排查肯定效率是極低的,因為服務之間的各種通訊會讓定位更加繁瑣;所以就急需一個分散式鏈路追蹤系統,方便快速定位異常節點,從而針對性的處理問題。比較主流的APM(Application Performance Management)系統有SkyWalking、Zipkin、PinPoint、Cat等,這裡就先說說SkyWalking,其他的後續再補上。
APM系統當然不僅僅只是鏈路追蹤,還可以根據各種效能指標分析應用程式及其執行環境,以便在發生故障的時候能快速定位及解決問題。
正文
1. SkyWalking簡介
SkyWalking 是一個開源可觀察性平臺,用於收集、分析、聚合和視覺化來自服務和雲原生基礎設施(如資料庫)的資料,它還提供了優秀的視覺化介面。SkyWalking 也是一種現代 APM,專為雲原生、基於容器的分散式系統而設計。
1.1 常用術語
在SkyWalking中會經常提到服務、服務例項和端點,這裡就先來了解一下:
- 服務:通俗一點理解就是一個應用程式;比如訂單服務API。
- 服務例項:服務組中每個單獨執行的節點稱為一個例項,一個服務可以對應多個服務例項(叢集); 如:一個訂單服務可以叢集部署好幾個節點,這些節點就稱為服務例項;
- 端點:請求服務的路徑,如:Http Url地址或是gRPC請求地址(gRPC定義的服務類+方法名);
通俗理解,如下圖:
1.2 理解架構
SkyWalking 主要分為四個部分:探針、平臺後端、儲存和 UI,如下圖:
- 探針:專門用於收集資料,並按照SkyWalking的要求格式化對應的資料。
- 平臺後端:對收集來的資料進行聚合、分析及流處理;
- 儲存:就是資料庫,將收集的資料儲存起來,方便隨時檢視和分析;主流的資料庫有 ElasticSearch、H2、MySQL、TiDB、InfluxDB等。一般我們會使用ElasticSearch,查詢速度槓槓滴。
- UI:就是提供一個Web介面,可以很方便的檢視和分析資料,各種圖表形式展示。
理論暫時瞭解這麼多,實操一下更容易理解。
2. 安裝
這裡就採用Docker的方式進行安裝,方便快捷,如果還有小夥伴對Docker不是很瞭解的,可以看看我整理的Docker系列分享。
2.1 安裝ElasticSearch
這裡用到的儲存是ElasticSearch,需要提前安裝,執行如下命令:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 --restart always -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx521m" elasticsearch:6.7.2
命令解析:
- -p 9200:9200 -p 9300:9300 分別讓主機埠9200、9300和啟動容器的埠做對映;
- -e "discovery.type=single-node" 單節點執行;
- -e ES_JAVA_OPTS="-Xms64m -Xmx521m" 由於我雲伺服器的記憶體比較小,所以設定了一個環境變數ES_JAVA_OPTS來配置使用的記憶體:最小64m,最大521m,否則記憶體不夠用,啟動不起來。
2.2 安裝SkyWalking的後臺服務端(skywalking-oap),執行如下命令:
docker run --name skywalking-oap --restart always -p 1234:1234 -p 11800:11800 -p 12800:12800 -d --link elasticsearch:elasticsearch -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server:8.3.0-es6
命令解析:
- -p 1234:1234 -p 11800:11800 -p 12800:12800 分別讓主機埠1234、11800、12800和啟動容器的埠做對映; 11800是對接應用程式的; 12800是用來對接SkyWalking的UI資料的。
- --link elasticsearch:elasticsearch 代表和上一步啟動elasticsearch網路連結起來,可以通過容器名訪問對應服務,注意容器名和上一步一致;
- -e SW_STORAGE=elasticsearch 設定SkyWalking的儲存方式為elasticsearch;
- -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 配置連線elasticsearch的地址;
2.3 安裝SkyWalking的UI介面(skywalking-ui),執行如下命令
docker run --name skywalking-ui --restart always -p 8080:8080 --link skywalking-oap:skywalking-oap -d -e SW_OAP_ADDRESS=skywalking-oap:12800 apache/skywalking-ui:6.6.0
命令解析:
- -p 8080:8080 代表主機埠8080和容器埠8080做對映;
- --link skywalking-oap:skywalking-oap 代表和上一步啟動skywalking-oap網路連結起來,可以通過容器名訪問對應服務,注意容器名和上一步一致;
- -e SW_OAP_ADDRESS=skywalking:12800 設定UI呼叫的API地址,就是上一步啟動動SkyWalking後端地址,埠為12800;
接下來如果能訪問暴露的埠就代表環境安裝好了,如下:
到這環境就搞好了,剩下就是專案整合了,以下還是搞兩個API來測試一把。
注: 在搭建環境時要注意elasticsearch、skywalking-oap-server、skywalking-ui版本問題,否則很容易掉坑; 就比如 skywalking-oap-server 設定環境變數SW_STORAGE=
elasticsearch 時,只能連線elasticsearch6 等等這種細節。
3. 專案整合SkyWalking
3.1 先安裝一個SkyWalking命令列工具
這個命令列工具會快速生成配置檔案,執行如下命令安裝:
# 全域性安裝這個工具,後續直接用就行
dotnet tool install -g SkyAPM.DotNet.CLI
安裝一次就行,如果已經安裝,就可以跳過此步驟。
3.2 建立專案,並引入SkyAPM.Agent.AspNetCore包
這個包是專門為.NetCore開發的探針。
3.3 註冊服務,配置環境變數
-
在Startup檔案中註冊服務
-
配置環境變數
這裡方便測試,直接在專案中的launchSettings.json中配置就行,但如果是釋出生產環境,一定要在對應環境配置環境變數。
3.4 執行SkyWalking命令生成配置檔案
在專案根目錄下執行如下命令
dotnet skyapm config MySkyWalkingDemoTest 192.168.xxx.xxx:11800
- MySkyWalkingDemoTest 是服務名;
- 192.168.xxx.xxx:11800 是SkyWalking後臺服務的地址,就是我們2.2步驟搭建的地址。根據真實需要配置IP就行。
命令執行完成後,會在專案根目錄下生成skyapm.json檔案,可以適當根據需要更改配置內容;
預設情況下skyapm.json檔案只要更新都會複製到打包目錄下,保險起見,可以右鍵->屬性,將這個檔案設定其為始終複製或如果較新則複製。
3.5 啟動專案看效果
SkyWalking幾乎不嵌入任何程式碼,直接執行程式碼,現在就可以將API服務進行跟蹤和監控了。如下圖:
看看SkyWalking介面展示:
可以進入追蹤介面看具體請求資訊:
注:條件時間注意時區,往前設定時間; 其實這裡可以在啟動搭建環境的時候設定時區。
點選樹形的請求可以看詳情:
3.6 多加一個API服務,測測呼叫鏈
新建一個專案SkyWalkingDemoTest22222,埠以5100啟動,其他不變;這裡沒有整合SkyWalking,如果需要往下監控,同以上步驟整合即可;
然後簡單修改一下SkyWalkingDemoTest專案的介面,如下:
先執行SkyWalkingDemoTest22222,再執行SkyWalkingDemoTest,執行完成之後,可以去SkyWalking介面中看看追蹤資訊,如下:
也可以通過拓撲圖看到效果:
點選對應的節點還能顯示對應的指標資料。
參考地址:
- 官網:https://skywalking.apache.org/
- 開源地址:https://github.com/apache/skywalking
- .Net探針:https://github.com/SkyAPM/SkyAPM-dotnet
程式碼案例地址:https://gitee.com/CodeZoe/microservies-demo/tree/main/SkyWalkingDemo
總結
關於SkyWalking的初體驗先說這麼多,對於服務間通訊複雜的系統,有了這個是不是就清晰多了,定位也就容易很多。下一篇再來看看資料庫的指標及如何配置告警,關注“Code綜藝圈”,和我一起學習吧;