首頁  >  文章  >  後端開發  >  Iris 請求速率限制中介軟體

Iris 請求速率限制中介軟體

Susan Sarandon
Susan Sarandon原創
2024-10-31 11:58:02925瀏覽

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