zoukankan      html  css  js  c++  java
  • Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?

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

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

  • 相关阅读:
    UVAlive3708 UVA1388 POJ3154 Graveyard【水题】
    UVALive5520 UVA305 POJ1012 HDU1443 Joseph【数学计算+打表】
    Go语言的素数对象编程实现及其使用
    Go语言实现的素数筛选程序
    Go语言的map以及sort
    封装统一数据验证方法
    项目开发中发布更新文档备注
    Asp.net Web Api开发Help Page 添加对数据模型生成注释的配置和扩展
    编写一个通用递归获取树形结构对象集合的方法
    使用AutoFac实现依赖注入(封装一个注册类)
  • 原文地址:https://www.cnblogs.com/si812cn/p/9951209.html
Copyright © 2011-2022 走看看