Spring Cloud Sleuth + zipkin 實現服務追蹤
Spring Cloud Sleuth實現了一種分布式的服務鏈路跟蹤解決方案,通過使用Sleuth可以讓我們快速定位某個服務的問題。
官方文檔地址如下:
http://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.0.1.RELEASE/single/spring-cloud-sleuth.html
一些概念:
-
Span,Span是基本的工作單元。Span包括一個64位的唯一ID,一個64位trace碼,描述信息,時間戳事件,key-value 註解(tags),span處理者的ID(通常為IP)。
最開始的初始Span稱為根span,此span中span id和 trace id值相同。 -
Trance,包含一系列的span,它們組成了一個樹型結構
- 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 實現服務追蹤