Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统

本文首发在我的公众号,欢迎关注!

分布式调用链跟踪系统,属于监控系统的一类。系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务、组件构成,用户请求过来后,可能会经过其中多个服务,如图
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....

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
@henter henter.me
本帖由系统于 6年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6
leo

对业务代码的侵入性太大了,假如 zipkin 挂了,业务系统也可能挂

6年前 评论
jcc123

路过~~

6年前 评论

@leo 倒是可以搞个异步的东东

6年前 评论

Laravel 有没有使用gRPC的比较好的解决方案?

5年前 评论

那么问题来了 有没有一套成熟的解决方案呢 laravel grpc

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!