المحدد
هذا الوسيط هو عبارة عن برنامج وسيط لـ 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{
تخزين: تخزين,
}))