限流

未匹配的标注

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{},
}

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/gofiber/2.x/lim...

译文地址:https://learnku.com/docs/gofiber/2.x/lim...

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 查看所有版本


暂无话题~