中间件gin-contrib / gzip

前言

简介

维基百科
Gzip是一种压缩文件格式并且也是一个在类 Unix 上的一种文件解压缩的软件,通常指GNU计划的实现,此处的gzip代表GNU zip。也经常用来表示gzip这种文件格式。软件的作者是Jean-loup Gailly和Mark Adler。在1992年10月31日第一次公开发布,版本号0.1,1993年2月,发布了1.0版本。

原理

Gzip 压缩背后的原理,是在一个文本文件中找出一些重复出现的字符串、临时替换它们,从而使整个文件变小。

根据这个原理,文件中代码的重复率越高,那么压缩的效率就越高,使用 Gzip 的收益也就越大。反之亦然。

Gzip 的优点

减少文件大小。gzip压缩比率在3到10倍左右,可以大大节省服务器的网络带宽。

Gzip 的缺点

开启gzip后会额外的增加很多cpu的开销,会对服务器产生一起压力,同时,客户端解压也需要cpu开销(不过客户端还好),这也是不建议把压缩率设置太高的原因。
对图片的压缩支持不太好,会出现体积变大或图片失真的问题。

安装 gin-contrib/gzip

gin-contrib/gzip是在github上开源的GIN框架中间件,Github地址

下载

在goland终端或者linux、mac等的终端中,使用如下的命令行完成下载。

go get github.com/gin-contrib/gzip

在这里插入图片描述

引用

在项目中使用下面的方式,将中间件包引入到项目工程中。

import "github.com/gin-contrib/gzip"

在这里插入图片描述

使用in-contrib / gzip

典型实例

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/gin-contrib/gzip"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.Use(gzip.Gzip(gzip.DefaultCompression))
	r.GET("/ping", func(c *gin.Context) {
		c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
	})

	// Listen and Server in 0.0.0.0:8080
	r.Run(":8080")
}

自定义排除的扩展

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/gin-contrib/gzip"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedExtensions([]string{".pdf", ".mp4"})))
	r.GET("/ping", func(c *gin.Context) {
		c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
	})

	// Listen and Server in 0.0.0.0:8080
	r.Run(":8080")
}

通过自定义可以排出一些固定的拓展项,例如当服务器返回pdf, mp4两种格式的文件时,不会进行gzip压缩,直接返回,而其他未包含类型的文件,例如xlsx、txt等,会进行gzip压缩,在进行返回。这些都是在中间件层面实现的。

自定义排除路径

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/gin-contrib/gzip"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPaths([]string{"/api/"})))
	r.GET("/ping", func(c *gin.Context) {
		c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
	})

	// Listen and Server in 0.0.0.0:8080
	r.Run(":8080")
}

如标题所示,这里排除的是一些路径,即在/api/下的所有文件都不会被压缩。
可以看下WithExcludedPaths函数定义:

func WithExcludedPaths(args []string) Option {
	return func(o *Options) {
		o.ExcludedPaths = NewExcludedPaths(args)
	}
}

以及NewExcludedPaths函数的定义:

func NewExcludedPaths(paths []string) ExcludedPaths {
	return ExcludedPaths(paths)
}

由于未知的特殊,不要把路径和路由匹配那一套弄混了。

自定义排除路径

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/gin-contrib/gzip"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPathsRegexs([]string{".*"})))
	r.GET("/ping", func(c *gin.Context) {
		c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
	})

	// Listen and Server in 0.0.0.0:8080
	r.Run(":8080")
}

看一下WithExcludedPathsRegexs函数实现:

func WithExcludedPathsRegexs(args []string) Option {
	return func(o *Options) {
		o.ExcludedPathesRegexs = NewExcludedPathesRegexs(args)
	}
}

以及NewExcludedPathesRegexs函数的实现:

func NewExcludedPathesRegexs(regexs []string) ExcludedPathesRegexs {
	result := make([]*regexp.Regexp, len(regexs), len(regexs))
	for i, reg := range regexs {
		result[i] = regexp.MustCompile(reg)
	}
	return result
}

不难发现这里是通过正则的形式输入排除的路径。

example

在example目录下的example。go中存放着事例,可以查看下。
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值