ホームページ >バックエンド開発 >Golang >Iris のリクエストレート制限ミドルウェア

Iris のリクエストレート制限ミドルウェア

Susan Sarandon
Susan Sarandonオリジナル
2024-10-31 11:58:02987ブラウズ

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>")
}

この例では、最大バースト サイズ 5 で 1 秒あたり 1 つのリクエストが許可されます。また、5 分間表示されなかった古いエントリは 1 分ごとに削除されます。

rate.Every ヘルパーの使用

この例は、レートの使用方法を示しています。レート リミッターを設定するためのすべてのヘルパー:

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 アドレスの代わりに API キーを使用するレート リミッターを設定する方法を示しています。

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 関数は、新しいレート リミッターを作成するために使用されます。 3 つのパラメータを取ります:

    • 制限: 1 秒あたりに許可されるリクエストの最大数。
    • バースト: 最大バースト サイズ。
    • オプション: 古いエントリをクリーンアップするための PurgeEvery などの追加オプション。
  • トークン バケット アルゴリズム: このアルゴリズムは、トークンのバケットを維持することによってリクエストのレートを制御します。各リクエストはトークンを消費し、トークンは固定レートでバケットに追加されます。バケットが空の場合、リクエストは拒否されます。

トークンバケットアルゴリズム

トークン バケット アルゴリズムは、リクエストのレートを制御するためのシンプルかつ効率的な方法です。次のように動作します:

  1. 初期化: バケットは特定の数のトークンで初期化されます。
  2. トークンの追加: トークンは固定レートでバケットに追加されます。
  3. リクエスト処理: 各リクエストはトークンを消費します。バケットが空の場合、リクエストは拒否されます。
  4. バースト処理: バケットは最大数のトークンを保持できるため、トラフィックのバーストに対応できます。

詳細については、トークン バケットに関するウィキペディアの記事を参照してください。

結論

このミドルウェアは、Iris アプリケーションにレート制限を実装するための堅牢かつ柔軟な方法を提供します。トークン バケット アルゴリズムを使用することで、公正な使用が保証され、悪用が防止され、アプリケーションの信頼性と安全性が高まります。

その他の例と詳細な使用法については、Iris の公式ドキュメントを参照してください。

以上がIris のリクエストレート制限ミドルウェアの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。