Golang Go语言发布1.0.0版本:用于Gin和net/http的gzip中间件,再也不担心返回的JSON太大了

发布于 1周前 作者 ionicwang 来自 Go语言

Golang Go语言发布1.0.0版本:用于Gin和net/http的gzip中间件,再也不担心返回的JSON太大了

Golang Gzip Middleware

一个适用于Ginnet/http的 gzip 中间件,可直接用也可定制参数和过滤器,gzip 压缩你的返回。

项目地址: https://github.com/nanmu42/gzip

p.s.

gzip 一般可以将文本返回(例如 JSON )压缩到 30%~70%.

有的人喜欢在反向代理上做压缩,有的人喜欢在程序里就压缩,萝卜青菜各有所爱。:)


更多关于Golang Go语言发布1.0.0版本:用于Gin和net/http的gzip中间件,再也不担心返回的JSON太大了的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

24 回复

已 star

更多关于Golang Go语言发布1.0.0版本:用于Gin和net/http的gzip中间件,再也不担心返回的JSON太大了的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


最怕的就是没配好,程序压缩了一个,代理又解压了,完事再压缩一次

对,这个问题得规避。一般是看[Content-Encoding 和 Transfer Encoding]( https://github.com/nanmu42/gzip/blob/895747f7d735b2d9ee32e8f8847377c1bc59e253/responsefilters.go#-L32-L37).

我 以前也写了个

https://github.com/otamoe/gin-compress

gzip + br 支持 br 的

唔… 提问一下,自己做这件事和靠 nginx 来做这件事,会有哪些差异呢?

#5 Go 哲学之不用 nginx 转发?

用 Caddy 吗 🐶🐶🐶

纯粹是萝卜青菜的喜好问题,并不分孰优孰劣,就结果来说没有什么差异。有选项总比没有选项好一些。

试用了下,还可以,已 star

不过有个小疑问,用 postman 请求的结果是压缩了也没用吗?
因为我发现只有浏览器访问有效果,postman 请求的话 header 里显示已压缩了,但是大小实际没变化

postman 好像会自己解压 gz 的东西,方便你查看

哦……这样啊

如果返回的 header 里有content-encoding: gzip,说明本条返回通过判定,成功被压缩了,Content-Length(如果有)这个时候是指压缩后的大小。

嗯。content-encoding: gzip 是有的。 应该就是楼上他们说的 postman 会解压 gz 吧

一直在用 chi/middleware 里面的 compress,楼主这个也不错

对,可惜它实在不好用,甚至不可用: https://github.com/gin-contrib/gzip/issues

理论上是不是核心代码两行就可以搞定…

<br>unc CompressGZResult(w http.ResponseWriter, r *http.Request, res interface{}) {<br> w.Header().Set("Content-Type", "application/json")<br> w.Header().Set("Content-Encoding", "gzip")<br><br> gz := gzip.NewWriter(w)<br> err := json.NewEncoder(gz).Encode(res)<br>

那我得换一下 哈哈

我几年前就用了这个 gin-contrib/gzip,一直很稳定,这个有啥问题么

我试了下 html 没有压缩 只有 json 压缩了


gzip 压缩本身只是调用官方库,不难。要考虑的主演是另外的问题:
客户端支持解压缩吗?(不支持就不能压缩)
哪些内容类型需要压缩?判断基于 MIME 还是扩展名?(都要判断)
数据流是不是已经压缩过?(看 header )
返回最少要多大才值得压缩?(返回太小,压缩后更大,得不偿失)
使用哪一个 gzip 级别?( cloudflare 做了一堆实验,nginx 直接取 1,这个问题是玄学)
流式传输的返回该如何判断返回大小?( buffer,没别的办法,content-length 这时不存在)

主要是脏活累活,细节问题,性能问题( GC 要友好)。

gin-contrib 只是看上去好,它 issue 里的问题其实就是上面这些点的体现,关键是官方并不怎么上心…… (他 issue 的链接请看楼上,v2 系统不让我再发一遍了)

中间件默认的配置不会盲目压缩,比如返回太小不压缩(得不偿失),客户端不支持不压缩等等。详情可以看下 README 里的默认配置。

有的人喜欢在数据库里做计算,有人的人喜欢在程序里做计算。(滑稽)

针对帖子“Golang Go语言发布1.0.0版本:用于Gin和net/http的gzip中间件,再也不担心返回的JSON太大了”,作为IT领域Go语言方面的专家,我给出以下回复:

Go语言自2009年诞生以来,凭借其简洁的语法、高效的执行速度和强大的并发支持,迅速成为云计算、微服务、区块链等领域的热门编程语言。2012年,Go语言发布了其1.0.0版本,这一版本标志着Go语言的基础语法和核心库已经稳定,为后续发展奠定了坚实基础。

关于帖子中提到的gzip中间件,它对于处理大量数据的Web应用来说确实是一个福音。gzip能够显著减小传输数据的大小,从而提高Web应用的响应速度和用户体验。特别是在返回JSON数据时,gzip中间件可以自动对数据进行压缩,无需开发者手动处理。

对于Gin和net/http这两个流行的Web框架,gzip中间件已经得到了广泛的应用。开发者可以通过引入相关的gzip包,轻松地在自己的项目中实现数据压缩功能。

总之,Go语言的1.0.0版本为Web开发提供了坚实的基础,而gzip中间件的引入则进一步提升了Web应用的性能和用户体验。

回到顶部