Laravel + go-micro + grpc 實踐基於 Zipkin 的分散式鏈路追蹤系統

henter發表於2017-07-01

本文首發在我的公眾號,歡迎關注!

分散式呼叫鏈跟蹤系統,屬於監控系統的一類。系統架構逐步演進時,後期形態往往是一個平臺由很多不同的服務、元件構成,使用者請求過來後,可能會經過其中多個服務,如圖
file

不過,出問題時往往很難排查,如整個請求變慢、偶爾報錯、不可用等,我們很難得知具體是由哪一個或哪些服務引起的,通常開發同學都會互相甩鍋,最後不得不花大量時間人肉 tracing

專案初期時,可以簡單處理,通過生成唯一 request_id ,在各個方法記錄日誌,方便排查問題。中後期系統拆分為各個子服務時,要麼繼續推進原有的 request_id 方式到各個服務,要麼換用成熟的追蹤系統,如zipkin

zipkin 是什麼

zipkin 是 twitter 開源的產品,類似於 Google 的 Dapper,淘寶也有類似的系統叫 鷹眼。社群有一個開源專案叫 opentracing,定義了此類系統的統一標準,各個開源專案也基本都對其相容, 如 zipkin jaeger appdash 等。

兩個核心概念

TraceId: 用於標識一次完整請求 trace,會從頭到尾貫穿在各個服務中,通常在請求入口時生成。

SpanId: 用於標識某個呼叫跨度 span,一個 span 可以有多個 子span, 通常一個完整的 trace 由很多個 span 組成。

如圖
file

基本流程

  • 請求入口生成 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 可看到追蹤記錄,如圖
file
點進去即可看到整個鏈路耗時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

原文:http://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw

相關文章