Golang Web性能优化技巧分享
必须显式配置http.Server的ReadTimeout和WriteTimeout防止goroutine堆积;ReadTimeout控制读请求头和体超时(建议5s),WriteTimeout控制写响应总耗时(建议10s),并推荐设置IdleTimeout防长连接滥用。
必须显式配置 http.Server 的 ReadTimeout 和 WriteTimeout 防止 goroutine 堆积;ReadTimeout 控制读请求头和体超时(建议 5s),WriteTimeout 控制写响应总耗时(建议 10s),并推荐设置 IdleTimeout 防长连接滥用。

用 http.Server 的 ReadTimeout 和 WriteTimeout 防止连接拖垮服务
Go 默认不设超时,一个慢客户端或网络抖动就可能让 goroutine 堆积、内存暴涨。必须显式配置读写超时,而不是依赖反向代理(如 Nginx)的超时设置——后者只管转发层,Go 服务内部仍会持续等待。
ReadTimeout控制从 TCP 连接读取请求头和请求体的最大时间,建议设为5 * time.Second;超过则直接关闭连接,不进入路由逻辑WriteTimeout控制写响应的最大时间,建议设为10 * time.Second;注意它包含中间件执行、模板渲染、DB 查询等全部耗时- 避免设成
0或过长(如30s),否则容易触发too many open files或 goroutine 泄漏
server := &http.Server{
Addr: ":8080",
Handler: mux,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 30 * time.Second, // 推荐同时设 IdleTimeout 防长连接滥用
}禁用默认 http.DefaultServeMux,用 http.ServeMux 或第三方路由器时注意并发安全
直接用 http.HandleFunc 会注册到全局 http.DefaultServeMux,它底层是 map + sync.RWMutex,高并发下锁争用明显。更严重的是,它不支持路径参数、中间件链、HTTP 方法精确匹配,容易写出低效甚至错误的路由逻辑。
- 自己 new 一个
http.ServeMux实例,避免全局竞争;但注意它仍不支持通配和变量提取 - 若需路径参数(如
/user/{id}),用chi或gorilla/mux,别手写正则匹配——每次请求都编译正则开销大且易出错 - 所有自定义中间件函数必须是无状态的,避免在闭包里捕获 request / response —— 它们会被复用,可能导致数据污染
响应体压缩用 gzip.Handler 要谨慎:只对文本类内容启用
盲目套一层 gzip.NewHandler 看似简单,实则可能降低性能:压缩本身吃 CPU,而小响应(<1KB)压缩后未必变小,反而增加延迟;图片、PDF 等二进制文件本就压缩过,再压毫无意义,还浪费资源。
- 优先在反向代理层(Nginx / CDN)做 Gzip,让 Go 专注业务逻辑
- 如果必须在 Go 层压缩,用
alexedwards/scs/v2或手动检查Content-Type头,仅对text/、application/json、application/javascript等类型启用 - 设置
GzipLevel为gzip.BestSpeed(1),而非默认的gzip.DefaultCompression(6),平衡速度与压缩率
数据库查询别用 database/sql 的 QueryRow 直接扫全表
很多新手写 db.QueryRow("SELECT * FROM users WHERE id = ?", id),看似没问题,但 * 会让数据库返回所有字段,网络传输、内存分配、GC 压力都上升;更糟的是没加 WHERE 索引或写成 SELECT * FROM logs,直接拖垮整个服务。
- 永远明确列出所需字段,例如
SELECT id, name, email FROM users - 确保
WHERE条件字段有索引,用EXPLAIN检查执行计划;Go 层不要依赖“小数据量暂时没事” - 分页用
LIMIT/OFFSET时注意深度分页性能衰减,改用游标分页(WHERE id > ? ORDER BY id LIMIT ?) - 连接池参数必须调优:
SetMaxOpenConns不宜过大(如 100+),避免数据库拒绝连接;SetMaxIdleConns建议设为SetMaxOpenConns的 1/4~1/2
实际压测中,去掉 SELECT * 和补上索引,QPS 常提升 3~5 倍;而一个没设 WriteTimeout 的服务,在慢日志场景下可能 2 分钟内耗尽 65535 个文件描述符。这些点不难改,但上线前常被跳过。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













