sleuth和zipkin微服務里的鏈路跟蹤


分布式鏈路跟蹤介紹

對於一個微服務系統,大多數來自外部的請求都會經過數個服務的互相調用,得到返回的結果,一旦結果回復較慢或者返回了不可用,我們就需要確定是哪個微服務出了問題。於是就有了分布式系統調用跟蹤的誕生。

現今業界分布式服務跟蹤的理論基礎主要來自於 Google 的一篇論文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,使用最為廣泛的開源實現是 Twitter 的 Zipkin,為了實現平台無關、廠商無關的分布式服務跟蹤,CNCF 發布了布式服務跟蹤標准 Open Tracing。國內,淘寶的“鷹眼”、京東的“Hydra”、大眾點評的“CAT”、新浪的“Watchman”、唯品會的“Microscope”、窩窩網的“Tracing”都是這樣的系統。

Spring Cloud Sleuth 介紹

一般的,一個分布式服務跟蹤系統,主要有三部分:數據收集、數據存儲和數據展示。根據系統大小不同,每一部分的結構又有一定變化。譬如,對於大規模分布式系統,數據存儲可分為實時數據和全量數據兩部分,實時數據用於故障排查(troubleshooting),全量數據用於系統優化;數據收集除了支持平台無關和開發語言無關系統的數據收集,還包括異步數據收集(需要跟蹤隊列中的消息,保證調用的連貫性),以及確保更小的侵入性;數據展示又涉及到數據挖掘和分析。雖然每一部分都可能變得很復雜,但基本原理都類似。

功能

Spring Cloud Sleuth為服務之間調用提供鏈路追蹤。Sleuth可以幫助我們:

  • 耗時分析: 通過Sleuth可以很方便的了解到每個采樣請求的耗時,從而分析出哪些服務調用比較耗時;
  • 可視化錯誤: 對於程序未捕捉的異常,可以通過集成Zipkin服務界面上看到;
  • 鏈路優化: 對於調用比較頻繁的服務,可以針對這些服務實施一些優化措施。

Spring Cloud Sleuth的組成

  • trace:從客戶發起請求(request)抵達被追蹤系統的邊界開始,到被追蹤系統向客戶返回響應(response)為止的過程.包含一系列的span,它們組成了一個樹型結構

  • span: 每個 trace中會調用若干個服務,為了記錄調用了哪些服務,以及每次調用的消耗時間等信息,在每次調用服務時,埋入一個調用記錄,稱為一個“span”。Span是基本的工作單元。Span包括一個64位的唯一ID,一個64位trace碼,描述信息,時間戳事件,key-value 注解(tags),span處理者的ID(通常為IP)。
    最開始的初始Span稱為根span,此span中span id和 trace id值相同。

  • Annotation: 用於及時記錄存在的事件。常用的Annotation如下

    • cs - Client Sent:客戶端發送一個請求,表示span的開始
    • sr - Server Received:服務端接收請求並開始處理它。(sr-cs)等於網絡的延遲
    • ss - Server Sent:服務端處理請求完成,開始返回結束給服務端。(ss-sr)表示服務端處理請求的時間
    • cr - Client Received:客戶端完成接受返回結果,此時span結束。(cr-sr)表示客戶端接收服務端數據的時間

ZipKin介紹

spring cloud sleuth可以結合zipkin,將信息發送到zipkin,利用zipkin的存儲來存儲信息,利用zipkin ui來展示數據。

Zipkin 是一個開放源代碼分布式的跟蹤系統,由Twitter公司開源,它致力於收集服務的定時數據,以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展現。

每個服務向zipkin報告計時數據,zipkin會根據調用關系通過Zipkin UI生成依賴關系圖,顯示了多少跟蹤請求通過每個服務,該系統讓開發者可通過一個 Web 前端輕松的收集和分析數據,例如用戶每次請求服務的處理時間等,可方便的監測系統中存在的瓶頸。

Zipkin提供了可插拔數據存儲方式:In-Memory、MySql、Cassandra以及Elasticsearch。接下來的測試為方便直接采用In-Memory方式進行存儲,生產推薦Elasticsearch。

spring cloud sleuth結合zipkin

在使用 Spring Boot 2.x 版本后,官方就不推薦自行定制編譯了,讓我們直接使用編譯好的 jar 包.也就是說原來通過@EnableZipkinServer或@EnableZipkinStreamServer的路子,啟動SpringBootApplication自建Zipkin Server是不行了

安裝和部署zipkin

官方提供了一鍵腳本

curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar

如果用 Docker 的話,直接

docker run -d -p 9411:9411 openzipkin/zipkin

訪問 http://localhost:9411/zipkin/

添加zipkin的支持

<!--分布式鏈路追蹤-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

配置文件

spring:
    sleuth:
        web:
          client:
            enabled: true
        sampler:
          probability: 1.0 # 將采樣比例設置為 1.0,也就是全部都需要。默認是 0.1
      zipkin:
        base-url: http://localhost:9411/ # 指定了 Zipkin 服務器的地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM