1. 程式人生 > >springcloud+zipkin實現鏈路監控

springcloud+zipkin實現鏈路監控

轉載:http://ju.outofmemory.cn/entry/350377

Zipkin簡介

Zipkin是 Twitter 的一個 開源專案 ,它基於 Google Dapper實現。我們可以使用它來收集各個 伺服器 上請求鏈路的跟蹤資料,並通過它提供的 REST API 介面來輔助我們查詢跟蹤資料以實現對分散式系統的監控程式,從而及時地發現系統中出現的延遲升高問題並找出系統性能瓶頸的根源。除了面向 開發 的API介面之外,它也提供了方便的 UI 

元件來幫助我們直觀的搜尋跟蹤資訊和分析請求鏈路明細,比如:可以查詢某段時間內各使用者請求的處理時間等。

Spring Cloud構建微服務架構:分散式服務跟蹤(整合zipkin)

上圖展示了Zipkin的基礎架構,它主要有4個核心元件構成:

  • Collector:收集器元件,它主要用於處理從外部系統傳送過來的跟蹤資訊,將這些資訊轉換為Zipkin內部處理的Span格式,以支援後續的儲存、分析、展示等功能。
  • Storage:儲存元件,它主要對處理收集器接收到的跟蹤資訊,預設會將這些資訊儲存在記憶體中,我們也可以修改此儲存策略,通過使用其他儲存元件將跟蹤資訊儲存到 資料庫 中。
  • RESTful API:API元件,它主要用來提供外部訪問介面。比如給客戶端展示跟蹤資訊,或是外接系統訪問以實現監控等。
  • Web UI:UI元件,基於API元件實現的上層應用。通過UI元件使用者可以方便而有直觀地查詢和分析跟蹤資訊。

HTTP收集

在 Spring Cloud Sleuth 中對Zipkin的整合進行了 自動化 配置 的封裝,所以我們可以很輕鬆的引入和使用它,下面我們來詳細介紹一下 Sleuth 與Zipkin的基礎整合過程。主要分為兩步:

第一步:搭建Zipkin Server

建立一個基礎的 Spring Boot 應用,命名為 zipkin -server,並在 

pom .xml中引入Zipkin Server的相關依賴,具體如下:

<parent> 
  <groupId>org.springframework.boot</groupId> 
  <artifactId>spring-boot-starter-parent</artifactId> 
  <version>1.5.10.RELEASE</version> 
  <relativePath/> 
</parent> 
<dependencies> 
  <dependency> 
    <groupId>io.zipkin.java</groupId> 
    <artifactId>zipkin-server</artifactId> 
  </dependency> 
  <dependency> 
    <groupId>io.zipkin.java</groupId> 
    <artifactId>zipkin-autoconfigure-ui</artifactId> 
  </dependency> 
</dependencies> 
<dependencyManagement> 
  <dependencies> 
    <dependency> 
        <groupId>org.springframework.cloud</groupId> 
        <artifactId>spring-cloud-dependencies</artifactId> 
        <version>Dalston.SR5</version> 
        <type>pom</type> 
        <scope>import</scope> 
    </dependency> 
  </dependencies> 
</dependencyManagement> 
  • 建立應用主類Zipkin App li cat ion,使用@EnableZipkinServer註解來啟動Zipkin Server,具體如下:
@EnableZipkinServer 
@SpringBootApplication 
public class ZipkinApplication { 
 
  public static void main(String[] args) { 
    SpringApplication.run(ZipkinApplication.class, args); 
  } 
 
} 
  • 在application.properties中做一些簡單配置,比如:設定 服務端 口號為9411(客戶端整合時候,自動化配置會連線9411 埠 ,所以在服務端設定了埠為9411的話,客戶端可以省去這個配置)。
spring.application.name=zipkin-server 
server.port=9411 

建立完上述工程之後,我們將其啟動起來,並訪問 http ://localhost:9411/,我們可以看到如下圖所示的Zipkin管理頁面:

Spring Cloud構建微服務架構:分散式服務跟蹤(整合zipkin)

第二步:為應用引入和配置Zipkin服務

在完成了Zipkin Server的搭建之後,我們還需要對應用做一些配置,以實現將跟蹤資訊輸出到Zipkin Server。我們以之前實現的trace-1和trace-2為例,對它們做以下改造內容:

  • 在trace-1和trace-2的pom.xml中引入spring-cloud-sleuth-zipkin依賴,具體如下所示。
<dependency> 
  <groupId>org.springframework.cloud</groupId> 
  <artifactId>spring-cloud-sleuth-zipkin</artifactId> 
