返回

链路追踪与调用链监控利器pinpoint之结构与用法介绍

后端

在上一篇文章中,我们完成了七天的学习,今天是这个系列文章的第九天,我们将要讲的内容是链路追踪。一个庞大的服务往往会经历多次调用才能完成,随着系统的日益复杂和服务边界越来越模糊,会出现的问题也日益增多。链路追踪就是通过在分布式系统中每一个请求都赋予一个唯一的id,通过这个id追踪请求在系统内部各个组件之间的传播路径,实现对分布式系统的诊断。

链路追踪的优点:

  1. 可以快速定位服务问题:链路追踪可以快速定位请求在哪个服务组件出了问题,从而快速定位问题服务,减少问题修复时间。
  2. 可以分析服务性能:链路追踪可以分析每个请求在每个服务组件上的耗时,从而快速发现服务性能瓶颈。
  3. 可以分析服务依赖关系:链路追踪可以分析服务之间互相调用的关系,从而快速了解服务的依赖关系。

Pinpoint

链路追踪系统有很多,而pinpoint是spring cloud下的一个分布式链路追踪系统,它基于日志的方式进行追踪,通过记录日志的方式捕获链路的相关信息,然后通过日志分析工具对链路日志进行查询和分析。

Pinpoint 结构

Pinpoint 主要由以下组件组成:

  1. Pinpoint Agent:Pinpoint Agent 是运行在每个服务的 Java 虚拟机上,负责收集和发送链路追踪数据。
  2. Pinpoint Collector:Pinpoint Collector 负责接收和存储 Pinpoint Agent 发送的链路追踪数据。
  3. Pinpoint Web:Pinpoint Web 是一个 Web 管理界面,用于查看和分析链路追踪数据。

Pinpoint 用法

  1. 在每个服务的 Java 虚拟机上安装 Pinpoint Agent。
  2. 在 Pinpoint Collector 上配置 Pinpoint Agent 的地址。
  3. 启动 Pinpoint Collector。
  4. 在 Pinpoint Web 上配置 Pinpoint Collector 的地址。
  5. 启动 Pinpoint Web。

在 go-zero 中使用 pinpoint

go-zero 中有一个 pinpoint 模块,可以帮助我们快速集成 pinpoint。

  1. 首先,需要在 go.mod 中添加 pinpoint 模块:
require (
    github.com/zeromicro/go-zero v1.3.7
    github.com/zeromicro/go-zero/core/trace/pinpoint v0.0.0-20220613193835-f2fe05d0d7da
)
  1. 然后,在服务的 main 函数中,需要初始化 pinpoint:
func main() {
    // 配置pinpoint collector的地址
    collector := "http://127.0.0.1:9999"
    // 指定pinpoint server name
    serverName := "OrderService"
    // 启动pinpoint
    trace.StartAgent(collector, serverName)

    // 其他代码...
}
  1. 在服务的请求处理函数中,需要添加 pinpoint 的日志记录:
func handleRequest(w http.ResponseWriter, r *http.Request) {
    // 调用pinpoint记录接口
    span, _ := trace.NewSpan(r.Context(), "handleRequest")
    defer span.Finish()

    // 其他代码...
}
  1. 启动服务,然后访问 Pinpoint Web,就可以看到服务链路追踪信息了。

总结

在本文中,我们介绍了链路追踪以及 pinpoit 的结构和用法,希望大家能够理解并掌握。在下一篇章中,我们将介绍微服务中的认证与授权。