SpringCloud組件之sleuth和zipKin的使用


聲明:本文根據魯班學院商鞅老師課程文檔整理得來

幫助:本文涉及到的詳細代碼請參考:https://github.com/LoveWK/mySpringCloud.git

sleuth的介紹:

  spring Cloud Sleuth為 spring Cloud提供了分布式跟蹤的解決方案,它大量借用了Google Dapper、 Twitter Zipkin和 Apache HTrace的設計,先來了解一下 Sleuth的術語, Sleuth借用了 Dapper的術語。

  span(跨度):基本工作單元。 span用一個64位的id唯一標識。除ID外,span還包含其他數據,例如描述、時間戳事件、鍵值對的注解(標簽), spanID、span父 ID等。 span被啟動和停止時,記錄了時間信息。初始化 span被稱為"rootspan",該 span的 id和 trace的 ID相等。

  trace(跟蹤):一組共享"rootspan"的 span組成的樹狀結構稱為 traceo trac也用一個64位的 ID唯一標識, trace中的所有 span都共享該 trace的 ID

  annotation(標注): annotation用來記錄事件的存在,其中,核心annotation用來定義請求的開始和結束。

  CS( Client sent客戶端發送):客戶端發起一個請求,該 annotation描述了span的開 始。 

  SR( server Received服務器端接收):服務器端獲得請求並准備處理它。如果用 SR減去 CS時間戳,就能得到網絡延遲。c) 

  SS( server sent服務器端發送):該 annotation表明完成請求處理(當響應發回客戶端時)。如果用 SS減去 SR時間戳,就能得到服務器端處理請求所需的時間。

  CR( Client Received客戶端接收): span結束的標識。客戶端成功接收到服務器端的響應。如果 CR減去 CS時間戳,就能得到從客戶端發送請求到服務器響應的所需的時間

  Spring Cloud Sleuth可以追蹤10種類型的組件:async、Hystrix,messaging,websocket,rxjava,scheduling,web(Spring MVC Controller,Servlet),webclient(Spring RestTemplate)、Feign、Zuul

  下面我們通過一張圖來看一下一個簡單的微服務調用鏈:

  

  這張圖是spring cloud 官方給出的示例圖

  圖片詳細講了我們上文所說的概念在調用鏈中 處於什么狀態以及改變

sleuth整合Zipkin實現分布式鏈路跟蹤:

  Zipkin簡介:

    Zipkin是 Twitter開源的分布式跟蹤系統,基於 Dapper的論文設計而來。它的主要功能是收集系統的時序數據,從而追蹤微服務架構的系統延時等問題。 Zipkin還提供了一個非常友好的界面,來幫助分析追蹤數據。

  為什么要使用Zipkin

    因為sleuth對於分布式鏈路的跟蹤僅僅是一些數據的記錄, 這些數據我們人為來讀取和處理難免會太麻煩了,所以我們一般吧這種數據上交給Zipkin Server 來統一處理.

  怎么使用ZipKin?

    首先編寫一個Zipkin Server

     我們創建一個新的module,引入相關依賴。

<dependencies>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>2.8.4</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>2.8.4</version>
        </dependency>
    </dependencies>

  

   然后寫啟動類,並在啟動類上加上@EnableZipkinServer注解

  

   填寫配置信息

management:
  metrics:
    web:
      server:
        autoTimeRequests: false
server:
  port: 9000

  

   注意:

     在zipkin2.7.x以后便不支持自定義服務器需要使用官方的版本或者Docker 但是如果還是要使用的話就得加上這個配置。

  完成上面的步驟之后,我們啟動項目,然后訪問/zipkin/

  

   到這里,我們的ZipKin server就搭建完成了。

  這是用來查詢分布式鏈路數據的頁面, 這里列出了查詢條件, 從第一行開始從左到右分別是:

     微服務名稱(就是你配置文件里面的application name) ,

    span(即上文所解釋的)名稱 ,

    時間段 ,

    自定義查詢條件,

    一次調用鏈的持續時間,

    一頁數量,

    排序規則

sleuth微服務整合Zipkin

  首先在我們的微服務中加入相關依賴,我們需要依賴sleuth 和 sleuth與zipkin的整合依賴:

<!--sleuth 和 sleuth與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>

  

  然后在我們的微服務中加入以下配置:

spring:
    zipkin:
      base-url: http://localhost:9000  #指定Zipkin server地址
    sleuth:
      sampler:
        probability: 1.0  #request采樣的數量 默認是0.1 也即是10% 顧名思義 采取10%的請求數據 因為在分布式系統中,數據量可能會非常大,因此采樣非常重要。我們示例數據少最好配置為1全采樣

  

   power微服務一樣的配置即可:

  

   然后啟動微服務並模擬一次調用鏈 我這里是用user 微服務調用了power微服務 (注意,每個微服務都需要和zipkin整合)

  調用完成之后 我們去zipkin server 頁面去看看:

  首先通過user微服務調用power微服務:

  

   然后我們去zipkin server 頁面去看看:

  

   點擊查看詳細信息:

  

zipkin server 數據持久化問題

  剛剛我們介紹了如何把分布式鏈路調用信息上傳到 zipkin server 但是 有一個問題:當zipkin重啟后我們的分布式鏈路數據全部清空了。

  因為zipkin server 默認數據是存儲在內存當中, 所以當你服務重啟之后內存自然而然也就清空了。

使用Elasticsearch 做數據持久化

  我們這里借用ES來做數據持久化, 當然 還可以用ELK來做, 我們這里演示ES

  Elasticsearch 下載地址:https://www.elastic.co/cn/downloads/elasticsearch

  下載完是個壓縮包 解壓出來 打開bin目錄 找到elasticsearch.bat文件啟動

  

   等他啟動一會兒然后在頁面上輸入localhost:9200看見如下信息說明Elasticsearch 啟動好了:

  

   

zipkin 與 Elasticsearch整合:

  首先 我們在我們的zipkin server里面引入依賴

  <dependency>
          <groupId>io.zipkin.java</groupId>
          <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
          <version>2.3.1</version>
    </dependency>

  

   然后在yml加入配置:

zipkin:
  storage:
    type: elasticsearch
    elasticsearch:
      cluster: elasticsearch
      hosts: http://localhost:9200
      index: zipkin

  

   至此 zipkin的數據便和Elasticsearch整合起來了,現在再啟動zipkin server 並且存儲幾條數據, 就算重啟, 數據還會在上面。

微服務總結

  

 

   由上圖可以發現, spring cloud 把各個組件相互配合起來, 整合成一套成熟的微服務架構體系

  其中, 由eureka做服務注冊與發現,很好的把各個服務鏈接起來

  ribbon+fegin提供了微服務的調用和負載均衡解決方案

  hystrix 負責監控微服務之間的調用情況,以及降級和熔斷保護

  Hystrix dashboard監控Hystrix的熔斷情況以及監控信息以圖形化界面展示

  spring cloud config 提供了統一的配置中心服務

  所有外來的請求由zuul統一進行路由和轉發,起到了API網關的作用

  Sleuth+Zipkin把我們微服務的追蹤數據記錄下來並展示方便我們進行后續分析

 


免責聲明!

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



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