必须显式配置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清理资源 - 适合缓存:JSON 序列化器、HTTP header map、短生命周期 DTO 结构体
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 恢复、日志注入等。
网趣网上购物系统HTML静态版
网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使
下载
立即学习“go语言免费学习笔记(深入)”;
- 显式创建
http.ServeMux实例,至少能隔离路由作用域 - 生产环境建议用
chi或gorilla/mux,支持路由树匹配、中间件链、上下文传递 - 避免在 handler 里做同步阻塞操作(如直连 DB 查询),应改用 context-aware 超时控制
启用 HTTP/2 和连接复用,但注意 TLS 配置影响
Go 1.8+ 默认支持 HTTP/2,但仅当使用 TLS 且满足条件时才自动启用。明文 HTTP/1.1 无法升级到 HTTP/2;即使开了 TLS,若证书不合法、ALPN 协商失败或 Server.TLSConfig.NextProtos 未包含 "h2",也会降级。
- 确保
TLSConfig.NextProtos包含"h2"和"http/1.1" - 避免在 TLS 握手阶段做重载或动态证书加载,会成为瓶颈
- 客户端复用连接依赖
http.Transport.MaxIdleConnsPerHost,服务端也要配合IdleTimeout
HTTP/2 的头部压缩和多路复用对移动端、高延迟网络提升明显,但调试难度高于 HTTP/1.1 —— 抓包看不到明文 header,需用 curl --http2 -v 或浏览器 devtools 的 Network → Protocol 列确认是否生效。










