美文网首页
都在还说链路跟踪,那么 go-zero 的链路跟踪是咋样的?

都在还说链路跟踪,那么 go-zero 的链路跟踪是咋样的?

作者: 阿兵云原生 | 来源:发表于2023-08-26 23:31 被阅读0次

工作中,自然少不了开发去排查问题,那如果链路比较长,客户端一个请求打进来,可能内部微服务进行了多个服务的交互,那么如果其中有一个环节出现了问题,我们如何定位是哪一个请求或者是说是哪一条调用链呢?

可能开发的时候或多或少会加入自己的一些表示,例如请求里面会加入 requuid,链路中涉及的服务都会将这个 requuid 传下去,直到整个调用链结束

当然比较 low 的一种方式是,在微服务交互的请求和相应中加上 requuid 字段,这个应该也是从单体服务过度到微服务开发时特别容易出现的情况

实际上做链路跟踪,简单的方式就是在各种请求的上下文加上 traceid 就可以了,今天我们来看看 go-zero 中的链路跟踪是如何应用的

分别从如下几个部分来看看 go-zero 中应用链路跟踪

  • Http 服务端部分,客户端部分
  • Rpc 服务端部分,客户端部分

当然关于日志组件,数据库组件等相关组件,应用到链路跟踪的地方,做法大体一致,我们一起看看 http 和 rpc 服务中应用的方式,其他的组件应用咱们也就可以简单的将知识迁移过去即可上手

Http 服务端部分

对于 ge-zero http ,我们可以一起来看看 服务端部分是如何应用的

简单来说,在我们启动 http 服务的时候,就已经将链路追踪的功能给打开了,go-zero 是通过 http handle 的方式来处理的

当然,同理,我们也可以自己在 go-zero 中加一个 middleware 也是可以达到这样的效果

go-zero 中实际上在我们服务 start 的时候,内部就开始了各种初始化,大体流程是这样的

  • (s *Server) Start() -> (ng *engine) start(router httpx.Router) error

调用内部服务启动,注册路由

[图片上传失败...(image-a97cda-1693150218409)]

[图片上传失败...(image-e1a581-1693150218409)]

  • (ng *engine) bindRoutes(router httpx.Router) -> (ng *engine) bindFeaturedRoutes -> (ng *engine) bindRoute

进行路由的绑定,并默认添加中间件 middleware TracingHandler

[图片上传失败...(image-26db2-1693150218409)]

[图片上传失败...(image-8f05c2-1693150218409)]

[图片上传失败...(image-4996f5-1693150218409)]

我们可以看看关于 TracingHandler 的源码实现

[图片上传失败...(image-c7dcb-1693150218409)]

根据代码,我们基本可以看出来 TracingHandler 主要做了这几件事情:

  1. 读取 HeaderCarrier,获取 header 中的上下文 ctx
  1. 如果传入的 path 是空,则新建一个 spanName
  1. tracer.Start 开始去处理 span,设置 span 的类型,属性
  1. request 中产生新的ctx,并将相应的信息封装在 ctx 中,返回

[图片上传失败...(image-b98943-1693150218409)]

Rpc 服务端部分,客户端部分

那其实 rpc 服务端和客户端部分的实现和 http 的也是类似的,http 使用的是中间件的方式来进行处理,那么 rpc 这边块,其实可以通过拦截器的方式来进行处理

服务端

使用 go-zero 项目的框架,我们在启动 rpc 服务的时候,看看都做了些什么

[图片上传失败...(image-b2a0d4-1693150218409)]

  • 服务 start,go-zero 默认就给我们的 rpc 服务添加了一些默认的拦截器

    • 例如 UnaryTracingInterceptor
    • UnaryCrashInterceptor 等等

其中 UnaryTracingInterceptor 不难看出就是用于做拦路追踪的

而且我们可以看到 rpc 部分的拦截器分为流式的和非流式的,例如用于链路追踪的还有 StreamTracingInterceptor

[图片上传失败...(image-7f9602-1693150218409)]

阅读服务端 UnaryTracingInterceptor 拦截去源码,我们可以知道实际上做法和 http server 部分的做法大体一致

[图片上传失败...(image-b723be-1693150218409)]

  • 通过 rpc 的 ctx 处理 span
  • 设置 span 的状态和属性等键值对
  • 返回具体服务接口的数据

[图片上传失败...(image-44ea6b-1693150218409)]

客户端

那么客户端有什么不一样呢,其实也差不多

当我们 api 层服务在初始化客户端的时候就会使用 zrpc 包的 MustNewClient 方法

[图片上传失败...(image-93041a-1693150218409)]

[图片上传失败...(image-f6949e-1693150218409)]

[图片上传失败...(image-20870a-1693150218409)]

跟踪代码我们知道,最终客户端的建立,会去和 rpc 服务端进行建立连接,在建立连接的过程中会带上一些参数

正式 buildDialOptions 在处理 options 的时候将客户端的拦截器给默认加上了 UnaryTracingInterceptorStreamTracingInterceptor

[图片上传失败...(image-e0e8d4-1693150218409)]

那么 UnaryTracingInterceptor 的具体实现是这个样的:

[图片上传失败...(image-590589-1693150218409)]

  • 获取上游带下来的 span 上下文信息,startspan 中处理了关于 span 数据结构中的各种键值对
  • 从获取的 span 中创建新的 ctx,span「继承父span的traceId」
  • 将生成 span 的data加入ctx,传递到下一个中间件,流至下游

关于 微服务框架 go-zero 的链路追踪简单的流程咱们就先走到这里,有兴趣的也可以把他用起来

【欢迎查看历史文章】

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

[图片上传失败...(image-364c03-1693150218409)]

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章

  • 3.14:全链路跟踪

    本文将从以下三个方面阐述全链路跟踪设计与实践 为什么要做全链路跟踪 怎么做全链路跟踪 开源框架选型 为什么要做全链...

  • skywalking搭建

    skywalking是分布式微服务请求链路跟踪的框架,可以实现无侵入的链路跟踪、统计、拓扑架构绘制等,本文介绍如何...

  • 分布式链路追踪

    分布式链路追踪(Distributed Tracing),也叫 分布式链路跟踪,分布式跟踪,分布式追踪 等等。 本...

  • 基于日志分析的金融级全链路跟踪监控系统设计

    设计动机 在Google发表了全链路跟踪文章Dapper后,各大厂开始了适合自己的全链路跟踪系统设计,较为出名的有...

  • dubbo链路跟踪

    没有使用框架,自己写的简单链路跟踪,主要是下面两个过滤器TraceRpcFilter、TraceHttpFilte...

  • Sleuth链路跟踪

    Sleuth链路跟踪 原文在github,有些相对路径连接不能跳转,如想看原文项目地址 spingboot2.1....

  • zipkin链路跟踪

    Zipkin是什么 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking Sy...

  • SOA和RPC区别

    RPC SOA SOA又叫服务治理,入springcloud,服务进行监控,熔断,链路跟踪。

  • 数据同步链路跟踪

    1、背景 1.1、场景 在业务场景中一般由商家端服务维护商家和商品等信息,用户端服务从商家端服务同步各种业务数据。...

  • SpringCloud第十六篇:微服务利剑之APM平台(二)Pi

    1. Pinpoint概述 Pinpoint是一个由韩国人编写的为大型分布式系统服务的链路跟踪平台,并提供大量链路...

网友评论

      本文标题:都在还说链路跟踪,那么 go-zero 的链路跟踪是咋样的?

      本文链接:https://www.haomeiwen.com/subject/bhwimdtx.html