Panduan Cepat (Quickstart)
Panduan ini akan membantu Anda menyiapkan rate limiting pada aplikasi Go dalam waktu kurang dari 5 menit.
Langkah 1: Inisialisasi Storage Driver
Section titled “Langkah 1: Inisialisasi Storage Driver”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()) }()}Langkah 2: Konfigurasi Rate Limiter
Section titled “Langkah 2: Konfigurasi Rate Limiter”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 Counterlimiter, 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)}