SkyWalking 分佈式追蹤系統

隨着微服務架構的流行,一些微服務架構下的問題也會愈來愈突出,好比一個請求會涉及多個服務,而服務自己可能也會依賴其餘服務,整個請求路徑就構成了一個網狀的調用鏈,而在整個調用鏈中一旦某個節點發生異常,整個調用鏈的穩定性就會受到影響,因此會深深的感覺到 「銀彈」 這個詞是不存在的,每種架構都有其優缺點 。css

service map

面對以上狀況, 咱們就須要一些能夠幫助理解系統行爲、用於分析性能問題的工具,以便發生故障的時候,可以快速定位和解決問題,這時候 APM(應用性能管理)工具就該閃亮登場了。java

目前主要的一些 APM 工具備: Cat、Zipkin、Pinpoint、SkyWalking,這裏主要介紹 SkyWalking ,它是一款優秀的國產 APM 工具,包括了分佈式追蹤、性能指標分析、應用和服務依賴分析等。linux

下面是 SkyWalking 6.x 的架構圖:git

6.x architecture

說明: SkyWalking 的核心是數據分析和度量結果的存儲平臺,經過 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量數據,SkyWalking Collecter 對數據進行分析和聚合,存儲到 Elasticsearch、H二、MySQL、TiDB 等其一便可,最後咱們能夠經過 SkyWalking UI 的可視化界面對最終的結果進行查看。Skywalking 支持從多個來源和多種格式收集數據:多種語言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘測、Envoy 度量等數據格式。github

總體架構看似模塊有點多,但在實際上仍是比較清晰的,主要就是經過收集各類格式的數據進行存儲,而後展現。因此搭建 Skywalking 服務咱們須要關注的是 SkyWalking Collecter、SkyWalking UI 和 存儲設備,SkyWalking Collecter、SkyWalking UI 官方下載安裝包內已包含,最終咱們只需考慮存儲設備便可。web

下面基於 Windows 環境使用 SkyAPM-dotnet 來介紹一下 SkyWalking, SkyAPM-dotnet 是 SkyWalking 的 .NET Agent。apache

環境要求

  1. JDK8+
  2. Elasticsearch 6.x
  3. 8080,10800,11800,12800 端口不被佔用

Elasticsearch下載安裝 參考官方教程, 安裝完成後須要對 config/elasticsearch.yml 作以下修改:json

# 修改
# 若是 cluster.name 不設置爲 CollectorDBCluster ,則須要修改 SkyWalking 的配置文件
cluster.name: CollectorDBCluster network.host: 0.0.0.0 # 增長 thread_pool.bulk.queue_size: 1000 

若是是 linux 環境,Elasticsearch 安裝可能沒有那麼順利,請參考 Linux 環境下安裝 Elasticsearch 5.x、6.x 問題彙總windows

下載 SkyWalking

SkyWalking 我的建議直接下載官方編譯好的,下載地址bash

啓動 SkyWalking

skywalking config

config/application.yml 的默認數據存儲開啓是的 h2,這裏咱們須要修改數據存儲爲 Elasticsearch(在啓動 SkyWalking 以前,確保 Elasticsearch 已啓動

SkyWalking 的啓動包括兩部分,一個是 SkyWalking Collector(oapService) ,一個是 SkyWalking UI(webappService),SkyWalking 解壓後的 bin 目錄:

skywalking bin

bat 爲 windows 環境使用,sh 爲 linux 環境使用,咱們能夠分別啓動 oapService 和 webappService,也能夠經過 startup 一次性所有啓動,從 startup 中的命令能夠知道其實就是分別啓動 oapService 和 webappService。

若是一切順利(不順利請多看幾遍 快速入門),這時候就能夠經過 http://localhost:8080 來查看 SkyWalking UI 了(默認全是0,截圖是測試效果),默認帳號/密碼:admin/admin。

skywalking ui

Java 項目接入

參考 部署 skywalking javaagent,skywalking-agent.jar 位於下載包的 agent 目錄下,具體效果這裏就不測試了

skywalking java agent

.NET 項目接入

這裏以 .NET Core 項目來測試,基於 .NET Framework 的項目目前也是支持的,只是相對不完善一些,參考 SkyAPM-dotnet

  1. 新建一個.NET Core API 項目,安裝 NuGet 包:

    Install-Package SkyAPM.Agent.AspNetCore
  2. 添加項目環境變量(實際狀況應該是在 CI 流程中設置環境變量,參考:https://github.com/SkyAPM/SkyAPM-dotnet#examples

    set ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
    hostingStartupAssemblies
  3. 項目根目錄下添加 skyapm.json 文件(來自官方例子),設置爲 「若是較新則複製」,添加 SkyWalking 的配置信息,更多默認配置參考。(不過從源碼能夠看出其實也不須要建立單獨的 skyapm.json,直接在 appsettings.json 增長 SkyWalking 節點配置也是沒問題的

    { "SkyWalking": { "ServiceName": "WebAPIServiceA", // 服務名 "Transport": { "gRPC": { "Servers": "localhost:11800" // 服務地址 } } } } 
  4. 啓動程序,請求的追蹤結果就會被記錄下來,經過 SkyWalking UI 查看:

    skywalking request log

單個服務的效果並不明顯,看不出請求跨度、鏈路關係,下面是一個多服務的例子(下載源碼),依賴關係圖以下:

service request map

目前 SkyWalking 的 .NET Agent 還不支持 gRPC 的調用跟蹤,整個項目還在不斷的完善中,期待後續更多的進展。根據以上的關係圖搭建好項目後,訪問接口後結果以下:

skywalking spans

一共有4各跨度,先訪問 WenAPIServiceA,而後發送 HttpClient 請求,轉到 WenAPIServiceB,WenAPIServiceB 執行操做 DB 的命令,每一個跨度的耗時一目瞭然。

服務關係的拓撲圖,調用鏈路徑也很是清晰:

skywalking topology map

參考連接

做者:BeckJin 連接:https://www.jianshu.com/p/2fd56627a3cf 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索