本文首发在我的公众号,欢迎关注!
[](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)
[
](https://lccdn.phphub.org/uploads/images/201707/01/205/mCVPQNL8e3.png)
不过,出问题时往往很难排查,如整个请求变慢、偶尔报错、不可用等,我们很难得知具体是由哪一个或哪些服务引起的,通常开发同学都会互相甩锅,最后不得不花大量时间人肉 tracing
项目初期时,可以简单处理,通过生成唯一 request_id
,在各个方法记录日志,方便排查问题。中后期系统拆分为各个子服务时,要么继续推进原有的 request_id
方式到各个服务,要么换用成熟的追踪系统,如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)
[
](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)
[
](https://lccdn.phphub.org/uploads/images/201707/01/205/GeYyoET0Nm.png)
点进去即可看到整个链路耗时12.4 ms
以及各个 span 耗时
点击每个 span 可查看更详细信息
演示程序仅仅实现了从 php 通过 grpc 请求 go 服务时的场景,如果用在生产,需继续实现以下场景:
这些不是本文重点,在示例程序上稍加改造即可。
各场景相互结合串联到一起,基本能覆盖绝大部分业务。
另外,可以将 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
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论