限速器
用于 Fiber 的限速器中间件,用于限制对公共 API 和/或端点(例如密码重置)的重复请求。它对于 API 客户端、网页抓取或需要节流的其他任务也非常有用。
注意
此中间件使用我们的 Storage 包,通过单个接口支持各种数据库。此中间件的默认配置将数据保存到内存中,请参见下面的示例了解其他数据库。
注意
默认情况下,此模块不与其他进程/服务器共享状态。
签名
func New(config ...Config) fiber.Handler
示例
导入作为 Fiber Web 框架一部分的中间件包
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/limiter"
)
初始化 Fiber 应用后,可以使用以下方法
// Initialize default config
app.Use(limiter.New())
// Or extend your config for customization
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.
配置
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
下一页 | func(*fiber.Ctx) bool | Next 定义了一个函数,当返回 true 时跳过此中间件。 | nil |
Max | int | 在 Expiration 秒内,达到最大连接数后发送 429 响应。 | 5 |
KeyGenerator | func(*fiber.Ctx) string | KeyGenerator 允许您生成自定义密钥,默认使用 c.IP()。 | 使用 c.IP() 作为默认值的函数 |
Expiration | time.Duration | Expiration 是记录请求在内存中保留的时长。 | 1 * time.Minute |
LimitReached | fiber.Handler | LimitReached 在请求达到限制时调用。 | 发送 429 响应的函数 |
SkipFailedRequests | bool | 当设置为 true 时,StatusCode >= 400 的请求将不计入。 | false |
SkipSuccessfulRequests | bool | 当设置为 true 时,StatusCode < 400 的请求将不计入。 | false |
Storage | fiber.Storage | Store 用于存储中间件的状态。 | 仅用于此进程的内存存储 |
LimiterMiddleware | LimiterHandler | LimiterMiddleware 是实现限速器中间件的结构体。 | 一个新的固定窗口速率限速器 |
Duration (已弃用) | time.Duration | 已弃用:请使用 Expiration 代替 | - |
Store (已弃用) | fiber.Storage | 已弃用:请使用 Storage 代替 | - |
Key (已弃用) | func(*fiber.Ctx) string | 已弃用:请使用 KeyGenerator 代替 | - |
注意
如果自定义存储实现了 Storage
接口,则可以使用自定义存储 - 更多详情和示例可在 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{},
}
自定义存储/数据库
您可以使用我们 storage 包中的任何存储。
storage := sqlite3.New() // From github.com/gofiber/storage/sqlite3
app.Use(limiter.New(limiter.Config{
Storage: storage,
}))