首页 >后端开发 >Golang >Iris 请求速率限制中间件

Iris 请求速率限制中间件

Susan Sarandon
Susan Sarandon原创
2024-10-31 11:58:02986浏览

Request Rate Limiting Middleware for Iris

概述

速率中间件为 Iris Web 框架提供速率限制功能。它允许开发人员控制对其应用程序的请求速率,确保公平使用并防止滥用。中间件基于令牌桶算法,这是一种流行的限速方法。

安装

要使用费率中间件,您需要将其导入到您的 Iris 应用程序中:

import "github.com/kataras/iris/v12/middleware/rate"

用法

基本设置

要使用速率限制器,您需要创建一个 Iris 应用程序并注册中间件。以下是如何设置速率限制器的示例:

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    limit := rate.Limit(1, 5, rate.PurgeEvery(time.Minute, 5*time.Minute))
    app.Use(limit)

    app.Get("/", index)
    app.Get("/other", other)

    app.Listen(":8080")
}

func index(ctx iris.Context) {
    ctx.HTML("<h1>Index Page</h1>")
}

func other(ctx iris.Context) {
    ctx.HTML("<h1>Other Page</h1>")
}

此示例允许每秒 1 个请求,最大突发大小为 5。如果旧条目 5 分钟内没有出现,它还会每分钟清除一次。

使用率.各帮手

这个例子演示了如何使用速率。每个助手设置速率限制器:

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    // Use rate.Every helper to set up the rate limiter.
    limit := rate.Limit(rate.Every(time.Minute), 5)
    app.Use(limit)

    app.Get("/", index)
    app.Get("/other", other)

    app.Listen(":8080")
}

func index(ctx iris.Context) {
    ctx.HTML("<h1>Index Page</h1>")
}

func other(ctx iris.Context) {
    ctx.HTML("<h1>Other Page</h1>")
}

使用API​​密钥进行速率限制

此示例演示如何设置使用 API 密钥而不是客户端远程 IP 地址的速率限制器:

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    // Use API key for rate limiting.
    app.Use(useAPIKey)

    limit := rate.Limit(rate.Every(time.Minute), 300, rate.PurgeEvery(5*time.Minute, 15*time.Minute))
    app.Use(limit)

    app.Get("/list", list)

    app.Listen(":8080")
}

func useAPIKey(ctx iris.Context) {
    apiKey := ctx.Header("X-API-Key")
    if apiKey == "" {
        ctx.StopWithStatus(iris.StatusForbidden)
        return
    }

    rate.SetIdentifier(ctx, apiKey)
    ctx.Next()
}

func list(ctx iris.Context) {
    ctx.JSON(iris.Map{"key": "value"})
}

自定义超出处理程序

此示例演示如何设置超出速率限制时执行的自定义处理程序:

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    // Set a custom exceed handler.
    limit := rate.Limit(1, 5, rate.ExceedHandler(func(ctx iris.Context) {
        ctx.StopWithStatus(429)
    }))
    app.Use(limit)

    app.Get("/", index)
    app.Get("/other", other)

    app.Listen(":8080")
}

func index(ctx iris.Context) {
    ctx.HTML("<h1>Index Page</h1>")
}

func other(ctx iris.Context) {
    ctx.HTML("<h1>Other Page</h1>")
}

自定义客户数据

此示例演示如何为每个客户端存储自定义数据:

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    // Store custom data for each client.
    limit := rate.Limit(1, 5, rate.ClientData(func(ctx iris.Context) any {
        return ctx.RemoteAddr()
    }))
    app.Use(limit)

    app.Get("/", index)
    app.Get("/other", other)

    app.Listen(":8080")
}

func index(ctx iris.Context) {
    ctx.HTML("<h1>Index Page</h1>")
}

func other(ctx iris.Context) {
    ctx.HTML("<h1>Other Page</h1>")
}

解释

  • 速率限制:rate.Limit 函数用于创建新的速率限制器。它需要三个参数:

    • limit:每秒允许的最大请求数。
    • 突发:最大突发大小。
    • options:附加选项,例如用于清理旧条目的 PurgeEvery。
  • 令牌桶算法:该算法通过维护令牌桶来控制请求速率。每个请求都会消耗一个令牌,并且令牌会以固定的速率添加到桶中。如果存储桶为空,则请求被拒绝。

令牌桶算法

令牌桶算法是一种简单有效的控制请求速率的方法。其工作原理如下:

  1. 初始化:使用一定数量的令牌初始化存储桶。
  2. 令牌添加:令牌以固定速率添加到存储桶中。
  3. 请求处理:每个请求都会消耗一个令牌。如果存储桶为空,则请求被拒绝。
  4. 突发处理:桶可以容纳最大数量的令牌,允许突发流量。

更多详细信息,请参阅维基百科关于令牌桶的文章。

结论

该中间件提供了一种强大而灵活的方法来在 Iris 应用程序中实现速率限制。通过使用令牌桶算法,保证公平使用并防止滥用,使您的应用更加可靠和安全。

更多示例和详细使用方法,请参考Iris官方文档。

以上是Iris 请求速率限制中间件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn