当前位置: 首页 > news >正文

go 操作cassandra_[系列] - go-gin-api 路由中间件 - Jaeger 链路追踪(五)

概述

首先同步下项目概况:

023e8e31aa3f5c43712665bb51f8c0aa.png

上篇文章分享了,路由中间件 - 捕获异常,这篇文章咱们分享:路由中间件 - Jaeger 链路追踪。

啥是链路追踪?

我理解链路追踪其实是为微服务架构提供服务的,当一个请求中,请求了多个服务单元,如果请求出现了错误或异常,很难去定位是哪个服务出了问题,这时就需要链路追踪。

咱们先看一张图:

6e559085e3ebe00e6bbb3bda36258893.png

这张图的调用链还比较清晰,咱们想象一下,随着服务的越来越多,服务与服务之间调用关系也越来越多,可能就会发展成下图的情况。

bcf17af16340d0839720dae890dba71a.png

这调用关系真的是... 看到这,我的内心是崩溃的。

9834f79d1bb70306b09130fe43a4fb96.png

那么问题来了,这种情况下怎么快速定位问题?

如何设计日志记录?

我们自己也可以设计一个链路追踪,比如当发生一个请求,咱们记录它的:

  • 请求的唯一标识
  • 请求了哪些服务?
  • 请求的服务依次顺序?
  • 请求的 Request 和 Response 日志?
  • 对日志进行收集、整理,并友好展示

怎么去实现请求的唯一标识?

以 Go 为例 写一个中间件,在每次请求的 Header 中包含:X-Request-Id,代码如下:

func SetUp() gin.HandlerFunc {
    return func(c *gin.Context) {
        requestId := c.Request.Header.Get("X-Request-Id")
        if requestId == "" {
            requestId = util.GenUUID()
        }
        c.Set("X-Request-Id", requestId)
        c.Writer.Header().Set("X-Request-Id", requestId)
        c.Next()
    }
}

每个 Request 和 Response 日志中都要包含 X-Request-Id。

问题又来了,每次调用都记录日志,当调用的服务过多时,频繁的记录日志,就会有性能问题呀,肿么办?

4688de7157577ff7e9de7c7a38171c67.png

哎,这么麻烦,看看市面上有没有一些开源工具呢?

开源工具

  • Jaeger:https://www.jaegertracing.io
  • Zipkin:https://zipkin.io/
  • Appdash:https://about.sourcegraph.com/

这个就不多做介绍了,基本上都能满足需求,至于优缺点,大家可以挨个去瞅瞅,喜欢哪个就用哪个?

我为什么选择 Jaeger

因为我目前只会用这个,其他还不会 ...

咱们一起看下 Jaeger 是怎么回事吧。

Jaeger 架构图

20e4e2a29ca37e268bcf18f8ca2b77fa.png

图片来源于官网。

简单介绍下上图三个关键组件:

Agent

Agent是一个网络守护进程,监听通过UDP发送过来的Span,它会将其批量发送给collector。按照设计,Agent要被部署到所有主机上,作为基础设施。Agent将collector和客户端之间的路由与发现机制抽象了出来。

Collector

Collector从Jaeger Agent接收Trace,并通过一个处理管道对其进行处理。目前的管道会校验Trace、建立索引、执行转换并最终进行存储。存储是一个可插入的组件,现在支持Cassandra和elasticsearch。

Query

Query服务会从存储中检索Trace并通过UI界面进行展现,该UI界面通过React技术实现,其页面UI如下图所示,展现了一条Trace的详细信息。

其他组件,大家可以了解下并选择性使用。

Jaeger Span

e36711cb636e3e9e6caf056882d5ae0c.png

图片来源于官网。

怎么操作 Span 呢?Span 有哪些可以调用的 API ?

9ce099a3eaf7c62cbdba27dccc323d72.png

Jaeger 部署

All in one

为了方便大家快速使用,Jaeger 直接提供一个 All in one 包,我们可以直接执行,启动一套完整的 Jaeger tracing 系统。

启动成功后,访问 http://localhost:16686 就可以看到 Jaeger UI。

独立部署

  • jaeger-agent
  • jaeger-collector
  • jaeger-query
  • jaeger-ingester
  • jaeger-operator
  • jaeger-cassandra-schema
  • jaeger-es-index-cleaner
  • spark-dependencies

可以自由搭配,组合使用。

