Go 语言需手动集成 HTTP 响应压缩,常用 gzip 中间件包装 handler,检查 Accept-Encoding、设 Content-Encoding/Vary 头,跳过小响应(≥1KB)及不可压缩类型;Brotli 更优但需第三方库;需协同 HTTP/2、CDN 与缓存策略。
Go 语言原生 net/http 包支持 HTTP 响应压缩,但默认不启用。要减少网络传输开销,需手动集成 gzip(或 zlib、br)压缩逻辑,核心在于拦截响应体、压缩内容、设置正确 Header,并兼顾客户端兼容性与性能开销。
最常用方式是用中间件包装 http.Handler,在写入响应前检查 Accept-Encoding 并动态压缩。推荐使用标准库的 gzip 包,无需第三方依赖:
http.ResponseWriter 接口的 wrapper,重写 WriteHeader 和 Write 方法WriteHeader 中判断客户端是否支持 gzip(检查 r.Header.Get("Accept-Encoding"))gzip.Writer 并替换原始 ResponseWriter
Content-Encoding: gzip 和 Vary: Accept-Encoding 头压缩极小响应(如 JSON 短响应、空响应)反而增加 CPU 开销且可能变大。建议设置阈值(如 ≥ 1KB)再启用压缩:
image/*、application/octet-stream、font/* 等Content-Type,对 text/ht
ml、application/json、text/css、application/javascript 等文本类型启用压缩Brotli 比 gzip 压缩率更高、解压更快,现代浏览器广泛支持。Go 标准库不内置 brotli,但可用 github.com/andybalholm/brotli:
Accept-Encoding,按 br > gzip > none 优先级选择算法br.NewWriterLevel(w, 4)),平衡速度与体积Content-Encoding 和 Vary 头准确反映实际编码方式压缩效果受协议与缓存影响,需协同优化:
Content-Encoding
Cache-Control: public, must-revalidate,但注意不同编码版本需独立缓存(Vary: Accept-Encoding 是关键)不复杂但容易忽略。关键是让压缩逻辑透明、可控、可退化,而不是一刀切开启。