محدودکننده
این یک میانافزار برای Fiber است که برای محدود کردن درخواستهای تکراری به APIها و یا نقاط پایانی عمومی (مانند بازنشانی رمز عبور) استفاده میشود. همچنین برای محدود کردن نرخ مشتریان API، وبکرالها و یا سایر وظایفی که نیاز به محدودکردن نرخ دارند، مفید است.
نکته: این میانافزار از بسته Storage ما برای پشتیبانی از انواع مختلف پایگاهدادهها از طریق یک رابط یکپارچه استفاده میکند. تنظیم پیشفرض دادهها را در حافظه ذخیره میکند و شما میتوانید به مثال زیر مراجعه کنید تا دیگر پایگاهدادهها را مشاهده کنید.
نکته: به طور پیشفرض، این ماژول از وضعیت با فرایندها/سرورهای دیگر به اشتراک گذاشته نمیکند.
امضا
func New(config ...Config) fiber.Handler
مثال
بسته میانافزار را به عنوان بخشی از چارچوب وب Fiber وارد کنید:
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/limiter"
)
پس از ایجاد برنامه Fiber، میتوانید از گزینههای زیر استفاده کنید:
// با پیکربندی پیشفرض مقدماتی
app.Use(limiter.New())
// یا با پیکربندی سفارشی گسترده
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{},
}))
پنجره لغزان
میتوانید از الگوریتم پنجره لغزان به جای استفاده از الگوریتم پنجره ثابت استفاده کنید.
پیکربندی مثال به شکل زیر است:
app.Use(limiter.New(limiter.Config{
Max: 20,
Expiration: 30 * time.Second,
LimiterMiddleware: limiter.SlidingWindow{},
}))
این به معنای آن است که هر پنجره شامل پنجره قبلی (در صورت وجود) خواهد بود. فرمول برای نرخ داده شده به شرح زیر است:
وزن پنجره قبلی = تعداد درخواستهای پنجره قبلی * (زمان جدید/Expiration)
نرخ = وزن پنجره قبلی + تعداد درخواستهای فعلی پنجره.
پیکربندی
خصوصیت | نوع | توضیح | پیشفرض |
---|---|---|---|
Next | func(*fiber.Ctx) bool |
تعیین میکند که آیا این میانافزار را باید رد کند یا خیر | nil |
Max | int |
حداکثر تعداد اتصالات در Expiration ثانیه، اگر بیشتر شود بازپاسخ 429 ارسال میشود. |
5 |
KeyGenerator | func(*fiber.Ctx) string |
KeyGenerator به شما امکان میدهد تا کلیدهای سفارشی ایجاد کنید و به صورت پیشفرض از c.IP() استفاده میکند. | تابعی با استفاده از c.IP() به عنوان مقدار پیشفرض |
Expiration | time.Duration |
زمانی که رکوردهای درخواستی را در حافظه نگه میدارد. | 1 * time.Minute |
LimitReached | fiber.Handler |
وقتی از حد برسی شده باشد فراخوانی میشود. | ارسال 429 بازخواست |
SkipFailedRequests | bool |
اگر فعال باشد، درخواستهای با StatusCode >= 400 را شمر نمیکند. | بیفایده |
SkipSuccessfulRequests | bool |
اگر فعال باشد، درخواستهای با StatusCode < 400 را شمر نمیکند. | بیفایده |
Storage | fiber.Storage |
فضایی برای نگهداری وضعیت میانافزار است. | ذخیرهسازی حافظه برای فرایند فعلی تنها |
LimiterMiddleware | LimiterHandler |
LimiterMiddleware ساختار پیادهسازی میانافزار محدودکننده است. | یک محدودکننده نرخ پنجره ثابت جدید |
Duration (منسوخ شده) | time.Duration |
منسوخ شده: به جای آن از Expiration استفاده کنید. | - |
Store (منسوخ شده) | fiber.Storage |
منسوخ شده: به جای آن از Storage استفاده کنید. | - |
Key (منسوخ شده) | func(*fiber.Ctx) string |
منسوخ شده: به جای آن از KeyGenerator استفاده کنید. | - |
نکته: اگر ذخیرهسازی سفارشی رابط
Storage
را پیادهسازی میکند، میتوانید از ذخیرهسازی سفارشی استفاده کنید - برای اطلاعات بیشتر و مثالها، لطفا بهstore.go
مراجعه کنید.
پیکربندی پیشفرض
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{},
}
انبار داده/پایگاه داده سفارشی
شما میتوانید از هر روش ذخیرهسازی در بسته انبار ما استفاده کنید.
storage := sqlite3.New() // از طریق github.com/gofiber/storage/sqlite3
app.Use(limiter.New(limiter.Config{
Storage: storage,
}))