المحدد

هذا الوسيط هو عبارة عن برنامج وسيط لـ Fiber يُستخدم لتقييد الطلبات المُتكررة إلى واجهات برمجة التطبيقات العامة و/أو النقاط النهائية (مثل إعادة تعيين كلمة المرور). كما أنه مفيد أيضًا لتقييد معدل عملاء واجهات برمجة التطبيقات (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{},
}))

هذا يعني أن كل نافذة ستأخذ في اعتبارها النافذة السابقة (إن وجدت). صيغة السعر للمعدل المعطى هي:

وزن النافذة السابقة = عدد الطلبات في النافذة السابقة * (whenNewWindow / Expiration)
المعدل = وزن النافذة السابقة + عدد الطلبات في النافذة الحالية.

التكوين

الخاصية النوع الوصف الافتراضي
Next func(*fiber.Ctx) bool يعرّف Next وظيفة لتخطي هذا الوسيط عند العودة إلى true. nil
Max int الحد الأقصى لعدد الاتصالات في Expiration ثانية، ويُرجع رد 429 إذا تجاوز. 5
KeyGenerator func(*fiber.Ctx) string يسمح KeyGenerator لك بتوليد مفاتيح مخصصة، مع الافتراضي باستخدام c.IP(). الدالة التي تستخدم c.IP() كقيمة افتراضية
Expiration time.Duration Expiration هو الوقت للحفاظ على سجلات الطلب في الذاكرة. 1 * time.Minute
LimitReached fiber.Handler يُسدّد عند الوصول للحد. الدالة التي ترسل رد 429
SkipFailedRequests bool إذا كانت صحيحة، فلا تحسب الطلبات برمز الحالة الخاطئة >= 400. خاطئة
SkipSuccessfulRequests bool إذا صحيح، فلا تحسب الطلبات برمز الحالة < 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{},
}

تخزين مخصص / قاعدة البيانات

يمكنك استخدام أي طريقة تخزين في حزمة التخزين الخاصة بنا.

تخزين := sqlite3.New() // من github.com/gofiber/storage/sqlite3
التطبيق.استخدام(limiter.New(limiter.Config{
    تخزين: تخزين,
}))