1. 程式人生 > >Laravel + go-micro + grpc 實踐基於 Zipkin 的分散式鏈路追蹤系統 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?

Laravel + go-micro + grpc 實踐基於 Zipkin 的分散式鏈路追蹤系統 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?

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

 

 

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