Ogranicznik

To middleware dla Fiber, które służy do ograniczania powtarzających się żądań do publicznych interfejsów API i/lub punktów końcowych (np. resetowania hasła). Jest również przydatne do ograniczania częstotliwości żądań klientów API, robotów internetowych lub innych zadań wymagających ograniczenia częstotliwości.

Uwaga: To middleware korzysta z naszego pakietu Storage do obsługi różnych baz danych za pomocą jednolitego interfejsu. Domyślna konfiguracja przechowuje dane w pamięci, a można odnieść się do poniższego przykładu, aby zobaczyć inne bazy danych.

Uwaga: Domyślnie ten moduł nie udostępnia stanu innym procesom/serwerom.

Sygnatura

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

Przykład

Importowanie pakietu middleware jako część frameworka internetowego Fiber:

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

Po utworzeniu aplikacji Fiber, można użyć poniższych opcji:

// Inicjalizacja z domyślną konfiguracją
app.Use(limiter.New())

// Lub rozszerzenie niestandardową konfiguracją
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{},
}))

Okno przesuwne

Możesz włączyć algorytm okna przesuwnego zamiast używać standardowego algorytmu okna stałego.

Przykładowa konfiguracja wygląda następująco:

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

Oznacza to, że każde okno będzie uwzględniać poprzednie okno (jeśli istnieje). Formuła dla podanej stopy to:

wagaPoprzedniegoOkna = ilość żądań poprzedniego okna * (whenNewWindow / Expiration)
stopy = wagaPoprzedniegoOkna + ilość żądań bieżącego okna

Konfiguracja

Właściwość Typ Opis Domyślnie
Next func(*fiber.Ctx) bool Next definiuje funkcję pomijania tego middleware, zwracającą true. nil
Max int Maksymalna liczba połączeń w ciągu Expiration sekund, zwracająca odpowiedź 429 w przypadku przekroczenia. 5
KeyGenerator func(*fiber.Ctx) string KeyGenerator umożliwia generowanie niestandardowych kluczy, domyślnie używając c.IP(). Funkcja korzystająca z c.IP() jako domyślnej wartości
Expiration time.Duration Expiration to czas przechowywania rekordów żądań w pamięci. 1 * time.Minute
LimitReached fiber.Handler Wywoływana, gdy limit zostanie osiągnięty. Funkcja wysyłająca odpowiedź 429
SkipFailedRequests bool Jeśli true, nie uwzględniaj żądań ze statusem StatusCode >= 400. false
SkipSuccessfulRequests bool Jeśli true, nie uwzględniaj żądań ze statusem StatusCode < 400. false
Storage fiber.Storage Magazyn używany do przechowywania stanu middleware. Magazyn pamięci tylko dla bieżącego procesu
LimiterMiddleware LimiterHandler LimiterMiddleware to struktura implementująca middleware ograniczające. Nowy ogranicznik stopy okna stałego
Duration (Przestarzałe) time.Duration Przestarzałe: Użyj zamiast tego Expiration. -
Store (Przestarzałe) fiber.Storage Przestarzałe: Użyj zamiast tego Storage. -
Klucz (Przestarzałe) func(*fiber.Ctx) string Przestarzałe: Użyj zamiast tego KeyGenerator. -

Uwaga: Jeśli niestandardowy magazyn implementuje interfejs Storage, można użyć niestandardowego magazynu - więcej informacji i przykłady można znaleźć w store.go.

Domyślna konfiguracja

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{},
}

Dostosowane Przechowywanie/Baza danych

Możesz wykorzystać dowolną metodę przechowywania w naszym pakiecie storage.

storage := sqlite3.New() // Z github.com/gofiber/storage/sqlite3
app.Use(limiter.New(limiter.Config{
    Storage: storage,
}))