Maison > développement back-end > Golang > Intergiciel de limitation de débit de requêtes pour Iris

Intergiciel de limitation de débit de requêtes pour Iris

Susan Sarandon
Libérer: 2024-10-31 11:58:02
original
1015 Les gens l'ont consulté

Request Rate Limiting Middleware for Iris

Aperçu

Le middleware de taux fournit des capacités de limitation de débit pour le framework Web Iris. Il permet aux développeurs de contrôler le taux de requêtes adressées à leurs applications, garantissant ainsi une utilisation équitable et évitant les abus. Le middleware est basé sur l'algorithme du token bucket, qui est une méthode populaire pour limiter le débit.

Installation

Pour utiliser le middleware de tarification, vous devez l'importer dans votre application Iris :

import "github.com/kataras/iris/v12/middleware/rate"
Copier après la connexion

Usage

Configuration de base

Pour utiliser le limiteur de débit, vous devez créer une application Iris et enregistrer le middleware. Vous trouverez ci-dessous un exemple de configuration du limiteur de débit :

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>")
}
Copier après la connexion

Cet exemple autorise 1 requête par seconde avec une taille de rafale maximale de 5. Il purge également les anciennes entrées toutes les minutes si elles n'ont pas été vues depuis 5 minutes.

Utilisation de rate.Every Helper

Cet exemple montre comment utiliser le taux. Chaque assistant pour configurer un limiteur de débit :

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>")
}
Copier après la connexion

Utilisation de la clé API pour la limitation du débit

Cet exemple montre comment configurer un limiteur de débit qui utilise une clé API au lieu de l'adresse IP distante du client :

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"})
}
Copier après la connexion

Gestionnaire de dépassement personnalisé

Cet exemple montre comment définir un gestionnaire personnalisé à exécuter lorsque la limite de débit est dépassée :

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>")
}
Copier après la connexion

Données client personnalisées

Cet exemple montre comment stocker des données personnalisées pour chaque client :

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>")
}
Copier après la connexion

Explication

  • Rate Limiting : La fonction rate.Limit est utilisée pour créer un nouveau limiteur de débit. Cela prend trois paramètres :

    • limite : le nombre maximum de requêtes autorisées par seconde.
    • burst : la taille maximale de la rafale.
    • options : options supplémentaires telles que PurgeEvery pour nettoyer les anciennes entrées.
  • Algorithme de seau de jetons : Cet algorithme contrôle le taux de requêtes en maintenant un seau de jetons. Chaque requête consomme un jeton et les jetons sont ajoutés au compartiment à un taux fixe. Si le seau est vide, la demande est refusée.

Algorithme de compartiment de jetons

L'algorithme du token bucket est un moyen simple et efficace de contrôler le taux de requêtes. Cela fonctionne comme suit :

  1. Initialisation : Un bucket est initialisé avec un certain nombre de tokens.
  2. Ajout de jetons : Les jetons sont ajoutés au compartiment à un taux fixe.
  3. Gestion des requêtes : Chaque requête consomme un jeton. Si le bucket est vide, la demande est refusée.
  4. Gestion des rafales : le bucket peut contenir un nombre maximum de jetons, permettant des rafales de trafic.

Pour plus de détails, reportez-vous à l'article Wikipédia sur Token Bucket.

Conclusion

Ce middleware offre un moyen robuste et flexible de mettre en œuvre une limitation de débit dans vos applications Iris. En utilisant l'algorithme du token bucket, il garantit une utilisation équitable et évite les abus, rendant votre application plus fiable et sécurisée.

Pour plus d'exemples et une utilisation détaillée, reportez-vous à la documentation officielle d'Iris.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal