Limiter

Dies ist ein Middleware für Fiber, das verwendet wird, um sich wiederholende Anfragen an öffentliche APIs und/oder Endpunkte (z. B. Zurücksetzen des Passworts) zu begrenzen. Es ist auch nützlich, um die Rate von API-Clients, Web-Crawlern oder anderen Aufgaben zu begrenzen, die eine Begrenzung erfordern.

Hinweis: Diese Middleware verwendet unser Storage-Paket zur Unterstützung verschiedener Datenbanken durch eine einheitliche Schnittstelle. Die Standardkonfiguration speichert Daten im Speicher, und Sie können das untenstehende Beispiel verwenden, um andere Datenbanken zu sehen.

Hinweis: Diese Modul teilt standardmäßig keinen Status mit anderen Prozessen/Servern.

Signatur

func New(config ...Config) fiber.Handler

Beispiel

Importieren Sie das Middleware-Paket als Teil des Fiber-Web-Frameworks:

import (
  "github.com/gofiber/fiber/v2"
  "github.com/gofiber/fiber/v2/middleware/limiter"
)

Nachdem Sie die Fiber-App erstellt haben, können Sie die folgenden Optionen verwenden:

// Initialisierung mit Standardkonfiguration
app.Use(limiter.New())

// Oder erweitern Sie mit benutzerdefinierter Konfiguration
app.Use(limiter.New(limiter.Config{
    Next: func(c *fiber.Ctx) bool {
        return c.IP() == "127.0.0.1"
    },
    Max:          20,
    Expiration:     30 * time.Second,
    KeyGenerator:          func(c *fiber.Ctx) string {
        return c.Get("x-forwarded-for")
    },
    LimitReached: func(c *fiber.Ctx) error {
        return c.SendFile("./toofast.html")
    },
    Storage: myCustomStorage{},
}))

Gleitendes Fenster

Sie können den Gleitfensteralgorithmus aktivieren, anstelle des Standardalgorithmus für feste Fenster.

Die Beispielkonfiguration sieht wie folgt aus:

app.Use(limiter.New(limiter.Config{
    Max:            20,
    Expiration:     30 * time.Second,
    LimiterMiddleware: limiter.SlidingWindow{},
}))

Das bedeutet, dass jedes Fenster das vorherige Fenster berücksichtigen wird (falls vorhanden). Die Formel für die gegebene Rate ist:

GewichtDesVorherigenFensters = Anzahl der Anfragen im vorherigen Fenster * (whenNewWindow / Expiration)
rate = GewichtDesVorherigenFensters + Anzahl der Anfragen im aktuellen Fenster.

Konfiguration

Eigenschaft Typ Beschreibung Standard
Next func(*fiber.Ctx) bool Next definiert eine Funktion, um dieses Middleware zu überspringen, wenn true zurückgegeben wird. nil
Max int Die maximale Anzahl von Verbindungen innerhalb von Expiration Sekunden, gibt eine 429-Antwort zurück, wenn überschritten. 5
KeyGenerator func(*fiber.Ctx) string KeyGenerator ermöglicht es Ihnen, benutzerdefinierte Schlüssel zu generieren und verwendet standardmäßig c.IP(). Funktion, die c.IP() als Standardwert verwendet
Expiration time.Duration Expiration ist die Zeit, um Anforderungsaufzeichnungen im Speicher zu behalten. 1 * time.Minute
LimitReached fiber.Handler Wird aufgerufen, wenn die Begrenzung erreicht ist. Funktion, die eine 429-Antwort sendet
SkipFailedRequests bool Wenn true, werden Anfragen mit StatusCode >= 400 nicht gezählt. false
SkipSuccessfulRequests bool Wenn true, werden Anfragen mit StatusCode < 400 nicht gezählt. false
Storage fiber.Storage Speicher, der für das Speichern des Status der Middleware verwendet wird. Speicher im Speicher nur für den aktuellen Prozess
LimiterMiddleware LimiterHandler LimiterMiddleware ist die Struktur, die das Limiter-Middleware implementiert. Ein neuer fester Fenster-Rate-Limiter
Duration (Veraltet) time.Duration Veraltet: Verwenden Sie stattdessen Expiration. -
Store (Veraltet) fiber.Storage Veraltet: Verwenden Sie stattdessen Storage. -
Key (Veraltet) func(*fiber.Ctx) string Veraltet: Verwenden Sie stattdessen KeyGenerator. -

Hinweis: Wenn benutzerdefinierte Speicher die Storage-Schnittstelle implementiert, können Sie benutzerdefinierten Speicher verwenden. Für weitere Informationen und Beispiele verweisen Sie bitte auf store.go.

Standardkonfiguration

var ConfigDefault = Config{
    Max:        5,
    Expiration: 1 * time.Minute,
    KeyGenerator: func(c *fiber.Ctx) string {
        return c.IP()
    },
    LimitReached: func(c *fiber.Ctx) error {
        return c.SendStatus(fiber.StatusTooManyRequests)
    },
    SkipFailedRequests: false,
    SkipSuccessfulRequests: false,
    LimiterMiddleware: FixedWindow{},
}

Benutzerdefinierter Speicher/Datenbank

Sie können jede Speichermethode in unserem Speicher Paket verwenden.

speicher := sqlite3.New() // Von github.com/gofiber/storage/sqlite3
app.Use(limiter.New(limiter.Config{
    Speicher: speicher,
}))