Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统
本文首发在我的公众号,欢迎关注!
分布式调用链跟踪系统,属于监控系统的一类。系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务、组件构成,用户请求过来后,可能会经过其中多个服务,如图
不过,出问题时往往很难排查,如整个请求变慢、偶尔报错、不可用等,我们很难得知具体是由哪一个或哪些服务引起的,通常开发同学都会互相甩锅,最后不得不花大量时间人肉 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....
原文:http://mp.weixin.qq.com/s/JkLMNabnYbod-b4s...
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: