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 ke store.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,
}))