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 aufstore.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,
}))