Go 语言 HTTP 调试入门:用 httptrace 看清请求每一步
学会安装 Go、运行第一个程序,并用 httptrace 跟踪 HTTP 请求的 DNS、TCP、TLS 等阶段,轻松定位慢请求。
准备环境:安装 Go
首先你需要安装 Go(一种编程语言,用来写高性能网络程序)。去 https://go.dev/dl/ 下载对应你操作系统的安装包,双击安装即可。安装完后打开终端(命令提示符),输入 go version,如果看到版本号就说明成功了。
第一个 Go 程序:跑通 Hello World
- 新建一个文件夹,比如
hello,在里面创建文件main.go。 - 用记事本打开,粘贴以下代码:
package main import "fmt" func main() { fmt.Println("Hello, Go!") } - 在终端中进入该文件夹,运行
go run main.go,看到输出Hello, Go!就成功了。
使用 httptrace 跟踪 HTTP 请求
httptrace 是 Go 自带的一个工具包(不需要额外下载),能让你看到一次 HTTP 请求的每个阶段花了多少时间。比如 DNS 查询、建立 TCP 连接、TLS 握手、发送请求等。这对调试慢请求特别有用。
下面是一个简单示例,它会打印每个阶段的时间戳:
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