Lewati ke konten

Interceptor gRPC

distlimit menyediakan interceptor server gRPC Unary dan Streaming melalui package github.com/balramadan/distlimit/middleware/grpc.


Instal gRPC dan distlimit menggunakan Go Modules:

Terminal window
go get google.golang.org/grpc
go get github.com/balramadan/distlimit

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)
}

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.

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)
}),
)

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