分散式/微服務必配APM系統,SkyWalking讓你不迷路

Code綜藝圈 發表於 2021-10-19
微服務

前言

如今分散式、微服務盛行,面對拆分服務比較多的系統,如果線上出現異常,需要快速定位到異常服務節點,假如還用傳統的方式排查肯定效率是極低的,因為服務之間的各種通訊會讓定位更加繁瑣;所以就急需一個分散式鏈路追蹤系統,方便快速定位異常節點,從而針對性的處理問題。比較主流的APM(Application Performance Management)系統有SkyWalking、Zipkin、PinPoint、Cat等,這裡就先說說SkyWalking,其他的後續再補上。

APM系統當然不僅僅只是鏈路追蹤,還可以根據各種效能指標分析應用程式及其執行環境,以便在發生故障的時候能快速定位及解決問題。

正文

1. SkyWalking簡介

SkyWalking 是一個開源可觀察性平臺,用於收集、分析、聚合和視覺化來自服務和雲原生基礎設施(如資料庫)的資料,它還提供了優秀的視覺化介面。SkyWalking 也是一種現代 APM,專為雲原生、基於容器的分散式系統而設計

1.1 常用術語

在SkyWalking中會經常提到服務、服務例項和端點,這裡就先來了解一下:

  • 服務:通俗一點理解就是一個應用程式;比如訂單服務API。
  • 服務例項:服務組中每個單獨執行的節點稱為一個例項,一個服務可以對應多個服務例項(叢集); 如:一個訂單服務可以叢集部署好幾個節點,這些節點就稱為服務例項;
  • 端點:請求服務的路徑,如:Http Url地址或是gRPC請求地址(gRPC定義的服務類+方法名);

通俗理解,如下圖:

image-20211017150128936

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;

接下來如果能訪問暴露的埠就代表環境安裝好了,如下:

image-20211017223823456

到這環境就搞好了,剩下就是專案整合了,以下還是搞兩個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開發的探針。

image-20211017234545199

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檔案,可以適當根據需要更改配置內容;

image-20211017235744495

預設情況下skyapm.json檔案只要更新都會複製到打包目錄下,保險起見,可以右鍵->屬性,將這個檔案設定其為始終複製或如果較新則複製。

image-20211018154627526

3.5 啟動專案看效果

SkyWalking幾乎不嵌入任何程式碼,直接執行程式碼,現在就可以將API服務進行跟蹤和監控了。如下圖:

image-20211018000200664

看看SkyWalking介面展示:

image-20211018000443510

可以進入追蹤介面看具體請求資訊:

image-20211018000842437

注:條件時間注意時區,往前設定時間; 其實這裡可以在啟動搭建環境的時候設定時區。

點選樹形的請求可以看詳情:

image-20211018001103437

3.6 多加一個API服務,測測呼叫鏈

新建一個專案SkyWalkingDemoTest22222,埠以5100啟動,其他不變;這裡沒有整合SkyWalking,如果需要往下監控,同以上步驟整合即可;

然後簡單修改一下SkyWalkingDemoTest專案的介面,如下:

image-20211018004126167

先執行SkyWalkingDemoTest22222,再執行SkyWalkingDemoTest,執行完成之後,可以去SkyWalking介面中看看追蹤資訊,如下:

image-20211018004315459

也可以通過拓撲圖看到效果:

image-20211018004813883

點選對應的節點還能顯示對應的指標資料。

參考地址:

程式碼案例地址:https://gitee.com/CodeZoe/microservies-demo/tree/main/SkyWalkingDemo

總結

關於SkyWalking的初體驗先說這麼多,對於服務間通訊複雜的系統,有了這個是不是就清晰多了,定位也就容易很多。下一篇再來看看資料庫的指標及如何配置告警,關注“Code綜藝圈”,和我一起學習吧;