Limiter
Ini adalah middleware untuk Fiber yang digunakan untuk membatasi permintaan berulang ke API publik dan/atau endpoint (mis., reset kata sandi). Ini juga berguna untuk membatasi kecepatan klien API, web crawler, atau tugas lain yang memerlukan pembatasan kecepatan.
Catatan: Middleware ini menggunakan paket Storage kami untuk mendukung berbagai database melalui antarmuka yang seragam. Konfigurasi default menyimpan data di memori, dan Anda dapat merujuk ke contoh di bawah untuk melihat database lain.
Catatan: Secara default, modul ini tidak membagi status dengan proses/server lain.
Tanda Tangan
func New(config ...Config) fiber.Handler
Contoh
Impor paket middleware sebagai bagian dari kerangka kerja web Fiber:
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/limiter"
)
Setelah membuat aplikasi Fiber, Anda dapat menggunakan opsi berikut:
// Inisialisasi dengan konfigurasi default
app.Use(limiter.New())
// Atau perluas dengan konfigurasi kustom
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{},
}))
Jendela Geser
Anda dapat mengaktifkan algoritma jendela geser sebagai gantinya menggunakan algoritma jendela tetap standar.
Konfigurasi contoh adalah sebagai berikut:
app.Use(limiter.New(limiter.Config{
Max: 20,
Expiration: 30 * time.Second,
LimiterMiddleware: limiter.SlidingWindow{},
}))
Ini berarti setiap jendela akan mempertimbangkan jendela sebelumnya (jika ada). Rumus untuk laju yang diberikan adalah:
bobotJendelaSebelumnya = jumlah permintaan jendela sebelumnya * (whenNewWindow / Expiration)
laju = bobotJendelaSebelumnya + jumlah permintaan jendela saat ini.
Konfigurasi
Properti | Tipe | Deskripsi | Default |
---|---|---|---|
Next | func(*fiber.Ctx) bool |
Next mendefinisikan fungsi untuk melewati middleware ini ketika mengembalikan nilai true. | nil |
Max | int |
Jumlah maksimum koneksi dalam waktu Expiration detik, mengembalikan respons 429 jika melebihi. |
5 |
KeyGenerator | func(*fiber.Ctx) string |
KeyGenerator memungkinkan Anda untuk menghasilkan kunci kustom, dengan default menggunakan c.IP(). | Fungsi menggunakan c.IP() sebagai nilai default |
Expiration | time.Duration |
Expiration adalah waktu untuk menyimpan catatan permintaan di memori. | 1 * time.Minute |
LimitReached | fiber.Handler |
Dipanggil ketika batas tercapai. | Fungsi mengirimkan respons 429 |
SkipFailedRequests | bool |
Jika benar, jangan menghitung permintaan dengan StatusCode >= 400. | false |
SkipSuccessfulRequests | bool |
Jika benar, jangan menghitung permintaan dengan StatusCode < 400. | false |
Storage | fiber.Storage |
Penyimpanan yang digunakan untuk menyimpan status middleware. | Penyimpanan memori untuk proses saat ini saja |
LimiterMiddleware | LimiterHandler |
LimiterMiddleware adalah struktur yang mengimplementasikan middleware pembatasan. | Sebuah pembatas jendela tetap baru |
Duration (Dianjurkan) | time.Duration |
Dihapus: Gunakan Expiration sebagai gantinya. | - |
Store (Dianjurkan) | fiber.Storage |
Dihapus: Gunakan Storage sebagai gantinya. | - |
Key (Dianjurkan) | func(*fiber.Ctx) string |
Dihapus: Gunakan KeyGenerator sebagai gantinya. | - |
Catatan: Jika penyimpanan kustom mengimplementasikan antarmuka
Storage
, Anda dapat menggunakan penyimpanan kustom - untuk informasi lebih lanjut dan contoh, silakan merujuk kestore.go
.
Konfigurasi Default
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{},
}
Penyimpanan/Database Kustom
Anda dapat menggunakan metode penyimpanan apa pun dalam paket penyimpanan kami.
penyimpanan := sqlite3.New() // Dari github.com/gofiber/storage/sqlite3
app.Use(limiter.New(limiter.Config{
Storage: penyimpanan,
}))