ตัวจำกัด
นี้เป็น 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,
}))