圖文詳解 微服務 Zipkin 鏈路追蹤原理


圖文詳解 微服務 Zipkin 鏈路追蹤原理

文章插圖
一個看起來很簡單的應用,可能需要數十或數百個服務來支撐,一個請求就要多次服務調用 。
當請求變慢、或者不能使用時,我們是不知道是哪個后臺服務引起的 。
這時,我們使用 Zipkin 就能解決這個問題 。
由于業務訪問量的增大,業務復雜度增加,以及微服務架構和容器技術的興起,要對系統進行各種拆分 。
微服務系統拆分后,我們可以使用 Zipkin 鏈路,來快速定位追蹤有故障的服務點 。
今天重點講解 Zipkin 鏈路追蹤的原理與使用 @mikechen
目錄
  • Zipkin
  • 為什么用 Zipkin?
  • Zipkin 的原理
    • 1.ZipKin 架構
    • 2.Zipkin 核心組件
    • 3.Zipkin 核心結構
    • 4.Zipkin 的工作流程
  • Zipkin 的部署與運行
  • 總結
Zipkin 基本概述Zipkin 是一款開源的分布式實時數據追蹤系統(Distributed Tracking System),能夠收集服務間調用的時序數據,提供調用鏈路的追蹤 。
Zipkin 其主要功能是聚集來自各個異構系統的實時監控數據,在微服務架構下,十分方便地用于服務響應延遲等問題的定位 。
Zipkin 每一個調用鏈路通過一個 trace id 來串聯起來,只要你有一個 trace id,就能夠直接定位到這次調用鏈路,并且可以根據服務名、標簽、響應時間等進行查詢 , 過濾那些耗時比較長的鏈路節點 。
【圖文詳解 微服務 Zipkin 鏈路追蹤原理】
圖文詳解 微服務 Zipkin 鏈路追蹤原理

文章插圖
為什么用 Zipkin ?大型互聯網公司為什么需要分布式跟蹤系統?
隨著業務訪問量越來越大 。例如:比較典型的是淘寶,淘寶從早期的單體開始往分布式微服務演變,系統也隨之進行各種拆分 , 看似簡單的一個應用,后臺可能有幾十個甚至幾百個服務在支撐 。
一個客戶端的請求,例如:一次下訂單請求,可能需要多次的服務調用(商品、用戶、店鋪等系統調用過程),最后才能完成 。
當請求變慢、或者不能正常使用時,我們不知道是哪個后臺服務引起的,這時,我們就要想辦法快速定位服務故障點 。
Zipkin 分布式跟蹤系統就能非常好地解決該問題,主要解決以下3點問題:
1.  動態展示服務的鏈路;
2.  分析服務鏈路的瓶頸并對其進行調優;
3.  快速進行服務鏈路的故障發現 。
這就是 Zipkin 服務跟蹤系統存在的目的和意義 。
當然了,除了 Zipkin 分布式跟蹤系統以外,我們還可以使用其他比較成熟的實現 , 例如:
  • Naver 的 Pinpoint
  • Apache 的 HTrace
  • 阿里的鷹眼 Tracing
  • 京東的 Hydra
  • 新浪的 Watchman
  • 美團點評的 CAT
  • skywalking
  • ......
知道了 Zipkin 的使用原因、使用場景和作用,接下來,我們來了解 Zipkin 的原理 。
Zipkin 的原理1. ZipKin 架構ZipKin 可以分為兩部分:
  • ZipKin Server :用來作為數據的采集存儲、數據分析與展示;
  • ZipKin Client :基于不同的語言及框架封裝的一些列客戶端工具 , 這些工具完成了追蹤數據的生成與上報功能 。
整體架構如下:
圖文詳解 微服務 Zipkin 鏈路追蹤原理

文章插圖
2. Zipkin 核心組件Zipkin (服務端)包含四個組件,分別是 collector、storage、search、web UI 。
圖文詳解 微服務 Zipkin 鏈路追蹤原理

文章插圖
1)  collector  信息收集器
collector 接受或者收集各個應用傳輸的數據 。
2)  storage  存儲組件
zipkin 默認直接將數據存在內存中,此外支持使用 Cassandra、ElasticSearch 和 Mysql。
3)  search  查詢進程
它提供了簡單的 JSON API 來供外部調用查詢 。
4)  web UI  服務端展示平臺
主要是提供簡單的 web 界面,用圖表將鏈路信息清晰地展示給開發人員 。
3. Zipkin 核心結構當用戶發起一次調用時,Zipkin 的客戶端會在入口處為整條調用鏈路生成一個全局唯一的 trace id,并為這條鏈路中的每一次分布式調用生成一個 span id 。
一個 trace 由一組 span 組成,可以看成是由 trace 為根節點 , span 為若干個子節點的一棵樹,如下圖所示:
圖文詳解 微服務 Zipkin 鏈路追蹤原理

文章插圖
4. Zipkin 的工作流程一個應用的代碼發起 HTTP get 請求 , 經過 Trace 框架攔截,大致流程如下圖所示:

推薦閱讀