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

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

Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?的更多相关文章

  1. 个推基于 Zipkin 的分布式链路追踪实践

    作者:个推应用平台基础架构高级研发工程师 阿飞   01业务背景   随着微服务架构的流行,系统变得越来越复杂,单体的系统被拆成很多个模块,各个模块通过轻量级的通信协议进行通讯,相互协作,共同实现系统 ...

  2. 基于Dapper的分布式链路追踪入门——Opencensus+Zipkin+Jaeger

    微信搜索公众号 「程序员白泽」,进入白泽的编程知识分享星球 最近做了一些分布式链路追踪有关的东西,写篇文章来梳理一下思路,或许可以帮到想入门的同学.下面我将从原理到demo为大家一一进行讲解,欢迎评论 ...

  3. 基于zipkin分布式链路追踪系统预研第一篇

    本文为博主原创文章,未经博主允许不得转载. 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Infras ...

  4. zipkin分布式链路追踪系统

    基于zipkin分布式链路追踪系统预研第一篇   分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Inf ...

  5. 分布式链路追踪系统Sleuth和ZipKin

    1.微服务下的链路追踪讲解和重要性 简介:讲解什么是分布式链路追踪系统,及使用好处 进行日志埋点,各微服务追踪. 2.SpringCloud的链路追踪组件Sleuth 1.官方文档 http://cl ...

  6. Net和Java基于zipkin的全链路追踪

    在各大厂分布式链路跟踪系统架构对比 中已经介绍了几大框架的对比,如果想用免费的可以用zipkin和pinpoint还有一个忘了介绍:SkyWalking,具体介绍可参考:https://github. ...

  7. Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈

    导读 微服务架构中,是否遇到过这种情况,服务间调用链过长,导致性能迟迟上不去,不知道哪里出问题了,巴拉巴拉....,回归正题,今天我们使用SpringCloud组件,来分析一下微服务架构中系统调用的瓶 ...

  8. 【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin)

    1 分布式追踪系统 随着大量公司把单体应用重构为微服务,对于运维人员的责任就更加重大了.架构更复杂.应用更多,要从中快速诊断出问题.找到性能瓶颈,并不是一件容易的事.因此,也随着诞生了一系列面向Dev ...

  9. 带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin

    在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法.想看看方法的指标,却无处下手? 本文将通过 gRPC + Opentracing + Zipkin 搭建一个分布式链路追踪系统 ...

随机推荐

  1. 【转载】 看996ICU

    原文地址: https://www.jianshu.com/p/15d8726fa8a8 作者:Demisstif 来源:简书 ------------------------------------ ...

  2. C#正则表达式语法教程

    C#语法之正则 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新!助力 ...

  3. 向指定URL发送GET、POST方法的请求

    /** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param param * 请求参数,请求参数应该是 name1=value1&name ...

  4. CentOS右键菜单添加新增文件命令

    进入模板文件夹, 增加空白文件即可. cd /home/tom/Templatesvi text01.txt //新增一个名为text01的文本文件. :wq //保存退出. 另外可以用LibreOf ...

  5. webapi core2.1 Identity.EntityFramework Core进行配置和操作数据 (一)没什么用

    https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-2.1&am ...

  6. PS学习之合成特效:被风沙侵蚀的动物们

    素材 大象 尘埃 裂纹 沙子 土地 正式操作: 打开PS 新建一个文件 选国际标准纸张  给分辨率为72(分辨率越大越占内存) 然后确定  将图片旋转90度(图像——旋转——(顺/逆)90度) 下面选 ...

  7. random(随机模块)

    程序中有很多地方需要用到随机字符,比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串 >>> random.randrange(1,10) #返回1-10之间的一 ...

  8. jsp中引入jquery报错:Failed to load resource: the server responded with a status of 404 (Not Found)

    问题描述: 今天自己在搭建spring.springMVC.hibernate框架,搭建完成后,在引入jquery时,发现jquery不管用.我的解决顺序是: 1.检查路径,发现路径没错,另外需要注意 ...

  9. 【转】基于Map的简易记忆化缓存

    看到文章后,自己也想写一些关于这个方面的,但是觉得写的估计没有那位博主好,而且又会用到里面的许多东西,所以干脆转载.但是会在文章末尾写上自己的学习的的东西. 原文出处如下: http://www.cn ...

  10. 不输入密码执行sudo 命令

    命令行执行的crontab 命令,但是需要包含sudo 才可以执行的命令,怎么办呢?见下: leo@leo-Ubuntu:/etc$ visudovisudo: /etc/sudoers: 权限不够v ...