分布式調用鏈跟蹤系統,屬於監控系統的一類。系統架構逐步演進時,后期形態往往是一個平台由很多不同的服務、組件構成,用戶請求過來后,可能會經過其中多個服務,如圖
不過,出問題時往往很難排查,如整個請求變慢、偶爾報錯、不可用等,我們很難得知具體是由哪一個或哪些服務引起的,通常開發同學都會互相甩鍋,最后不得不花大量時間人肉 tracing
項目初期時,可以簡單處理,通過生成唯一 request_id
,在各個方法記錄日志,方便排查問題。中后期系統拆分為各個子服務時,要么繼續推進原有的 request_id
方式到各個服務,要么換用成熟的追蹤系統,如zipkin
。
zipkin 是什么
zipkin
是 twitter 開源的產品,類似於 Google 的 Dapper,淘寶也有類似的系統叫 鷹眼
。社區有一個開源項目叫 opentracing
,定義了此類系統的統一標准,各個開源項目也基本都對其兼容, 如 zipkin
jaeger
appdash
等。
兩個核心概念
TraceId
:
用於標識一次完整請求 trace
,會從頭到尾貫穿在各個服務中,通常在請求入口時生成。
SpanId
:
用於標識某個調用跨度 span
,一個 span
可以有多個 子span
, 通常一個完整的 trace
由很多個 span
組成。
如圖
基本流程
請求入口生成
trace
在方法(或服務)調用前,生成
span
,記錄時間調用時,攜帶
TraceId
SpanId
(如,在 http header 或 grpc meta data 里)調用完后關聯到
trace
統一上報到
zipkin
存儲
最后,在 zipkin
可查看完整調用鏈
實踐准備工作
關鍵詞: php7、grpc、protobuf、go-micro、consul、zipkin
先配置本機環境, 以 Mac 系統為例: 安裝 protobuf、consul、zipkin、php-grpc 擴展
brew install protobuf brew instlal consul brew install php71-grpc wget -O zipkin.jar 'https://search.maven.org/remote_content?g
=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'
啟動服務
本機調試時可以用下面的命令快速啟動 consul 和 zipkin ,不建議用在生產環境
consul agent -dev java -jar zipkin.jar
此時可以打開 http://localhost:8500/ui 看到 consule 界面
打開 http://localhost:9411/ 可看到 zipkin 主界面
PHP 演示基於 Laravel
框架,已經在 Github 上
git clone https://github.com/henter/php-zipkin-demo cd php-zipkin-demo composer install php artisan serve
此時可打開 http://localhost:8000/ 看到 laravel 首頁
Go 服務基於 go-micro
微服務框架,請確保本機已安裝 Go
go get github.com/henter/go-zipkin-demo 啟動服務 go-zipkin-demo
准備工具已就緒,打開瀏覽器訪問 http://localhost:8000/test
這個請求會記錄 4 條span,分別是 root、一次 http 請求、一次 grpc 請求、go 服務內方法調用
此時刷新 zipkin 頁面,左側選擇 php-zipkin-demo
, 點擊 Find Traces
可看到追蹤記錄,如圖
點進去即可看到整個鏈路耗時12.4 ms
以及各個 span 耗時
點擊每個 span 可查看更詳細信息
需繼續完善
演示程序僅僅實現了從 php 通過 grpc 請求 go 服務時的場景,如果用在生產,需繼續實現以下場景:
PHP 接收 http 請求,並作為子span
Go 發起 grpc 請求
Go 發起 http 請求
Go 接收 http 請求,並作為子span
這些不是本文重點,在示例程序上稍加改造即可。 各場景相互結合串聯到一起,基本能覆蓋絕大部分業務。
另外,可以將 zipkin trace 數據推到 prometheus 監控系統,通過 grafana 可視化。或者,將 zipkin 數據存儲換成 elasticsearch,結合 kibana 生成圖表。
最后
具體代碼都在 Github 了,僅演示用,這里不深入具體細節,大家有興趣可以看代碼,歡迎 start
https://github.com/henter/php-zipkin-demo
https://github.com/henter/go-zipkin-demo
有任何問題歡迎交流,可加我個人微信 henter
注:本文示意圖來自 Google Dapper 論文
https://research.google.com/pubs/pub36356.html