关于后端:Golang-Context-生产应用案例01-链路追踪

Golang Context 生产利用案例(01): 链路追踪

如果在 公众号 文章发现状态为 已更新, 倡议点击 查看原文 查看最新内容。

状态: 未更新

原文链接: https://typonotes.com/posts/2023/03/15/golang-context-in-acti…

看完本文

  1. 理解 链路追踪 和 OpenTelemetry 相干常识
  2. 理解 Context 值传递是如何在 链路追踪 的倒退历程上登台亮相的。

之前在 Golang 上下文 Context 源码解析(1): 值传递 文章中举了一个例子阐明解说 Context 的值传递, 其中说到了 刘备-关羽-张飞 之间应用 Context 传递 曹操军队人数,

有敌人反馈说这个值应该是 业务参数 放在函数中作为 形参 传递, 难以了解为什么会放在 Context 中。

func Guanyu(n int) {
    // statement
}
func Zhangfei(n int) {
    // statement
}

因而, 这次咱们通过生产理论利用, 来说一下 Context 的值传递。

链路追踪

想必大家也晓得, 微服务治理是一个头疼的问题。 因为服务泛滥且部署扩散, 因而通过 调用链路 排查问题就十分重要了。 实现这个的计划就叫 链路追踪 , 在微服务中十分重要。

能够说, 开源我的项目 OpenTelemetry 在链路追踪层面, 基本上曾经是事实标准了。

Github 地址: https://github.com/open-telemetry

这里有一个官网一步步实现链路追踪的案例, 能够本人实现一下:
https://github.com/open-telemetry/opentelemetry-go/tree/main/example/fib

Context 在 链路追踪 中的利用

当初假如有 6 个服务, SvcA 1-3 , SvcB 1-3, 这 6 个服务可能散布在不同机器下面。

第一阶段

咱们晓得他们之间存在调用关系, 然而任何证据撑持。 所以从内部看来, 他们之间就是齐全独立的的 6 个服务。

因为工夫紧, 工作重, 业务就这样上线了。

第二阶段

起初业务出了问题, 除了靠记忆, 就只能现场看代码找调用链路。 排查过程异样艰巨。

于是有人提议说, 不如咱们在每个申请中都带上 UUID, 并且打印到日志外面, 就晓得哪些服务在某个申请下, 是有关系的。

于是就有了 TraceID

第三阶段

业务还是除了问题, 这次排查过程相比上次就轻松多了, 然而仍然发现了一些 困惑 的问题。 尽管能从日志工夫看到服务的调用程序, 然而并不知道他们之间的调用关系, 没方法无效的把他们组织起来。

于是就有人说, 要不在日志中减少两个字段, 表明他们调用的父子关系吧

于是就有了 ParentSpanIDSpanID

应用 Context 携带字段

当初好了咱们能通过 TraceID, SpanID, ParentSpanID 搞清楚服务之间的调用关系了。 然而要怎么传递他们呢?

这些字段是 必定不能 间接放在参数外面,

  1. 这些字段不是业务参数, 放进去会 净化 函数或办法。
  2. 即便当初放进去了, 当前要保护 减少或缩小 怎么办? 不可能每个中央服务都去改一次吧, 服务外面还有那么多函数。 从实践上来说, 这个就是不合理的设计。
func Guanyu(n int, TraceID string, SpanID string, ParentSpanID string) {
    // statement
}
func Zhangfei(n int, TraceID string, SpanID string, ParentSpanID string) {
    // statement
}

第四阶段

于是又有人说了, 要不咱们对立放在 Context 外面吧,

  1. Context 自身就是上下文, 就具备传递性。
  2. 而且其设计实践上还能够存储有限多的数据。

这样咱们就只须要在在每个函数或者办法中多增加一个 Context 参数就行了, 保护也不便。

func Guanyu(ctx context.Context, n int) {
    // statement
}
func Zhangfei(ctx context.Context, n int) {
    // statement
}

这样看起来, 就清新很多了。 而且这种构造 是不是很相熟

OpenTelemetry 补充阐明

这里以 OpenTelemtry 间隔, 是为了阐明 Context 的值传递的其中一个应用案例。

OpenTelemetry 在链路追踪上的实现,更欠缺, 更弱小。

配合 Jaeger 这类可视化工具后, 服务的所有净收眼底。

相互吹捧, 共同进步

欢送和我一起学习提高, 如果有什么问题, 能够给我私信留言。 或者

  1. 加我好友 线下探讨。
  2. 关注我的 公众号 – 老麦胖熊猫 或者 B站账户 – 老麦胖熊猫 订阅最新文章和更多精彩内容

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据