🚇

常用中间件

内置中间件

 

异常恢复

一般只在未知输入和不可靠请求时使用
r.Use(znet.Recovery(func(c *znet.Context, err error) { zlog.Error("Recovery", err) }))
 

定义错误返回

r.Use(znet.RewriteErrorHandler(func(c *znet.Context, err error) { c.String(500, err.Error()) })) // 用于在处理路由里返回错误的请求 r.Any("/", func() (string, error) { return "", errors.New("非法请求") })
 

超时控制

请求超过指定时长直接返回504或自定义返回信息
import "github.com/sohaha/zlsgo/znet/timeout" // 默认超时返回的 HTTP 状态码为:504 // 后面全部路由都5秒后超时 r.Use(timeout.New(5 * time.Second)) // 单独一个请求设置超时5秒后超时 r.GET("/timeout_1", timeout.New(5), func(c *znet.Context) { c.String(200, "Hello world") }) // 自定义返回内容 r.GET("/timeout_2", timeout.New(5,func(c *znet.Context) { c.String(200, "Has timed out") }), func(c *znet.Context) { c.String(200, "Hello world") })
 

跨域请求

import "github.com/sohaha/zlsgo/znet/cors" r.Use(cors.Default()) // 如需指定域名 r.Use(cors.New(&cors.Config{ // 支持模糊匹配,下面表示支持 https://qq.com 与 (任意字符)://w(任意一个字符).qq.com Domains: []string{"https://qq.com","*://w?.qq.com"}, Methods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, Headers: []string{"X-Requested-With"}, CustomHandler: func(conf *cors.Config, c *znet.Context){}, })
 

Gzip 压缩

import "github.com/sohaha/zlsgo/znet/gzip" // 直接使用默认配置 r.Use(gzip.Default()) // 自定义选项 r.Use(gzip.New(gzip.Config{ CompressionLevel: 7, PoolMaxSize: 200, MinContentLength: 1024, }))
 

brotli 压缩

import "github.com/zlsgo/brotli" // 直接使用默认配置 r.Use(brotli.Default()) // 自定义选项 r.Use(brotli.New(gzip.Config{ CompressionLevel: 7, PoolMaxSize: 200, MinContentLength: 1024, }))
 

限制最大并发数

import "github.com/sohaha/zlsgo/znet/limiter" // 最大并发数 100 limiterHandle := limiter.New(100, func(c *znet.Context) { c.Abort(504) }) // 设置当前全部路由 r.Use(limiterHandle) // or 设置指定路由 r.GET("/test", func(c *znet.Context) { c.String(200, "Hello World") },limiterHandle)
 

根据条件限流

import "github.com/sohaha/zlsgo/znet/limiter" // 假如需要限制每个 IP 每秒的访问数 rule := limiter.NewRule() // 每秒只允许 30 个请求 rule.AddRule(time.Second, 30) limiterHandle := func(c *znet.Context) { // 这里根据 IP 进行限制 // 如果想限制根据用户名限制:rule.AllowVisit("key") if !rule.AllowVisitByIP(c.GetClientIP()) { c.Abort(http.StatusTooManyRequests) return } c.Next() } // 设置中间件 r.Use(limiterHandle) // or 设置指定路由 r.GET("/test", func(c *znet.Context) { c.String(200, "Hello World") },limiterHandle)
 

Basic Auth 认证

import "github.com/sohaha/zlsgo/znet/auth" // 设置账号 accounts := auth.Accounts{ "manage": "123456", } // 设置中间件 r.Use(auth.New(accounts))
 

路由缓存

import "github.com/sohaha/zlsgo/znet/cache" // 设置中间件 r.Use(cache.New(func(conf *cache.Config) { // 缓存配置 // 过期时间,十分钟 conf.Expiration = time.Minute * 10 // 自定义一些页面的缓存规则 conf.Custom: func(c *znet.Context) (key string, expiration time.Duration) { // 返回空表示不使用缓存 return cache.QueryKey(c), 0 }, }))