gRPC Nedir?
Günümüzde REST tabanlı servisler oldukça yaygın olarak kullanılıyor. Özellikle son yıllarda yüksek performans gerektiren servis tabanlı uygulamalarda ihtiyaç duyulan ve giderek yaygınlaşan bir RPC protokolü olan gRPC’yi bu yazıda kısaca tanıtacak ve basit bir örnekle çalışma mantığını sizlere aktaracağım.
Bu protokol, servis tabanlı uygulamalarda dil ve platformdan bağımsız şekilde, yüksek performanslı ve verimli şekilde haberleşme yapmak için tasarlanmıştır. gRPC, açık kaynaklı bir Remote Procedure Call (RPC, Uzaktan İşlem Çağrısı) protokolüdür. Bu protokolün Google tarafından geliştirildiğini de belirtmekte fayda var.
Rest servislerde veri iletişiminde JSON formatı kullanılırken burada Protobuf yöntemi karşımıza çıkmaktadır. Protobuf veri serileştirme (binary serialization) yöntemidir. Protobuf, veriyi küçük, hızlı ve güçlü bir şekilde serileştirir ve aynı zamanda verinin doğruluğunu da korur. Alttaki tabloda iki farklı Java uygulamasının JSON ve Protobuf veri formatı ile iletişim kurması durumunda
gRPC servisi, HTTP 2.0 desteği ve binary serialization gibi özellikler sayesinde, REST’e göre hızını 8 katına kadar çıkarabilmektedir. Bu nedenle, dağıtık microservice altyapıları için hızlı bir iletişim altyapısı sağlar. Bu iletişim, 4 farklı şekilde sağlanabilir.
Unary: Bir request gönderilerek, tek bir response alınır.
Server Streaming: Sunucu tarafından gönderilen yanıtlar sürekli olarak akış halinde verilir.
Client Streaming: Client tarafından gönderilen istekler sürekli olarak akış halinde gönderilir.
Bidirectional Streaming: Client ve sunucu tarafından gönderilen istekler ve yanıtlar sürekli olarak akış halinde olur.
gRPC ve Protobuf’un nasıl çalıştığı hakkında kısa bir bilgi verdikten sonra, .Net üzerinde bir örnek yapalım.
Öncelikle proto dosyamızı oluşturalım.
Server ve Client tarafı arasında iletişim kurmak için aynı proto dosyalarının bulunması gerekir. Proto dosyaları, farklı dillerde desteklenen protobuf kütüphaneler aracılığıyla kullanılabilir ve bu kütüphaneler dosyanın yapısını anlamak ve kullanmak için gerekli olan fonksiyonları sağlar. Yani, isterseniz client projenizi Go dilinde bu proto dosyası ile oluşturabilirsiniz. Proto compiler, desteklenen her dilde oluşturduğumuz structure’ı transform etme yeteneği sayesinde kullanımı kolaylaştırır.
syntax = “proto3″;
package ProductProto;
service Product {
rpc SearchProducts (SearchRequest) returns (stream ProductModel);
rpc GetAllProducts (GetAllRequest) returns (ProductResponse);
rpc GetProduct (GetProductsRequest) returns (ProductModel);
}
message ProductModel{
int32 productId = 1;
string productName = 2;
}
message ProductRequest{
int32 Id = 1;
}
message GetProductsRequest {
int32 productId = 1;
}
message GetAllRequest {}
message SearchRequest {
string productName = 1;
}
message ProductResponse{
repeated ProductModel product = 1;
}
Proto dosyamız, SearchProducts, GetAllProducts ve GetProduct işlemlerini gerçekleştirmek için 3 adet “rpc” (uzak yordam çağrısı) içermektedir. Tanımladığımız istek ve yanıt modelleri sayesinde, metotlar ne girdi alacağını ve ne döndüreceğini biliyor.
Field numaraları aslında önemsizdir, bu alanlar bellekte saklanması için kullanılan benzersiz tanımlayıcılarıdır. Bu tanımlayıcılar, protobuf verilerinin serialize ve deserialize işlemi sırasında kullanılır. Aynı zamanda veri boyutunu azaltmak için kullanılır ve değiştirilebilir. 1-15 arası da bu yüzden kritik fieldlar için rezerve edilmelidir.
gRPC Server uygulamasını yapacağımızı proje dosyamızda declare edelim.
Proto compiler tarafından oluşturulan base sınıfından miras alarak servis sınıfımızı oluşturabiliriz.
Not: Alttaki kod parçalarının daha büyük hallerini resmin üzerine tıklayarak görebilirsiniz.
Son olarak, Program.cs dosyamıza servis sınıfımızın endpoint adresini ekliyoruz.
ProductServer uygulamamız tamamlandı. Burada, ProductBase sınıfımızdan miras alarak metotlarımızın içlerini senaryomuza göre doldurduk. Bu sayede, bize ürün kartı bilgisi verilecektir. Şimdi, Client tarafında bu bilgileri tüketecek uygulamamıza geçebiliriz.
Sonuçları görmek için, bir console uygulaması oluşturup server tarafında olduğu gibi, csproj dosyamıza client tarafında da bazı kütüphaneleri ve client uygulaması olacağımızı bildirmemiz gerekiyor.
İlgili servisin adresine istek göndermek için metotlarımızı yazıyoruz ve cevapları alıyoruz.
Artık projelerimizi çalıştırabiliriz. Örnek olması açısından, UnaryCall ve ServerStream tiplerinde isteklerimiz bulunuyor.
Özetle, gRPC servisinin nasıl çalıştığı hakkında bilgiler edindik. Burada gRPC’nin kendi dokümantasyonundan veya Github üzerinden projeyi indirerek diğer iletişim türleriyle de denemeler yapabilirsiniz.
Zaman ayırdığınız için teşekkürler.
Proje Linki: GitHub