Limiter

Bu, genel API'lerin ve/veya son noktaların (örneğin, şifre sıfırlama) tekrarlayan isteklerini sınırlamak için kullanılan Fiber için bir ara yazılım (middleware)dir. Ayrıca, API istemcilerinin, web tarayıcılarının veya sınırlama gerektiren diğer görevlerin hızını sınırlamak için de kullanışlıdır.

Not: Bu ara yazılım, çeşitli veritabanlarını tek bir arabirim üzerinden desteklemek için Storage paketimizi kullanır. Varsayılan yapılandırma verileri bellekte saklar ve diğer veritabanları için örnek aşağıdaki gibi incelenebilir.

Not: Bu modül varsayılan olarak diğer işlem/sunucularla durum paylaşmaz.

İmza

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

Örnek

Fiber web çerçevesinin bir parçası olarak ara yazılım paketini içe aktarın:

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

Fiber uygulaması oluşturduktan sonra aşağıdaki seçenekleri kullanabilirsiniz:

// Varsayılan yapılandırma ile başlat
app.Use(limiter.New())

// Veya özel yapılandırmayla genişletin
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{},
}))

Kaydırma Penceresi

Standart sabit pencere algoritmasını kullanmak yerine kaydırma penceresi algoritmasını etkinleştirebilirsiniz.

Örnek yapılandırma aşağıdaki gibidir:

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

Bu, her pencerenin önceki pencereyi (varsa) dikkate alacağı anlamına gelir. Verilen oran için formül şöyledir:

önceki pencerenin istek sayısı * (yeni pencere / Expiration) ağırlığı = önceki pencerenin ağırlığı
oran = önceki pencerenin ağırlığı + geçerli pencerenin istek miktarı

Yapılandırma

Özellik Tür Açıklama Varsayılan
Next func(*fiber.Ctx) bool True döndürdüğünde bu ara yazılımı atlamak için bir işlev tanımlar. nil
Max int Expiration dakikaları içindeki maksimum bağlantı sayısı, aşılırsa 429 yanıtı döndürür. 5
KeyGenerator func(*fiber.Ctx) string KeyGenerator, özel anahtarlar oluşturmanıza olanak tanır, varsayılan olarak c.IP() kullanılır. c.IP() işlevi kullanan işlev
Expiration time.Duration Bellekteki istek kayıtlarını tutmak için sürede sınırlama. 1 * time.Minute
LimitReached fiber.Handler Sınıra ulaşıldığında çağrılır. 429 yanıtı gönderen işlev
SkipFailedRequests bool Doğruysa, StatusCode >= 400 olan istekleri sayma. false
SkipSuccessfulRequests bool Doğruysa, StatusCode < 400 olan istekleri sayma. false
Storage fiber.Storage Ara yazılımın durumunu depolamak için kullanılan depo. Yalnızca mevcut işlem için bellekte depolama
LimiterMiddleware LimiterHandler LimiterMiddleware, limitli ara yazılımı uygulayan yapıdır. Yeni sabit pencere hız sınırlayıcı
Duration (Kullanımdan Kalktı) time.Duration Eskimiş: Bunun yerine Expiration kullanın. -
Store (Kullanımdan Kalktı) fiber.Storage Eskimiş: Bunun yerine Storage kullanın. -
Key (Kullanımdan Kalktı) func(*fiber.Ctx) string Eskimiş: Bunun yerine KeyGenerator kullanın. -

Not: Özel depo Storage arabirimini uygularsa, özel depoyu kullanabilirsiniz - daha fazla bilgi ve örnekler için lütfen store.go'ya başvurun.

Varsayılan Yapılandırma

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{},
}
### Özel Depolama/Veritabanı

[Depolama](https://github.com/gofiber/storage/) paketimizde istediğiniz depolama yöntemini kullanabilirsiniz.

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