gRPC ve REST, mikroservis mimarisinde veri iletişimini sağlayan iki önemli teknolojidir. Bu yazıda gRPC'nin çalışma mantığı, avantajları, REST ile temel farkları ve hangi senaryoda hangisinin tercih edilmesi gerektiği detaylıca ele alınıyor. Ayrıca Protocol Buffers, HTTP/2 ve streaming gibi kavramlarla gRPC'nin neden hızlı ve verimli olduğu da açıklanıyor.
gRPC, mikroservislerin ve uygulamaların ağ üzerinden hızlı veri alışverişi yapmasını sağlayan bir uzaktan prosedür çağrısı (RPC) teknolojisidir. REST API'de olduğu gibi manuel olarak HTTP istekleri oluşturup JSON ile veri taşımak yerine, gRPC'de geliştirici erişilebilir metotları ve veri yapılarını tanımlar, ardından istemci ve sunucu bu tanıma uygun otomatik arayüzlerle iletişim kurar.
gRPC, bir servisin diğer servisteki fonksiyonları sanki kendi kodundaymış gibi ağ üzerinden çağırmasını sağlayan bir framework'tür. Geliştirici, URL oluşturma veya JSON işleme ile uğraşmaz; bu işlemler gRPC'nin oluşturduğu istemci kodu aracılığıyla otomatik olarak gerçekleştirilir.
Örneğin bir e-ticaret sisteminde ürün katalog, ödeme ve teslimat ayrı servislerde olabilir. Sipariş servisi, teslimat ücretini öğrenmek istediğinde, lojistik serviste tanımlanan GetDeliveryPrice yöntemini çağırır. gRPC, bu isteği uygun bir mesaja dönüştürür, ağı kullanarak karşı tarafa yollar ve cevabı alır.
REST API'lerde genellikle belirli bir URL'ye HTTP isteği gönderilir; örneğin, GET /users/42 gibi. gRPC'de ise odak noktası kaynak adresleri değil, servis metotlarıdır. GetUser, CreateUser gibi operasyonlar tanımlanır ve bunlar doğrudan fonksiyon çağırır gibi kullanılır. Arka planda ağ iletişimi devam etse de, geliştirici için süreç lokal fonksiyon çağrısına çok daha yakındır.
gRPC, dağıtık sistemi tek bir uygulamaya dönüştürmez; gecikmeler, ağ kesintileri veya zaman aşımı gibi faktörler hala geçerlidir. Ancak bu teknoloji, iletişimi düzenli ve tip güvenli bir şekilde yönetir.
Bir gRPC API'de ilk adım, servislerin, metotların ve mesaj yapılarının Protocol Buffers (.proto dosyası) ile tanımlanmasıdır:
GetUser(UserRequest) → UserResponse
Bu kontrattan yola çıkarak, gRPC araçları otomatik olarak seçilen programlama dili için istemci ve sunucu kodunu üretir. Her iki taraf da hangi metotların, parametrelerin ve cevapların var olduğunu önceden bilir.
Büyük projelerde bu çok avantajlıdır. Örneğin bir servis Go, diğeri Java, bir diğeri Python ile yazılmış olabilir. Ortak bir .proto dosyası ile hepsi aynı API'yi paylaşabilir, aralarındaki veri transferi sorunsuz gerçekleşir.
gRPC en çok mikroservis mimarisi gibi iç servislerin yoğun veri alışverişi yaptığı yapılarda tercih edilir. Kullanıcıdan gelen bir istek; yetkilendirme, katalog, sipariş, ödeme ve öneri gibi birçok servisten geçebilir. Bu gibi ortamlarda mesajların kompakt olması, API kontratının sıkı olması ve istemci kodunun otomatik üretilmesi kritik önem taşır.
Bu yüzden gRPC, genellikle backend altyapısı, dağıtık sistemler ve kurum içi API'lerde yoğun olarak kullanılır. Dış dünyaya açık API'ler için ise çoğunlukla REST tercih edilir: tarayıcı ve standart HTTP araçlarıyla doğrudan çalışmak daha kolaydır.
Daha fazla bilgi için Mikroservis Mimarisi: Avantajları, Dezavantajları ve 2026 Yılı Trendleri başlıklı yazımıza göz atabilirsiniz.
gRPC'nin işleyişini anlamak için bir isteğin yolculuğuna bakalım. Öncelikle geliştirici, servis ve metotları bir .proto dosyası ile tanımlar. Bu dosyadan otomatik olarak istemci ve sunucu kodu üretilir. İstemci bir metodu çağırdığında, parametreler ikili (binary) mesaja dönüştürülür, ağ üzerinden sunucuya iletilir, sunucu yanıtı yine binary olarak döner ve uygulamada kullanılabilir hâle gelir.
Protocol Buffers (Protobuf), hem veri yapısı tanımlama hem de veriyi kompakt biçimde serileştirme için kullanılır. Örneğin:
message UserRequest {
int32 id = 1;
}
message UserResponse {
int32 id = 1;
string name = 2;
}
Burada, istek ve cevap mesajlarının yapısı önceden belirlenmiş olur. JSON'dan farklı olarak, Protobuf her mesajda alan isimlerini göndermek yerine sayısal kimlikler kullanır. Bu, veri boyutunu ve ağdaki yükü azaltır.
service UserService {
rpc GetUser(UserRequest) returns (UserResponse);
}
Bu tanım sayesinde UserService'in GetUser metoduna sahip olduğu ve bunun hangi veri yapılarıyla çalıştığı netleşir.
gRPC'nin en büyük avantajlarından biri, .proto kontratına dayalı olarak otomatik kod üretimidir. Derleyici, gerekli sınıfları, veri yapılarını ve arayüzleri oluşturur. İstemcide, uzak servislere kolayca erişilebilen stub nesneleri oluşur. Kodda çağrı örneği:
user = client.GetUser(request)
Bu satır, arka planda parametrelerin serileştirilmesi, ağdan gönderilmesi, sunucuda işlenmesi ve yanıtın çözülmesi gibi birçok adımı kapsar. Sunucu tarafında ise geliştirici, arayüz üzerinden sadece iş mantığını uygular. Her iki taraf da aynı kontratı kullandığından, alan isimleri veya veri tipi uyumsuzluğu gibi hataların önüne geçilmiş olur.
gRPC çağrısında istemci, üretilen metodu kullanır, parametreler Protobuf ile binary mesaja çevrilir, HTTP/2 üzerinden sunucuya iletilir. gRPC, çağrılan servis/metot, metadata ve bağlantı yönetimi için gerekli bilgileri de ekler. Sunucu mesajı alır, çözümleyip ilgili işleyiciye aktarır, sonuç tekrar Protobuf ile binary'ye çevrilip istemciye döner.
gRPC, verimli veri iletimi için HTTP/2 protokolünü kullanır. HTTP/1.1'de çoklu istekte birden fazla bağlantı gerekirken, HTTP/2 ile tek bağlantı üzerinden çoklu bağımsız veri akışı (multiplexing) mümkündür. Böylece onlarca istek, tek TCP bağlantısından sırayla değil, paralel olarak geçebilir.
HTTP/2 aynı zamanda çift yönlü veri akışını (streaming) destekler; istemci ve sunucu, aynı bağlantı üzerinden karşılıklı birden fazla mesaj gönderebilir. Bu, gRPC'nin streaming yeteneklerinde kilit bir avantajdır.
Kısacası Protocol Buffers veri boyutunu küçültür, HTTP/2 aktarımı hızlandırır, gRPC ise bu ikiliyi en verimli RPC modeline dönüştürür.
gRPC'nin hızı, tek bir teknolojiden değil, şu üç faktörden kaynaklanır:
Bu avantajlar özellikle kurum içi sistemlerde, binlerce kısa mesajın aktarıldığı ortamlarda fark yaratır.
REST API'ler genellikle insan tarafından okunabilir JSON kullanır. Ancak JSON'da hem veri hem de alan isimleri taşınır:
{
"id": 42,
"name": "Alex"
}
Protobuf'da ise alan isimleri yerine, istemci ve sunucuya önceden bildirilen sayısal kimlikler kullanılır. Bu, küçük mesajlarda özellikle veri trafiğini azaltır ve işlemleri hızlandırır.
Fakat binary formatın sağladığı kazanç, veri tabanı sorgularının veya ağır işlemlerin süresiyle karşılaştırıldığında her zaman kritik olmayabilir.
HTTP/2, birden fazla isteğin aynı bağlantı üzerinden, her biri kendi mantıksal akışında taşınmasını sağlar. Böylece, örneğin bir ürünün fiyatı, stok durumu, kullanıcı bilgisi ve teslimat seçenekleri aynı anda tek bağlantıdan paralel olarak alınabilir. Bu, mikroservis ortamında bağlantı yönetimini ve performansı ciddi ölçüde iyileştirir.
gRPC, her mesaj için ayrı istek gerektirmeden veri akışı (streaming) sunar. Dört temel mod vardır:
Bu, sürekli güncellenen verilerin hızlı iletimi gereken uygulamalarda büyük avantaj sağlar.
gRPC ve REST'i sadece hız üzerinden karşılaştırmak yanıltıcıdır. Protobuf, HTTP/2 ve streaming sayesinde gRPC, özellikle çok sık ve kısa mesajlaşmanın olduğu sistemlerde avantajlıdır. Fakat veri tabanı sorguları veya dış API çağrıları çok zaman alıyorsa, Protobuf ve JSON arasındaki fark önemsiz kalabilir.
Ayrıca, REST de HTTP/2 ile çalışabilir, kompakt veri gönderebilir ve kalıcı bağlantı kullanabilir. Yani, gRPC'nin yüksek performansı, ancak sistemin iş yükü bu avantajları gerektirdiğinde ortaya çıkar.
Her iki teknoloji de uygulamaların ağ üzerinden veri paylaşmasını sağlar. Ancak REST kaynak odaklı ve standart HTTP metotlarını (GET, POST vb.) baz alırken, gRPC önceden tanımlanan uzak metot çağrılarına dayanır.
| Parametre | gRPC | REST |
|---|---|---|
| Etkileşim modeli | Metot çağrısı | Kaynakla işlem |
| Veri formatı | Protocol Buffers | JSON |
| Taşıma protokolü | HTTP/2 | HTTP/1.1 veya HTTP/2 |
| API kontratı | Sıkı .proto dosyası | OpenAPI ile tanımlanabilir |
| Mesaj okunabilirliği | Düşük (özel araç gerekir) | Yüksek (elle okunabilir) |
| İstemci kodu üretimi | Doğrudan desteklenir | Mümkün, fakat zorunlu değil |
| Streaming | Doğal olarak destekliyor | Ek teknoloji gerektirir |
| Tarayıcı desteği | Zor | Kolay |
| Başlıca kullanım alanı | Dahili servisler | Açık ve web API'ler |
REST'in en büyük avantajlarından biri, hemen her HTTP istemcisiyle kolayca kullanılabilmesi ve JSON'un insanlar tarafından okunabilir olmasıdır. Dış geliştiriciler, basit bir GET isteğiyle veriye ulaşabilir. gRPC'de ise .proto tanımları ve özel istemci gereklidir.
REST, tarayıcı ortamında da doğrudan çalışır. JavaScript'in fetch gibi mekanizmaları HTTP isteklerini kolayca yönetir. Standart gRPC ise tarayıcıda kısıtlıdır; bunun için gRPC-Web gibi ek katmanlar gerekir.
İç altyapıda, geliştiriciler hem istemci hem de sunucu üzerinde tam kontrol sahibidir. Burada .proto kontratının tip güvenliği ve otomatik kod üretimi büyük avantaj sağlar. Servisler arası iletişimde hata oranı azalır, tekrar eden kod yükü düşer ve farklı diller arasında uyumlu API kullanılır.
Tek bir sistemde hem gRPC hem de REST kullanılabilir. Örneğin, mobil uygulama REST API'ye bağlanırken, backend içindeki servisler gRPC ile iletişim kurar. Ayrıca, API gateway'ler dışarıdan REST isteği alıp, içeride gRPC'ye çevirebilir. Böylece her katmana uygun mimari seçilebilir.
API tasarımında REST dışında başka yaklaşımlar da vardır. Örneğin, istemcinin ihtiyaç duyduğu veriyi kendisinin belirlediği GraphQL gibi. Detaylar için GraphQL ve REST: Farklar, Avantajlar ve Doğru Seçim yazımızı inceleyebilirsiniz.
Seçim, teknolojinin "daha modern" olmasından çok sistem ihtiyaçlarına bağlıdır. API dış geliştiricilere açık, HTTP araçlarıyla kolay test edilebilir ve tarayıcıda doğrudan çalışabilir olmalıysa REST daha uygundur. İç servisler sık sık veri alışverişi yapıyorsa, gRPC'nin avantajları öne çıkar.
gRPC'nin sunduğu kolaylıklar, bazen insan tarafından okunabilirliğin azalmasıyla gelir. Binary mesajları doğrudan incelemek zordur; test ve gözlem için özel araçlara ihtiyaç vardır. Tarayıcıdan klasik gRPC'ye erişim için ek altyapı gereklidir. Ayrıca .proto dosyalarını değiştirirken geriye dönük uyumluluğa dikkat edilmelidir. En önemlisi, gRPC kullanmak mimariyi otomatik olarak "hızlı" yapmaz; yanlış mimari, çok sayıda gereksiz ağ çağrısı ise asıl darboğaz olabilir.
Bu nedenle, gRPC en çok iç API'ler, sık mesajlaşma, streaming ve tip güvenliği gerektiren ortamlarda fayda sağlar. REST ise açık, tarayıcı dostu ve basit web hizmetleri için güçlü bir alternatiftir.
gRPC, istemcinin uzak metotları önceden tanımlanmış bir kontrat üzerinden çağırdığı bir servisler arası iletişim yaklaşımıdır. Protocol Buffers, mesajları hem kompakt hem de tip güvenli tutar; HTTP/2 ise çoklu isteklerin ve veri akışının hızlı ve verimli taşınmasını sağlar.
gRPC, özellikle dağıtık sistemlerde ve mikroservis altyapılarında; sık, kısa ve öngörülebilir veri alışverişinde, farklı dillerde kod üretiminde ve ortak API kontratı kullanmada öne çıkar. Bu tür ortamlarda klasik JSON ile REST'e göre daha hızlı ve pratik olabilir.
REST ise açık API'ler, web uygulamaları ve hızlı entegrasyon gereken yerler için pratikliğini korur. Sonuç olarak, seçim "hangisi daha hızlı"dan çok, sistemin mimari ihtiyacına göre yapılmalıdır: İç servisler ve streaming için gRPC, açık ve kolay erişim için REST daha uygundur.