速率中间件为 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 密钥而不是客户端远程 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 函数用于创建新的速率限制器。它需要三个参数:
令牌桶算法:该算法通过维护令牌桶来控制请求速率。每个请求都会消耗一个令牌,并且令牌会以固定的速率添加到桶中。如果存储桶为空,则请求被拒绝。
令牌桶算法是一种简单有效的控制请求速率的方法。其工作原理如下:
更多详细信息,请参阅维基百科关于令牌桶的文章。
该中间件提供了一种强大而灵活的方法来在 Iris 应用程序中实现速率限制。通过使用令牌桶算法,保证公平使用并防止滥用,使您的应用更加可靠和安全。
更多示例和详细使用方法,请参考Iris官方文档。
以上是Iris 请求速率限制中间件的详细内容。更多信息请关注PHP中文网其他相关文章!