Mert Tosun
← Yazılar
gRPC vs REST: Ne Zaman Hangisini Kullanmalısın? Go ile Karşılaştırmalı Rehber

gRPC vs REST: Ne Zaman Hangisini Kullanmalısın? Go ile Karşılaştırmalı Rehber

Mert TosunGo

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: .proto dosyaları 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.