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źć wstore.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,
}))