محدود‌کننده

این یک میان‌افزار برای 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,
}))