限流
Limiter
用于 Fiber 的限制器中间件,用于限制对公共 API 和 / 或端点的重复请求,如密码重置等。对于API客户端、网络爬行或其他需要节流的任务也很有用。
注意:该模块默认不与其他进程/服务器共享状态。
目录
签名
func New(config ...Config) fiber.Handler
示例
导入作为 Fiber 网络框架一部分的中间件包
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/limiter"
)
在你启动你的Fiber应用程序后,你可以使用以下可能性。
// 默认的中间件配置
app.Use(limiter.New())
// 或者扩展你的配置进行定制
app.Use(limiter.New(limiter.Config{)
Next: func(c *fiber.Ctx) bool {
return c.IP() == "127.0.0.1"
},
Max:20。
Expiration: 30 * time.Second,
KeyGenerator: func(c *fiber.Ctx) string {
return c.Get("x-forwarded-for")
},
LimitReached: func(c *fiber.Ctx) error {
return c.SendFile("./toofast.html")
},
Storage:myCustomStorage{}。
}))
滑动窗口
你可以启用 滑动窗口 算法,而不是使用标准的固定窗口算法。
这种配置的一个例子是。
app.Use(limiter.New(limiter.Config{
Max: 20,
Expiration: 30 * time.Second,
LimiterMiddleware: limiter.SlidingWindow{}
}))
这意味着每个窗口都会考虑到之前的窗口(如果有的话)。给出的速率公式是。
weightOfPreviousWindpw = previous window's amount request * (whenNewWindow / Expiration)
rate = weightOfPreviousWindpw + current window's amount request.
配置
// Config定义了中间件的配置。
type Config struct {
// 下一步定义了一个函数,当返回true时,跳过这个中间件。
//
// 可选。默认值:nil
Next func(c *fiber.Ctx) bool
// 在发送429响应之前的`Duration`秒内的最大连接数
//
// 默认值: 5
Max int
// KeyGenerator允许你生成自定义密钥,默认使用c.IP()。
//
// 默认:func(c *fiber.Ctx) string {
// 返回 c.IP()
// }
keyGenerator func(*fiber.Ctx) string
// 过期时间是指在内存中保留请求记录的时间。
//
// 默认:1 * time.Minute
Expiration time.Duration
// 当一个请求达到极限时,LimitReached 被调用。
//
// 默认: func(c *fiber.Ctx) error {
// return c.SendStatus(fiber.StatusTooManyRequests)
// }
LimitReached fiber.Handler
// 当设置为true时,StatusCode >= 400 的请求不会被计算在内。
//
// 默认值:false
SkipFailedRequests bool
// 当设置为 "true "时,StatusCode < 400 的请求将不被计算在内。
//
// 默认值:false
SkipSuccessfulRequests bool
// 存储用于存储中间件的状态。
//
// 默认:只为该进程提供内存存储。
Storage fiber.Storage
// 限制器中间件(LimiterMiddleware)是实现限制器中间件的结构。
//
// 默认:一个新的固定窗口速率限制器
LimiterMiddleware LimiterHandler
}
如果实现了 "存储 "接口,就可以使用自定义存储 - 更多细节和例子可以在store.go
中找到。
默认配置
var ConfigDefault = Config{
Max: 5,
Expiration: 1 * time.Minute,
KeyGenerator: func(c *fiber.Ctx) string {
return c.IP()
},
LimitReached: func(c *fiber.Ctx) error {
return c.SendStatus(fiber.StatusTooManyRequests)
},
SkipFailedRequests: false,
SkipSuccessfulRequests: false,
LimiterMiddleware: FixedWindow{},
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。