Lewati ke konten

Panduan Cepat (Quickstart)

Panduan ini akan membantu Anda menyiapkan rate limiting pada aplikasi Go dalam waktu kurang dari 5 menit.


Setiap instance distlimit membutuhkan driver penyimpanan backend. Untuk aplikasi lokal atau microservices single-instance, inisialisasi Driver Memory 64-Shard:

package main
import (
"context"
"time"
"github.com/balramadan/distlimit/driver/memory"
)
func main() {
// Inisialisasi Memory Driver dengan TTL key 5 menit untuk pembersihan di background
memDriver := memory.New(5 * time.Minute)
defer func() { _ = memDriver.Close(context.Background()) }()
}

Gabungkan storage driver Anda dengan aturan rate limit (Limit, Window, dan Strategi Algoritma) menggunakan opsi fungsional:

import (
"time"
"github.com/balramadan/distlimit"
"github.com/balramadan/distlimit/algorithm/slidingcounter"
"github.com/balramadan/distlimit/driver/memory"
)
// Konfigurasi Limiter: 100 request per window 1 menit menggunakan Sliding Window Counter
limiter, err := distlimit.New(
memDriver,
distlimit.WithLimit(100),
distlimit.WithWindow(1*time.Minute),
distlimit.WithAlgorithm(slidingcounter.New()),
)
if err != nil {
panic(err)
}

Langkah 3: Evaluasi Rate Limit pada Logika Bisnis

Section titled “Langkah 3: Evaluasi Rate Limit pada Logika Bisnis”

Gunakan AllowKey untuk memeriksa apakah key client tertentu (Alamat IP, User ID, atau API Key) diizinkan untuk mengeksekusi request:

ctx := context.Background()
clientKey := "user_id:98765"
res, err := limiter.AllowKey(ctx, clientKey)
if err != nil {
log.Printf("Evaluasi rate limit gagal: %v", err)
}
if res.Allowed {
fmt.Printf("Request diizinkan! Sisa kuota: %d\n", res.Remaining)
} else {
fmt.Printf("Rate limit terlampaui! Coba lagi setelah: %v\n", res.ResetIn)
}

Langkah 4: Lindungi Endpoint HTTP via Middleware

Section titled “Langkah 4: Lindungi Endpoint HTTP via Middleware”

Lindungi endpoint API Web Anda secara otomatis menggunakan adapter middleware distlimit:

package main
import (
"net/http"
"time"
"github.com/balramadan/distlimit"
"github.com/balramadan/distlimit/algorithm/tokenbucket"
"github.com/balramadan/distlimit/driver/memory"
distlimitnethttp "github.com/balramadan/distlimit/middleware/nethttp"
)
func main() {
memDriver := memory.New(5 * time.Minute)
defer memDriver.Close(nil)
limiter, _ := distlimit.New(
memDriver,
distlimit.WithLimit(100),
distlimit.WithWindow(1*time.Minute),
distlimit.WithAlgorithm(tokenbucket.New()),
)
mux := http.NewServeMux()
apiHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"status":"success","data":"Hello World"}`))
})
protectedMux := distlimitnethttp.New(
limiter,
distlimitnethttp.WithTrustedProxies([]string{"10.0.0.0/8"}),
)(apiHandler)
mux.Handle("/api/v1/data", protectedMux)
http.ListenAndServe(":8080", mux)
}