分佈式 - 微服務必配 APM 系統,SkyWalking 讓你不迷路
前言
如今分佈式、微服務盛行,面對拆分服務比較多的系統,如果線上出現異常,需要快速定位到異常服務節點,假如還用傳統的方式排查肯定效率是極低的,因爲服務之間的各種通信會讓定位更加繁瑣;所以就急需一個分佈式鏈路追蹤系統,方便快速定位異常節點,從而針對性的處理問題。比較主流的 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,如下圖:
img
-
探針:專門用於收集數據,並按照 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 文件中註冊服務
image-20211017235044948
-
配置環境變量
這裏方便測試,直接在項目中的 launchSettings.json 中配置就行,但如果是發佈生產環境,一定要在對應環境配置環境變量。
image-20211017234925741
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 綜藝圈”,和我一起學習吧;
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/hcgGv_p45YDQzOFkjNlGiw