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