Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区

[Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区]

本文首发在我的公众号,欢迎关注!
[](https://lccdn.phphub.org/uploads/images/201706/28/205/qUpmuB9ASO.png)

[

](https://lccdn.phphub.org/uploads/images/201706/28/205/qUpmuB9ASO.png)

分布式调用链跟踪系统,属于监控系统的一类。系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务、组件构成,用户请求过来后,可能会经过其中多个服务,如图
[](https://lccdn.phphub.org/uploads/images/201707/01/205/mCVPQNL8e3.png)

[file

](https://lccdn.phphub.org/uploads/images/201707/01/205/mCVPQNL8e3.png)

不过,出问题时往往很难排查,如整个请求变慢、偶尔报错、不可用等,我们很难得知具体是由哪一个或哪些服务引起的,通常开发同学都会互相甩锅,最后不得不花大量时间人肉 tracing

项目初期时,可以简单处理,通过生成唯一 request_id ,在各个方法记录日志,方便排查问题。中后期系统拆分为各个子服务时,要么继续推进原有的 request_id 方式到各个服务,要么换用成熟的追踪系统,如zipkin

zipkin 是什么

zipkin 是 twitter 开源的产品,类似于 Google 的 Dapper,淘宝也有类似的系统叫 鹰眼。社区有一个开源项目叫 opentracing,定义了此类系统的统一标准,各个开源项目也基本都对其兼容, 如 zipkin jaeger appdash 等。

两个核心概念

TraceId: 用于标识一次完整请求 trace,会从头到尾贯穿在各个服务中,通常在请求入口时生成。

SpanId: 用于标识某个调用跨度 span,一个 span 可以有多个 子span, 通常一个完整的 trace 由很多个 span 组成。

如图
[](https://lccdn.phphub.org/uploads/images/201707/01/205/YmMpPxDiPA.png)

[file

](https://lccdn.phphub.org/uploads/images/201707/01/205/YmMpPxDiPA.png)

基本流程

  • 请求入口生成 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 可看到追踪记录,如图
[](https://lccdn.phphub.org/uploads/images/201707/01/205/GeYyoET0Nm.png)

[file

](https://lccdn.phphub.org/uploads/images/201707/01/205/GeYyoET0Nm.png)

点进去即可看到整个链路耗时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
[](https://lccdn.phphub.org/uploads/images/201706/28/205/qUpmuB9ASO.png)

[

](https://lccdn.phphub.org/uploads/images/201706/28/205/qUpmuB9ASO.png)

@henter
https://henter.me


Original url: Access

Created at: 2018-10-10 15:53:01

Category: default

Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论