</dependency> 
  • 在trace-1和trace-2的application.properties中增加Zipkin Server的配置資訊,具體如下所示(如果在zip-server應用中,我們將其埠設定為9411,並且均在本地 除錯 的話,該 引數 也可以不配置,因為預設值就是http://localhost:9411)。
spring.zipkin.base-url=http://localhost:9411 

測試 與分析

到這裡我們已經完成了接入Zipkin Server的所有基本工作,我們可以繼續將eureka-server、trace-1和trace-2啟動起來,然後我們做一些測試實驗,以對它的執行機制有一些初步的理解。

我們先來向trace-1的介面傳送幾個請求:http://localhost:9101/trace-1,當我們在日誌中出現跟蹤資訊的最後一個值為true的時候,說明該跟蹤資訊會輸出給Zipkin Server,所以此時我們可以去Zipkin Server的管理頁面中選擇合適的查詢條件後,點選Find Traces,就可以查詢出剛才在日誌中出現的跟蹤資訊了(也可以根據日誌中的Trace ID,在頁面的右上角輸入框中來搜尋),具體如下頁面所示:

Spring Cloud構建微服務架構:分散式服務跟蹤(整合zipkin)

點選下方trace-1端點的跟蹤資訊,我們還可以得到Sleuth收集到的跟蹤到詳細資訊,其中包括了我們關注的請求時間消耗等。

Spring Cloud構建微服務架構:分散式服務跟蹤(整合zipkin)

點選導航欄中的Dependencies選單,我們還可以檢視Zipkin Server根據跟蹤資訊分析生成的系統請求鏈路依賴關係圖:

Spring Cloud構建微服務架構:分散式服務跟蹤(整合zipkin)

訊息中介軟體收集

Spring Cloud Sleuth在整合Zipkin時,不僅實現了以HTTP的方式收集跟蹤資訊,還實現了通過訊息中介軟體來對跟蹤資訊進行非同步收集的封裝。通過結合Spring Cloud Stream,我們可以非常輕鬆的讓應用客戶端將跟蹤資訊輸出到訊息中介軟體上,同時Zipkin服務端從訊息中介軟體上非同步地消費這些跟蹤資訊。

接下來,我們基於之前實現的trace-1和trace-2應用以及zipkin-server服務端做一些改造,以實現通過訊息中介軟體來收集跟蹤資訊。改造的內容非常簡單,只需要我們做專案依賴和配置檔案做一些調整就能馬上實現,下面我們分別對客戶端和服務端的改造內容做詳細說明:

第一步:修改客戶端trace-1和trace-2

  • 為了讓trace-1和trace-2在產生跟蹤資訊之後,能夠將抽樣記錄輸出到訊息中介軟體中,我們除了需要之前引入的spring-cloud-starter-sleuth依賴之外,還需要引入zipkin對Spring Cloud Stream的擴充套件依賴spring-cloud-sleuth-stream以及基於Spring Cloud Stream實現的訊息中介軟體繫結器依賴,以使用Rabbit MQ 為例,我們可以加入如下依賴:
<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-sleuth-stream</artifactId> 
</dependency> 
 
<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId> 
</dependency> 
  • 在application.properties配置中去掉HTTP方式實現時使用的spring.zipkin.base-url引數,並根據實際部署情況,增加訊息中介軟體的相關配置,比如下面這些關於RabbitMQ的配置資訊:
spring.rabbitmq.host=localhost 
spring.rabbitmq.port=5672 
spring.rabbitmq.username=springcloud 
spring.rabbitmq.password=123456 

第二步:修改zipkin-server服務端

為了讓zipkin-server服務端能夠從訊息中介軟體中獲取跟蹤資訊,我們只需要在pom.xml中引入針對訊息中介軟體收集封裝的服務端依賴spring-cloud-sleuth-zipkin-stream,同時為了支援具體使用的訊息中介軟體,我們還需要引入針對訊息中介軟體的繫結器實現,比如以使用RabbitMQ為例,我們可以在依賴中增加如下內容:

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId> 
</dependency> 
 
<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId> 
</dependency> 
 
<dependency> 
    <groupId>io.zipkin.java</groupId> 
    <artifactId>zipkin-autoconfigure-ui</artifactId> 
</dependency> 

其中,spring-cloud-sleuth-zipkin-stream依賴是實現從訊息中介軟體收集跟蹤資訊的核心封裝,其中包含了用於整合訊息中介軟體的核心依賴、zipkin服務端的核心依賴、以及一些其他通常會被使用的依賴(比如:用於擴充套件資料儲存的依賴、用於支援測試的依賴等)。但是,需要注意的是這個包裡並沒有引入zipkin的前端依賴zipkin-autoconfigure-ui,為了方便使用,我們在這裡也引用了它。

測試與分析

在完成了上述改造內容之後,我們繼續將eureka-server、trace-1和trace-2、zipkin-server都啟動起來,同時確保RabbitMQ也處於執行狀態。此時,我們可以在RabbitMQ的控制頁面中看到一個名為sleuth的交換器,它就是zipkin的訊息中介軟體收集器實現使用的預設主題。

Spring Cloud構建微服務架構:分散式服務跟蹤(整合zipkin)

最後,我們使用之前的驗證方法,通過向trace-1的介面傳送幾個請求:http://localhost:9101/trace-1,當有被抽樣收集的跟蹤資訊時(除錯時我們可以設定AlwaysSampler抽樣機制來讓每個跟蹤資訊都被收集),我們可以在RabbitMQ的控制頁面中發現有訊息被髮送到了sleuth交換器中,同時我們再到zipkin服務端的Web頁面中也能夠搜尋到相應的跟蹤資訊,那麼我們使用訊息中介軟體來收集跟蹤資訊的任務到這裡就完成了。