Jaeger 端口

  • 端口:6831
  • 协议:UDP
  • 所属模块:Agent
  • 功能:通过兼容性 Thrift 协议,接收 Jaeger thrift 类型数据
  • 端口:14267
  • 协议:HTTP
  • 所属模块:Collector
  • 功能:接收客户端 Jaeger thrift 类型数据
  • 端口:16686
  • 协议:HTTP
  • 所属模块:Query
  • 功能:客户端前端界面展示端口

Jaeger 采样率

分布式追踪系统本身也会造成一定的性能低损耗,如果完整记录每次请求,对于生产环境可能会有极大的性能损耗,一般需要进行采样设置。

固定采样

(sampler.type=const)

  • sampler.param=1 全采样,
  • sampler.param=0 不采样;

按百分比采样

(sampler.type=probabilistic)

  • sampler.param=0.1 则随机采十分之一的样本;

采样速度限制

(sampler.type=ratelimiting)

  • sampler.param=2.0 每秒采样两个traces;

动态获取采样率

(sampler.type=remote)

  • 这个是默认配置,可以通过配置从 Agent 中获取采样率的动态设置。

Jaeger 缺点

  • 接入过程有一定的侵入性;
  • 本身缺少监控和报警机制,需要结合第三方工具来实现,比如配合Grafana 和 Prometheus实现;

看到这,说的都是理论,大家的心里话可能是:

01b42bc001a47882136346e05e0f3b66.png

实战

  • Jaeger 部署
  • Jaeger 在 Gin 中使用
  • Jaeger 在 gRPC 中使用

79f4ca407f45c9ef7cbe7962d646c1d4.png

关于实战的分享,我准备整理出 4 个服务,然后实现服务与服务之间进行相互调用,目前 Demo 还没写完...

下篇文章再给大家分享。

源码地址

https://github.com/xinliangnote/go-gin-api

go-gin-api 系列文章

  • 1. 使用 go modules 初始化项目
  • 2. 规划项目目录和参数验证
  • 3. 路由中间件 - 日志记录
  • 4. 路由中间件 - 捕获异常

相关文章:

  • go语言能转csv_Go 每日一库之 casbin:权限管理
  • java中的this_深入理解Java中this关键字的使用
  • Rediis mysql哪个好_rediis介绍与安装,持久化存储,发布订阅,事务
  • 504 压测geteway_loadrunner压测过程常出现错误和处理方法
  • html命名侧边栏_html+css3+jquery右侧弹出侧边栏导航菜单
  • mysql atlas分表_数据切分——Atlas读写分离Mysql集群的搭建
  • mysql internal_MySQL Internal 札记
  • mysql中8warings_查看MySQL的warnings内容的命令
  • php mysql分页显示图片_php mysql 分页显示代码
  • python中三种分支结构的语句有_Python零基础入门学习09:程序控制流程:顺序结构和分支结构...
  • python蜂窝状六边形_CSS-蜂窝状展示区域(多个六边形)的一种实现方式
  • vue 图片自适应排列插件_vue+heatmap.js实现自定义图片热力图并且自适应
  • 阿里云服务器ubuntu安装mysql_Ubuntu安装MySQL-阿里云开发者社区
  • mysql 2日期什么类型的_【MySQL数据类型2之--日期时间类型】
  • mysql root命令_MySQL 修改 root 密码命令
  • [译] React v16.8: 含有Hooks的版本
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript 基本功--面试宝典
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mysql 数据库四种事务隔离级别
  • Odoo domain写法及运用
  • overflow: hidden IE7无效
  • Python学习之路16-使用API
  • spring security oauth2 password授权模式
  • Theano - 导数
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Unix命令
  • Wamp集成环境 添加PHP的新版本
  • XML已死 ?
  • 关于字符编码你应该知道的事情
  • 区块链技术特点之去中心化特性
  • 网络应用优化——时延与带宽
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习HTTP相关知识笔记
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 应用生命周期终极 DevOps 工具包
  • Python 之网络式编程
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • UI设计初学者应该如何入门?
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (Git) gitignore基础使用
  • (libusb) usb口自动刷新
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (八)c52学习之旅-中断实验
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分享)自己整理的一些简单awk实用语句
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)ObjectiveC 深浅拷贝学习
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .apk 成为历史!
  • .net 4.0发布后不能正常显示图片问题