zipkin簡介
Zipkin 是一款開源的分布式實時數(shù)據(jù)追蹤系統(tǒng)详幽,由基于 Google Dapper 的論文設(shè)計而來厌小,由 Twitter 公司提供開源實現(xiàn)恢共,主要功能是聚集來自各個異構(gòu)系統(tǒng)的實時監(jiān)控數(shù)據(jù),和微服務(wù)架構(gòu)下的接口直接的調(diào)用鏈路和系統(tǒng)延時問題璧亚。
Zipkin 提供了自己的UI讨韭,應(yīng)用將自己的監(jiān)控數(shù)據(jù)報告給zipkin脂信,由Zipkin 匯集并提供關(guān)聯(lián)圖展示,Zipkin可以追蹤請求調(diào)用鏈路透硝。Zipkin 以 Trace 的結(jié)構(gòu)表示一次請求的追蹤狰闪,又把每個Trace拆分為若干個有依賴關(guān)系的 Span,在微服務(wù)架構(gòu)中濒生,一次用戶的請求可能會被后臺的若干個服務(wù)處理埋泵,這完整的一次用戶請求可以一條調(diào)用鏈路Trace,每個調(diào)用處理請求的服務(wù)可以理解為一個Span(如API服務(wù))罪治,這個服務(wù)也可能繼續(xù)調(diào)用其他的服務(wù)丽声,因此形成一個Span的樹形結(jié)構(gòu),以體現(xiàn)服務(wù)間的調(diào)用關(guān)系觉义。
Zipkin 的用戶界面除了可以查看 Span 的依賴關(guān)系之外雁社,還以瀑布圖的形式顯示了每個 Span 的耗時情況,可以一目了然的看到各個服務(wù)的性能狀況晒骇。打開每個 Span霉撵,還有更詳細的數(shù)據(jù)以鍵值對的形式呈現(xiàn),而且這些數(shù)據(jù)可以在裝備應(yīng)用的時候自行添加洪囤。
spring Cloud Sleuth是對Zipkin的一個封裝徒坡,對于Span、Trace等信息的生成瘤缩、接入HTTP Request喇完,以及向Zipkin Server發(fā)送采集信息等全部自動完成。
Spring Cloud Sleuth的簡介
以下是Spring Cloud Sleuth的概念圖
在Spring Cloud Sleuth的封裝中款咖,Zipkin分為兩端何暮,一個是Zipkin服務(wù)端奄喂,一個是Zipkin客戶端铐殃,客戶端也就是微服務(wù)的應(yīng)用, 客戶端會配置服務(wù)端的url地址跨新,一旦發(fā)生服務(wù)間的調(diào)用的時候富腊,會被配置在微服務(wù)里面的Sleuth的監(jiān)聽器監(jiān)聽,并生成相應(yīng)的 Trace 和 Span 信息寫進http報文頭里面域帐,并同時向Zipkin服務(wù)端上傳這些信息赘被,如圖所示。
主要方式有兩種肖揣,一種是消息總線的方式如RabbitMq發(fā)送民假,還有一種是http報文的方式發(fā)送,向 Zipkin 服務(wù)端發(fā)送gzip的數(shù)據(jù)包龙优,服務(wù)端接收到gzip的數(shù)據(jù)包進行解析羊异,根據(jù)每個調(diào)用鏈路匯總成調(diào)用鏈路的信息,這里注意,每個 Zipkin Client 里面如果設(shè)置了登錄驗證野舶,并不會影響Zipkin Server的信息收集易迹,因為 Client 端會自動上傳gzip的數(shù)據(jù)包給 Server 端,而無需 Server 端去調(diào)用 Client 端的接口去統(tǒng)計信息平道,Client 端在生成 Trace 統(tǒng)計信息的同時睹欲,如果配置了 MDC 或者在 logback 日志中集成了日志收集工具 logstash,則可以在 Client 端的控制臺讀到這些 Trace 和 Span 的信息一屋,對每個 Span 的信息都會有對應(yīng)的 Annotation 進行聲明窘疮。
Span 的 Annotation 信息
這些 Annotation 分為四種類型:
cs : Client Sent,這個標識著 Span的開始冀墨。
sr : Server Received考余,這個標識著服務(wù)端接收到客戶端發(fā)送請求的信息。Sleuth還可以根據(jù) cs 和 sr 的時間戳來計算服務(wù)調(diào)用的延時轧苫。
ss : Server Sent楚堤,這個標識表示服務(wù)端接收到客戶端后要返回 response 信息。
cr : Client Received含懊,這個標識表示客戶端收到服務(wù)端返回的 response 信息身冬。
這幾個注解反應(yīng)了一次完整的服務(wù)間調(diào)用的信息,這些注解結(jié)合 Span id 信息可以從不同的應(yīng)用匯總成調(diào)用鏈路的 Trace 信息岔乔,也就是說一次 Trace 的信息如果經(jīng)過了 A 應(yīng)用酥筝、B 應(yīng)用,那么 Sleuth 會從 A 應(yīng)用匯總對B應(yīng)用調(diào)用產(chǎn)生的注解信息 Client Sent 和 Client Received雏门,再從 B 應(yīng)用匯總對 A 應(yīng)用調(diào)用產(chǎn)生的 Server Received 和 Server Sent嘿歌,A 應(yīng)用根據(jù)自己調(diào)用信息組裝成 Span 和攜帶相應(yīng)的 Annotation 以gzip包的方式通過http發(fā)送給 Zipkin Server,B 應(yīng)用像 A 應(yīng)用一樣也會組裝這些信息給 Zipkin Server茁影,Zipkin Server會根據(jù) A 應(yīng)用和 B 應(yīng)用的信息匯總成統(tǒng)計信息展示在 Zipkin UI上宙帝。
Span的生命周期
start:開始對Span命名和記錄開始時間戳
close:結(jié)束時記錄結(jié)束時間戳并檢查屬性 exportable 然后匯總給 Zipkin,然后移除出當(dāng)前的線程募闲。
continue:為 Span 新建實例并拷貝繼續(xù)進行的 Span
detach:Span 沒有 stop 或者 close步脓,僅僅是移出當(dāng)前的線程。
create with explicit parent:在另外的一個線程重新創(chuàng)建一個 Span 并且明確它的 parent浩螺。
Span 的存儲方式
在 Zipkin Server里面有很多種存儲方式靴患,但是比較主流的有這兩種:
放在內(nèi)存中存儲。
放在mysql中存儲要出。 放在內(nèi)存中的隨著服務(wù)端的啟動會出清空歷史數(shù)據(jù)鸳君,如果想持久化保留這些數(shù)據(jù),可以選擇 mysql 的方式存儲患蹂。 mysql配置方式參考:Stack Overflow 網(wǎng)友提供的參考方案 mysql 配置后有兩個表或颊,如圖
更多 zipkin 學(xué)習(xí)資料:
Spring Cloud Sleuth 官方文檔
Github 上的 Zipkin 參考樣例