极客前沿

Go 语言 HTTP 调试入门:用 httptrace 看清请求每一步

2026-06-02 01:30
DEV Tutorial
查看原文

学会安装 Go、运行第一个程序,并用 httptrace 跟踪 HTTP 请求的 DNS、TCP、TLS 等阶段,轻松定位慢请求。

准备环境:安装 Go

首先你需要安装 Go(一种编程语言,用来写高性能网络程序)。去 https://go.dev/dl/ 下载对应你操作系统的安装包,双击安装即可。安装完后打开终端(命令提示符),输入 go version,如果看到版本号就说明成功了。

第一个 Go 程序:跑通 Hello World

  1. 新建一个文件夹,比如 hello,在里面创建文件 main.go
  2. 用记事本打开,粘贴以下代码:
    package main
    import "fmt"
    func main() {
        fmt.Println("Hello, Go!")
    }
  3. 在终端中进入该文件夹,运行 go run main.go,看到输出 Hello, Go! 就成功了。

使用 httptrace 跟踪 HTTP 请求

httptrace 是 Go 自带的一个工具包(不需要额外下载),能让你看到一次 HTTP 请求的每个阶段花了多少时间。比如 DNS 查询、建立 TCP 连接、TLS 握手、发送请求等。这对调试慢请求特别有用。

下面是一个简单示例,它会打印每个阶段的时间戳:

Tutorial Image
package main

import (
    "context"
    "fmt"
    "net/http"
    "net/http/httptrace"
    "time"
)

func main() {
    req, _ := http.NewRequest("GET", "https://example.com", nil)
    trace := &httptrace.ClientTrace{
        DNSDone: func(info httptrace.DNSDoneInfo) {
            fmt.Printf("DNS 完成: %v\n", time.Now())
        },
        ConnectDone: func(network, addr string, err error) {
            fmt.Printf("TCP 连接完成: %v\n", time.Now())
        },
        TLSHandshakeDone: func(state tls.ConnectionState, err error) {
            fmt.Printf("TLS 握手完成: %v\n", time.Now())
        },
        GotFirstResponseByte: func() {
            fmt.Printf("收到第一个字节: %v\n", time.Now())
        },
    }
    ctx := httptrace.WithClientTrace(context.Background(), trace)
    req = req.WithContext(ctx)
    client := &http.Client{}
    resp, _ := client.Do(req)
    fmt.Println("状态码:", resp.StatusCode)
}

运行这个程序,你会看到类似下面的输出:

DNS 完成: 2025-03-20 10:00:00.123
TCP 连接完成: 2025-03-20 10:00:00.456
TLS 握手完成: 2025-03-20 10:00:00.789
收到第一个字节: 2025-03-20 10:00:01.234

通过对比时间差,你就能知道哪一步最慢。比如 DNS 花了 0.3 秒,TCP 花了 0.3 秒,TLS 花了 0.3 秒,而第一个字节等了 0.4 秒,说明服务器处理请求比较慢。

常见坑与下一步

  • 坑: 在回调函数里不要做耗时操作(比如打印太多日志、访问数据库),否则会干扰时间测量。
  • 下一步: 你可以把时间差计算出来,当总时间超过某个阈值时自动报警,或者把数据发送到监控系统。

内容来源

DEV Tutorial

发布时间

2026-06-02 01:30

返回 AI技术