ตัวจำกัด

นี้เป็น middleware สำหรับ Fiber ที่ใช้เพื่อ จำกัด คำขอที่ทำซ้ำกันไปยัง API หรือจุดปลายทางสาธารณะ (เช่น การรีเซ็ตรหัสผ่าน) นอกจากนี้ยังมีประโยชน์ในการจำกัดอัตราการใช้งานของไคลเอนต์ API, เว็บครอว์เลอร์, หรืองานอื่น ๆ ที่ต้องการการจำกัดอัตราการใช้งาน

หมายเหตุ: Middleware นี้ใช้แพ็กเกจ Storage ของเราเพื่อรองรับฐานข้อมูลต่าง ๆ ผ่านอินเตอร์เฟซที่เป็นเอกสารเดียวกัน การกำหนดค่าเริ่มต้นจัดเก็บข้อมูลในหน่วยความจำ และคุณสามารถอ้างถึงตัวอย่างด้านล่างเพื่อดูฐานข้อมูลอื่น ๆ

หมายเหตุ: โดยค่าเริ่มต้นมอดูลนี้ไม่แชร์สถานะกับกระบวนการ/เซิร์ฟเวอร์อื่น ๆ

ลายเซ็นเจอร์

func New(config ...Config) fiber.Handler

ตัวอย่าง

นำแพ็กเกจ middleware เข้ามาเป็นส่วนหนึ่งของเฟรมเวิร์ก 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 กำหนดฟังก์ชันเพื่อข้าม middleware นี้เมื่อคืนค่า 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 ทำหน้าที่ในการเก็บข้อมูลสถานะของ middleware การเก็บข้อมูลในหน่วยความจำสำหรับกระบวนการปัจจุบันเท่านั้น
LimiterMiddleware LimiterHandler LimiterMiddleware เป็นโครงสร้างที่นำมาใช้ใน middleware จำกัดอัตรา อัตราการหน้าต่างคงที่ใหม่
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 ของเรา.

storage := sqlite3.New() // มาจาก github.com/gofiber/storage/sqlite3
app.Use(limiter.New(limiter.Config{
    Storage: storage,
}))