zipkin能夠時時監控用戶應用的時間和各項數據的開源應用程序前端
在講解架構圖以前先思考一個問題,若是咱們本身要作一個監控系統須要哪些模塊 簡單想一下可能包括:數據採集(通常在用戶應用程序端)、數據上報(通常須要一個傳輸代理)、數據彙總(通常在監控應用服務端)、數據存儲(須要一個存儲介質)、數據展現(查詢和統計api和前端)再來看下面的架構圖就一目瞭然了 java
二、transport數據上報代理:數據在發送到服務端可使用多種渠道,例如:發送http請求、發送mq消息等。mysql
三、collector數據接收匯總:接收transport發送的數據因爲發送渠道多種多樣,因此接收端要適配各類渠道git
四、storage數據存儲模塊:因爲數據存儲介質多種多樣,例如:內存、mysql等,因此存儲模塊要適配各類介質github
五、api和ui負責監控數據的展現:經過瀏覽器展現監控數據web
知道了以上zipkin的基本框架,後面的安裝和使用就簡單了spring
首先到官網下載服務端安裝包:zipkin.io/ 這是官網地址。我使用的版本是2.14.0 注意:2.14.0服務端安裝以後自動漢化,不用配置。部分早期版本安裝以後默認英文版本。 下載連接:sql
search.maven.org/remote_cont…數據庫
下載以後檢查一下本身的jdk環境。最好1.8+版本 最基本的服務啓動命令:java -jar zipkin-***.jar 默認端口:9411 啓動以後訪問:localhost:9411.展現頁以下:apache
安裝完成
因爲zipkin支持多種信息接收端和多種數據存儲介質,這些都須要在啓動時候經過啓動參數指定。一個簡單的啓動用例以下:
java -jar zipkin-server-***-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.port=6572 --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest --STORAGE_TYPE=mysql --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=rootroot
經過參數很容易看出來:存儲介質選擇mysql、消息傳遞採用rabbitmq 詳細參數說明請參考: github.com/apache/incu…
若是採用mysql做爲存儲介質須要先初始化mysql數據庫和表: 參考: github.com/apache/incu…
因爲篇幅有限這裏就不粘貼詳細的命令參數和數據庫sql語句了(也沒有必要)
說明客戶端以前咱們先思考一個簡單問題,客戶端到底作什麼? 你們必定會說:數據採集啊。可是要如何採集呢?
作一個簡單的比喻,對於用戶的一個請求想象成一個鏈,鏈上的每個節點都是一個接口調用,zipkin須要監控每個接口調用的時間和數據。咱們面對的第一個問題可能就是如何將zipkin監控插入到鏈裏面呢?
這裏簡單舉兩個具體的例子:
對於servlet請求很容易想到經過filter監控每個請求 對於spring mvc很容易想到經過攔截器監控
經過以上方法已經能夠感知到用戶的每個請求,下一步咱們可能會想須要採集那些數據呢? zipkin是基於google的一篇論文實現的,論文中詳細說明了監控的數據原理。這裏咱們不去看論文也沒有必要看。只須要簡單的思考幾個問題就能夠了。首先監控數據是一個鏈,鏈就要有先後的關聯關係。和每一個鏈的數據劃分。 例如:咱們須要監控用戶端的兩個請求,每一個請求通過一個鏈的兩個節點。對於採集到的監控數據首先要分清楚那些數據屬於哪個請求、屬於一個請求數據的先後關係。
zipkin提出一個span的概念。span經過定義不一樣類型的id幫助咱們劃分請求和請求的先後關係 span 裏面有traceId:同一個請求的traceid相同;spanid:每個接口調用能夠建立一個spanid;還有一個parentId:代表確了前一個的spanId。根據這幾個id咱們就能夠區分請求和調用關係了 根據traceId區分出不一樣的請求、根據spanid和parentid區分出先後調用關係。
區分請求以後咱們再思考一個問題:zipkin最關鍵的一個指標就是時間。zipkin經過定義如下時間概念來劃分請求的不一樣時間節點
一、cs:Client Send,客戶端發起請求;
二、sr:Server Receive,服務器接受請求,開始處理;
三、ss:Server Send,服務器完成處理,給客戶端應答;
四、cr:Client Receive,客戶端接受到服務端應答;
注意以上四個時間都是點時間。zipkin能夠經過點時間計算出段時間展現 以上的各類id和各類點時間已經能夠實現zipkin的主要監控功能,對於span的詳細參數說明你們能夠查看git源碼:
客戶端完成數據採集和封裝以後就是消息發送了,因爲zipkin提供多種發送機制因此咱們只要實現不一樣的消息發送客戶端就能夠了。好比http、mq等這裏具體消息發送不細說了,後面會經過zipkin-brave幫助咱們實現消息發送
經過上面的說明咱們本身很容易實現一個zipkin客戶端了 例如實現一個spring mvc請求的數據監控: 首先寫一個攔截器,而後記錄時間,標記出客戶端仍是服務端封裝span。最後將span發送給zipkin服務端便可。這裏只是說明一個思路沒有具體實現,後面的zipkin-brave會幫咱們實現
下面簡單說明一下zipkin-brave的使用 咱們已經知道客戶端須要一個攔截功能、封裝span功能、發送span功能。那麼brave就是幫助咱們封裝這些功能,咱們只要直接拿來用就能夠了 在使用以前咱們須要考慮咱們要攔截什麼請求、咱們要經過什麼渠道發送消息。當咱們肯定了這兩個問題以後只要到官網去找相應的brave包就能夠了。下面舉一個攔截sping mvc請求、經過rabbitmq發送消息的例子 第一步:先去git上找到sping mvc的brave攔截器、在找到rabbitmq發送的brave發送器 這裏說明一下:攔截器在zipkin裏面叫instrumentation。發送器叫sender。知道這兩個概念能夠幫助咱們快速搜索,例如我用的是:mvnrepository.com/search。 只要在搜索框輸入:brave-instrumentation 就可能看到各類攔截的工具;輸入:zipkin-sender 就能夠看到各類發送器 對於brave的源碼地址以下:github.com/openzipkin/… 在這裏能夠看到源代碼。幫助咱們瞭解具體實現,也能夠直接複製源代碼到本身的項目裏面實現攔截功能 我引入jar包:brave-instrumentation-spring-webmvc。咱們看一下源碼也是很簡單。就是定一個SpanCustomizingAsyncHandlerInterceptor攔截器 引入jar包:zipkin-sender-amqp-client 發送mq消息。對於其餘的依賴包能夠經過:mvnrepository.com/search來查看。 下面簡單截一段代碼:
根據上的說明能夠基本理解客戶端原理了。集成dubbo只要dubbo的instrumentation就能夠。這裏不粘貼源代碼。只是簡單說明一下我使用的dubbo是2.6+。經過繼承dubbo-filter實現請求的攔截。對於發送端依然採用rabbitmq和上面沒有區別再也不說明
本文主要是講解一下zipkin的原理,給你們梳理一下使用的思路,對於具體使用你們能夠自行在網上查看,有不少說明文章。我建議你們在瞭解zipkin客戶端和服務端原理以後經過本身去查看brave源碼來實現本身的數據監控。由於查看網上文章通常都會遇到各類各樣的問題,還有不少文章過於久遠致使各類版本不兼容。其實當咱們知道了原理以後後面的具體實施就很簡單了。一點提示就是在具體實現過程當中必定要注意版本的兼容性和本身工程環境的兼容性。最好先建立一個簡單工程驗證,而後再加入到正式業務項目中。