gRPC vs REST: Ne Zaman Hangisini Kullanmalısın? Go ile Karşılaştırmalı Rehber
Dağıtık sistemlerde iki protokol öne çıkar: klasik REST/HTTP+JSON ve gRPC (genelde HTTP/2 + Protocol Buffers). “Hangisi daha iyi?” sorusunun cevabı bağlama bağlıdır.
Bu rehber, Go tarafında pratik karar vermenize yardımcı olur. Aynı zamanda Go ve Node.js ile servis karşılaştırması yazısındaki “doğru araç, doğru iş” yaklaşımıyla uyumludur: protokol seçimi de bir mimari tercihtir.
REST (veya “RESTful HTTP”) nedir?
Genelde anlatılan:
- Kaynaklar URL ile temsil edilir (
/users/1) - HTTP fiilleri semantiği taşır (
GET,POST,PUT,PATCH,DELETE) - Gövde çoğu zaman JSON
Artıları
- Evrensel: tarayıcı, curl, her dilde istemci
- İnsan tarafından okunabilir JSON
- Önbellekleme ve CDN ile uyum (GET için)
Eksileri
- Şema sürümleme ve tip güvenliği için ekstra disiplin (OpenAPI)
- Büyük payload’larda JSON parse maliyeti
- Streaming ve çift yönlü akış için ekstra tasarım
gRPC nedir?
- IDL:
.protodosyaları ile sözleşme - HTTP/2 üzerinde çok daha kompakt protobuf serileştirme
- Streaming: sunucı, istemci, çift yönlü
- Kod üretimi:
protoc+ Go plugin → tip güvenli istemci/sunucu
Artıları
- Güçlü tip sistemi ve geriye dönük uyumlu alan ekleme kuralları
- Düşük gecikme, küçük mesaj boyutu
- Mikroservisler arası iç iletişim için yaygın
Eksileri
- Tarayıcı doğrudan gRPC’ye bağlanamaz; gRPC-Web veya API gateway gerekir
- Hata ayıklama için araçlar (grpcurl, reflection) şart
- İnsan tarafından “curl ile” test zorluğu (öğrenme eğrisi)
Ne zaman REST?
- Dış API veya üçüncü parti entegratörler
- Mobil / web istemciler doğrudan konuşacaksa ve JSON bekleniyorsa
- CDN ve HTTP önbelleği kritikse
- Ekip protobuf deneyimi düşükse ve hızlı MVP gerekiyorsa
Ne zaman gRPC?
- Servis–servis iletişim (Kubernetes içi)
- Yüksek QPS, düşük gecikme
- Streaming (canlı veri, dosya parçaları)
- Katı şema ve çoklu dilde paylaşılan client kütüphaneleri
Go’da minimal karşılaştırma
REST: net/http veya Echo, Fiber, Chi ile handler yazarsınız; JSON için encoding/json.
gRPC: .proto tanımlayıp protoc --go_out ve protoc --go-grpc_out ile sunucu/istemci üretirsiniz; handler’lar oluşturulan interface’i implemente eder.
// REST handler (özet)
func GetUser(w http.ResponseWriter, r *http.Request) {
// id := mux.Vars(r)["id"]
json.NewEncoder(w).Encode(user)
}
// gRPC service (özet)
func (s *Server) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.User, error) {
return &pb.User{Id: req.Id, Name: "..."}, nil
}
Hibrit mimari
Pratikte sık görülen desen:
- Edge: REST/GraphQL veya BFF
- İç ağ: gRPC mikroservisler arası
- Go hem REST gateway hem gRPC servis üretebilir
Özet tablo
| Ölçüt | REST | gRPC |
|---|---|---|
| İnsan okunabilirliği | Yüksek | Düşük (binary) |
| Performans / boyut | İyi | Çok iyi |
| Tarayıcı dostu | Evet | Hayır (Web ile) |
| Streaming | Mümkün, ek iş | Birinci sınıf |
| Şema | OpenAPI (opsiyonel) | Zorunlu (.proto) |
Sonuç: dış dünyaya REST, pod’lar arası gRPC çoğu ekip için makul bir varsayılandır. İç link olarak Go ve Node.js karşılaştırması yazısındaki servis sınırları düşüncesiyle birlikte okumak faydalıdır.
İlgili Yazılar
Redis ile Rate Limiting: Go'da Token Bucket ve Sliding Window Implementasyonu
golang rate limiting için Redis tabanlı token bucket ve sliding window algoritmaları; Lua script, atomicity ve üretimde dikkat edilecek noktalar.
Go ile JWT Authentication: Access Token, Refresh Token ve Güvenli Saklama
JWT üretimi ve doğrulaması Go'da; kısa ömürlü access token, refresh token rotasyonu, HttpOnly cookie ve yaygın hatalar.
Go ile CLI Geliştirme: Komut Satırı Araçlarına Derinlemesine Rehber
flag ve Cobra ile alt komutlar, stdin/stdout, çıkış kodları, çapraz derleme ve test: üretim kalitesinde Go CLI geliştirmenin pratik rehberi.