必须显式配置http.Server的ReadTimeout、WriteTimeout和IdleTimeout以避免连接堆积;用sync.Pool复用JSON编码器等临时对象减少GC;禁用DefaultServeMux,改用自定义ServeMux或chi/gorilla路由;启用HTTP/2需正确配置TLS并确保NextProtos含"h2"。
http.Server 配置超时和连接池能避免请求堆积默认的 http.Server 没有设置读写超时,一旦后端响应慢或客户端断连不发 FIN,连接会一直 hang 住,最终耗尽文件描述符。必须显式配置 ReadTimeout、WriteTimeout 和 IdleTimeout。
ReadTimeout 控制从读取请求头开始到解析完全部 body 的最大时间WriteTimeout 是从响应头写入完成到整个 response body 发送完毕的时间上限IdleTimeout 决定空闲 HTTP/1.1 连接保持多久(对 HTTP/2 影响小,但依然建议设)server := &http.Server{
Addr: ":8080",
Handler: myHandler,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 30 * time.Second,
}sync.Pool 复用临时对象减少 GC 压力高频 HTTP 服务中,每次请求都 new bytes.Buffer、json.Encoder 或结构体指针,会导致大量小对象分配,触发频繁 GC。用 sync.Pool 缓存可复用实例更有效。
bytes.Buffer)直接放池里,要重置后再放回Finalizer 清理资源var jsonPool = sync.Pool{
New: func() interface{} {
return json.NewEncoder(nil)
},
}
func handleJSON(w http.ResponseWriter, r http.Request) {
enc := jsonPool.Get().(json.Encoder)
defer jsonPool.Put(enc)
w.Header().Set("Content-Type", "application/json")
enc.Reset(w)
enc.Encode(map[string]string{"status": "ok"})}
禁用默认 http.DefaultServeMux,用自定义 http.ServeMux 或第三方路由
直接调用 http.HandleFunc 会注册到全局 http.DefaultServeMux,它内部用线性遍历匹配路由,路径多时性能明显下降;且无法控制中间件顺序、panic 恢复、日志注入等。
http.ServeMux 实例,至少能隔离路由作用域
chi 或 gorilla/mux,支持路由树匹配、中间件链、上下文传递
Go 1.8+ 默认支持 HTTP/2,但仅当使用 TLS 且满足条件时才自动启用。明文 HTTP/1.1 无法升级到 HTTP/2;即使开了 TLS,若证书不合法、ALPN 协商失败或 Server.TLSConfig.NextProtos 未包含 "h2",也会降级。
TLSConfig.NextProtos 包含 "h2" 和 "http/1.1"
http.Transport.MaxIdleConnsPerHost,服务端也要配合 IdleTimeout
HTTP/2 的头部压缩和多路复用对移动端、高延迟网络提升明显,但调试难度高于 HTTP/1.1 —— 抓包看不到明文 header,需用 curl --http2 -v 或浏览器 devtools 的 Network → Protocol 列确认是否生效。