لمیٹر

یہ 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{},
}))

اس کا مطلب ہے کہ ہر ونڈو پچھلی ونڈو (اگر کوئی ہو) کو بھی مد نظر رکھے گی۔ دی گئی ریٹ کے لئے فارمولا مندرجہ ذیل ہے:

weightOfPreviousWindow = previous window's amount of requests * (whenNewWindow / Expiration)
rate = weightOfPreviousWindow + current window's amount of requests.

کانفیگریشن

خصوصیت قسم تفصیل ڈیفالٹ
Next func(*fiber.Ctx) bool Next وہ فنکشن وضاحت کرتا ہے جو اس مدیانے کو چھوڑنے کا فیصلہ کرنے پر true واپس کرتا ہے۔ nil
Max int Expiration سیکنڈ میں روابط کی زیادہ تعداد جو اگر پار کی جائے تو 429 ریSPONS ملے گا۔ 5
KeyGenerator func(*fiber.Ctx) string KeyGenerator آپ کو کسٹم کلیدیں بنانے کی اجازت دیتا ہے، ڈیفالٹ طور پر c.IP() کا استعمال ہوتا ہے۔ c.IP() کا استعمال کرنے والا فنکشن
Expiration time.Duration Expiration فراہم کردہ وقت ہے تکہ درخواست کے ریکارڈ میموری میں رکھے رہ سکیں۔ 1 * time.Minute
LimitReached fiber.Handler حد تک پہنچنے پر بلایا جاتا ہے۔ 429 ریSPONS بھیجنے والا فنکشن
SkipFailedRequests bool اگر صحیح ہو تو، 400 یا اس سے زیادہ StatusCodE والی درخواستوں کو شمار نہیں کیا جائے گا۔ false
SkipSuccessfulRequests bool اگر صحیح ہو تو، 400 کم StatusCodE والی درخواستوں کو شمار نہیں کیا جائے گا۔ false
Storage fiber.Storage مدیانے کی حالت کو ذخیرہ کرنے کے لئے استعمال ہونے والا اسٹور صرف موجودہ پروسیس کے لئے میموری اسٹوریج
LimiterMiddleware LimiterHandler LimiterMiddleware مدیانے کو implement کرنے والا سٹرکٹ ہے ایک نیا فکسڈ ونڈو ریٹ محدود کنندہ
وقت (منسوخ) time.Duration منسوخ: اس استعمال کریں Expiration کی بجائے۔ -
استور (منسوخ) fiber.Storage منسوخ: استعمال کریں استورِ بجائے۔ -
کلید (منسوخ) func(*fiber.Ctx) string منسوخ: استعمال کریں KeyGenerator کی بجائے۔ -

نوٹ: اگر کسٹم اسٹوریج Storage انٹرفیس کو implement کرتا ہے، تو آپ کسٹم اسٹوریج استعمال کرسکتے ہیں - مزید معلومات اور مثالوں کے لئے براہ کرم 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 پیکیج میں کسی بھی استوریج ترتیب استعمال کرسکتے ہیں۔

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