1. 程式人生 > >Spring Cloud Sleuth + zipkin 實現服務追蹤

Spring Cloud Sleuth + zipkin 實現服務追蹤

工作 process image -o 唯一id dep 單元 圖片 zipkin

服務追蹤

Spring Cloud Sleuth實現了一種分布式的服務鏈路跟蹤解決方案,通過使用Sleuth可以讓我們快速定位某個服務的問題。

官方文檔地址如下:

http://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.0.1.RELEASE/single/spring-cloud-sleuth.html

一些概念:

  1. Span,Span是基本的工作單元。Span包括一個64位的唯一ID,一個64位trace碼,描述信息,時間戳事件,key-value 註解(tags),span處理者的ID(通常為IP)。
    最開始的初始Span稱為根span,此span中span id和 trace id值相同。

  2. Trance,包含一系列的span,它們組成了一個樹型結構

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

如果一個服務的調用關系如下:

技術分享圖片

那麽此時將Span和Trace在一個系統中使用Zipkin註解的過程圖形化如下:
技術分享圖片

每個顏色的表明一個span(總計7個spans,從A到G),每個span有類似的信息

Trace Id = X
Span Id = D
Client Sent

此span表示span的Trance Id是X,Span Id是D,同時它發送一個Client Sent事件

spans 的parent/child關系圖形化如下:
技術分享圖片


了解完基本的一些概念後,我們來在訂單服務和商品服務中,集成spring cloud sleuth以及zipkin。在兩個服務的pom.xml文件中,增加如下依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

為了更詳細的查看服務通信時的日誌信息,我們將openfeign的日誌級別設置為debug。在兩個項目的配置文件中,加入如下內容即可:

logging:
  level:
    org.springframework.cloud.openfeign: debug

啟動訂單、商品服務項目,然後訪問創建訂單的接口,訂單服務的控制臺會輸出一段這樣的信息:

[order,6c8ecdeefb0fc723,cc4109a6e8e56d1c,false]

商品服務的控制臺也會輸出類似的信息,如下:

[product,6c8ecdeefb0fc723,40cdc34e745d59e7,false]

說明:

  • product: 看也知道是服務名稱
  • 6c8ecdeefb0fc723: 是TranceId,一條鏈路中,只有一個TranceId
  • 40cdc34e745d59e7:則是spanId,鏈路中的基本工作單元id
  • false:表示是否將數據輸出到其他服務,true則會把信息輸出到其他可視化的服務上觀察

通過這些信息,我們可以得知服務的鏈路,但是控制臺始終是不太方便查看。所以我們需要一個圖形化的工具,這時候就輪到zipkin出場了。

zipkin官網地址如下:

https://zipkin.io/

zipkin結構圖:
技術分享圖片

我們需要搭建zipkin服務器,我這裏拿了一臺線上的服務做實驗,使用docker安裝的zipkin,安裝過程如下:

[root@01server ~]# docker run -d -p 9411:9411 openzipkin/zipkin
Unable to find image ‘openzipkin/zipkin:latest‘ locally
latest: Pulling from openzipkin/zipkin
ff3a5c916c92: Pull complete 
a8906544047d: Pull complete 
590b87a38029: Pull complete 
5a45314016bd: Pull complete 
747e7e2c6558: Pull complete 
d010e5d815f5: Pull complete 
Digest: sha256:e130f6191ce6763f59250c44ca9a265ff9eca4c4b9a22c240403a8103123227e
Status: Downloaded newer image for openzipkin/zipkin:latest
e1fd796bc74175543ffce538b44cffcb013e75008acbc4248b4ec373a49df97f
[root@01server ~]#

安裝好後,使用瀏覽器訪問9411端口,主頁面如下所示:
技術分享圖片

然後在訂單服務中將之前的sleuth依賴替換成如下依賴:

<!-- 這個依賴包含了sleuth和zipkin -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

在配置文件中,增加zipkin相關的配置項。如下:

spring:
  ...
  zipkin:
    base-url: http://xxx.xx.xxx.xx:9411/  # zipkin服務器的地址
    sender:
      type: web  # 設置使用http的方式傳輸數據
  sleuth:
    sampler:
      probability: 1  # 設置抽樣采集為100%,默認為0.1,即10%      

配置好後重啟項目,並訪問創建訂單接口。下單成功後,到zipkin頁面上就可以查看到order服務的鏈路信息了:
技術分享圖片

會有紅色的信息表示有錯誤,點擊上圖中的紅色信息後,可以進入到服務鏈路的查看頁面,在這裏可以看到整條服務鏈路,並且可以看到每一個服務調用的耗時,也可以看到是哪一步調用發生了錯誤:
技術分享圖片

點擊每一行信息都可以查看其詳情信息,例如我點擊耗時46.236ms的那行信息,其詳細信息如下:
技術分享圖片

Spring Cloud Sleuth + zipkin 實現服務追蹤