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

概述

首先同步下项目概况:

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

啥是链路追踪?

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

咱们先看一张图:

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

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

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

如何设计日志记录?

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

  • 请求的唯一标识
  • 请求了哪些服务?
  • 请求的服务依次顺序?
  • 请求的 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。

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

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

开源工具

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

我为什么选择 Jaeger

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

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

Jaeger 架构图

图片来源于官网。

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

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

图片来源于官网。

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

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实现;

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

实战

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

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

下篇文章再给大家分享。

源码地址

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

go-gin-api 系列文章

原文地址:https://www.cnblogs.com/xinliangcoder/p/11526730.html

时间: 2024-08-29 06:08:55

[系列] go-gin-api 路由中间件 - Jaeger 链路追踪(五)的相关文章

go-gin-api 路由中间件 - 签名验证(七)

概览 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大神,只不过在本地实践了而已,对于 Go 语言的使用,我还是个新人,在这里感谢大家的厚爱!这篇文章咱们分享:路由中间件 - 签名验证. 为什么使用签名验证? 这个就不用多说了吧,主要是为了保证接口安全和识别调用方身份,基于这两点,咱们一起设计下签名. 调用方需要申请 App Key 和 App Sec

[系列] go-gin-api 路由中间件 - 捕获异常(四)

目录 概述 什么是异常? 怎么捕获异常? 封装发邮件方法 自定义邮件模板 封装一个中间件 备注 源码地址 go-gin-api 系列文章 概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - 日志记录,这篇文章咱们分享:路由中间件 - 捕获异常.当系统发生异常时,提示 "系统异常,请联系管理员!",同时并发送 panic 告警邮件. 什么是异常? 在 Go 中异常就是 panic,它是在程序运行的时候抛出的,当 panic 抛出之后,如果在程序里没有添加任何保护措施的话,控制台就

ASP.NET Web API 路由对象介绍

ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了一些微小的修改,这也是根据每个框架的特性来制定的,今天我们就来看一看路由的结构,虽然我在MVC系列里写过路由的篇幅不过在这里是Web API 路由对象介绍. ASP.NET Web API路由.管道 ASP.NET Web API 开篇介绍示例 ASP.NET Web API 路由对象介绍 ASP.

asp.net core 系列 5 MVC框架路由(上)

一. 概述 介绍asp.net core路由时,我初步想了下,分几篇来说明.  路由的知识点很多,参考了官方文档提取出一些重要的知识点来说.    在ASP.NET Core中是使用路由中间件来匹配传入请求的 URL 并将它们映射到操作(action方法).路由是在程序启动时进行传统路由或属性路由定义. 路由描述如何将 URL 路径与操作相匹配. 它还用于在响应中生成送出的 URL(用于链接). 路由操作既支持传统路由,也支持属性路由.也可混合使用.通常传统路由用于为浏览器处理 HTML 页面的

go-gin-api 路由中间件 - 日志记录

概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 validator.v8 版本,现已更新到 validator.v9 版本,最新代码查看 github 即可. 这篇文章咱们分享:路由中间件 - 日志记录. 日志是特别重要的一个东西,方便我们对问题进行排查,这篇文章我们实现将日志记录到文本文件中. 这是我规划的,需要记录的参数: - request 请求数据 - request_time - request_method - request_uri - r

go-gin-api 路由中间件 - 捕获异常

概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - 日志记录,这篇文章咱们分享:路由中间件 - 捕获异常. 当系统发生异常时,提示 “系统异常,请联系管理员!”,并发送 panic 告警邮件.什么是异常? 在 Go 中异常就是 panic,它是在程序运行的时候抛出的,当 panic 抛出之后,如果在程序里没有添加任何保护措施的话,控制台就会在打印出 panic 的详细情况,然后终止运行. 我们可以将 panic 分为两种: 一种是有意抛出的,比如, panic("自定义的 panic 信

AngularJS路由系列(5)-- UI-Router的路由约束、Resolve属性、路由附加数据、路由进入退出事件

本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router约束路由参数● UI-Router的Resolve属性● UI-Router给路由附加数据● UI-Router的onEnter和onExit事件 AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolve3.AngularJS路由系列(3)-- UI-Rou

Apache Kafka系列(三) Java API使用

Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 摘要: Apache Kafka Java Client API 一.基本概念 Kafka集成了Producer/Consumer连接Broker的客户端工具,但是在消息处理方面,这两者主要用于服务端(Broker)的简单操作,如: 1.创建Topic 2.罗列出已存在的Topic 3.对已有Topic的Produce/Consume测试

ASP.NET Web API 路由 (上)

1 什什么是ASP.NET Web API 路由 ASP.NET Web路由其实就是一个抽象的消息处理管道,ASP.NET Web API的路由机制不同于ASP.NET的路由机制,但是与ASP.NET的路由有着相似的一套设计. 2 ASP.NET Web API 请求和响应的相关对象 ASP.NET Web API的请求是通过HtppRequestMessage作为管道来处理请求的消息,通过HtppReponseMessage作为管道来处理响应的消息.也就是ASP.NET Web API处理用户