Interceptor gRPC
distlimit menyediakan interceptor server gRPC Unary dan Streaming melalui package github.com/balramadan/distlimit/middleware/grpc.
Instalasi
Section titled “Instalasi”Instal gRPC dan distlimit menggunakan Go Modules:
go get google.golang.org/grpcgo get github.com/balramadan/distlimitSetup Dasar
Section titled “Setup Dasar”Pasangkan UnaryServerInterceptor dan StreamServerInterceptor saat menginisialisasi server gRPC Anda:
package main
import ( "net" "time"
"github.com/balramadan/distlimit" "github.com/balramadan/distlimit/algorithm/tokenbucket" "github.com/balramadan/distlimit/driver/memory" distlimitgrpc "github.com/balramadan/distlimit/middleware/grpc" "google.golang.org/grpc")
func main() { // 1. Inisialisasi Driver & Limiter (100 request / menit) memDriver := memory.New(5 * time.Minute) limiter, _ := distlimit.New( memDriver, distlimit.WithLimit(100), distlimit.WithWindow(1*time.Minute), distlimit.WithAlgorithm(tokenbucket.New()), )
// 2. Registrasi Interceptor gRPC server := grpc.NewServer( grpc.UnaryInterceptor(distlimitgrpc.UnaryServerInterceptor(limiter)), grpc.StreamInterceptor(distlimitgrpc.StreamServerInterceptor(limiter)), )
lis, _ := net.Listen("tcp", ":50051") _ = server.Serve(lis)}Opsi Konfigurasi
Section titled “Opsi Konfigurasi”Konfigurasikan perilaku interceptor dengan meneruskan opsi ke UnaryServerInterceptor(limiter, opts...):
| Opsi | Tipe | Deskripsi |
|---|---|---|
WithTrustedProxies(proxies) |
[]string |
Blok CIDR atau IP proxy terpercaya untuk parsing metadata x-forwarded-for. |
WithKeyExtractor(fn) |
func(ctx context.Context) string |
Fungsi kustom untuk mengekstrak key rate limit dari context/metadata gRPC. |
WithRouteLabeling(enable) |
bool |
Mengaktifkan pengiriman method lengkap gRPC (info.FullMethod) ke label metrik. |
Contoh Ekstraksi Key Kustom
Section titled “Contoh Ekstraksi Key Kustom”Secara default, distlimit membatasi request berdasarkan IP peer client. Anda dapat mengekstrak pengenal kustom dari metadata gRPC:
grpc.UnaryServerInterceptor( limiter, distlimitgrpc.WithKeyExtractor(func(ctx context.Context) string { if md, ok := metadata.FromIncomingContext(ctx); ok { if tokens := md.Get("authorization"); len(tokens) > 0 { return "token:" + tokens[0] } } // Fallback ke alamat IP peer client return distlimitgrpc.ExtractPeerIP(ctx, nil) }),)Response Header & Perilaku Error
Section titled “Response Header & Perilaku Error”Tidak seperti server HTTP yang mengembalikan status code 429, layanan gRPC menangani rate limiting via response status error.
Saat client melampaui kuota yang diizinkan, distlimit memblokir panggilan RPC unary atau stream dengan status code gRPC codes.ResourceExhausted (kode numerik 8):
rpc error: code = ResourceExhausted desc = rate limit exceeded for method /package.Service/Method: try again in 5 seconds