gRPC Nedir? Protocol Buffer, Stream ve Dahası

grpc-nedir

gRPC açık kaynaklı ve uzak prosedür çağrılarıyla istemci ile sunucu arasında iletişim kurulmasını sağlayan bir framework olmakla birlikte sağladığı multi-language desteği, HTTP/2, REST’e göre x8 kat daha hızlı olması, binary serileştirmesi gibi özellikleriyle öne çıkmaktadır. İstemci ile sunucu arasında gerçekleşecek bu iletişim kontratlara dayanmaktadır. Bu kontratlar Protocol Buffer olarak adlandırılmakta ve bu kontratlar .proto uzantısına sahip olmaktadır. Genellikle sınırlı bant genişliği ve hafızaya sahip IoT cihazlarıyla iletişimde ve mikro servislerde servisler arası iletişimde tercih edilirler.

Konuyu pekiştirmek adına ürün yönetim işlemlerini gerçekleştirecek basit bir sistem kuracağız. Buna göre hem ürünleri yayınlayacak bir sunucu servisi ve bu servisi consume edecek bir istemci servise ihtiyacımız olacak.

Server (Sunucu) Projesi

Proje dosyalarını oluşturmaya ProductGrpc isimli ve ASP.NET Core Empty tipindeki servisi oluşturarak başlayalım. Bu proje senaryoya göre istemci değil sunucu rolünde olacaktır.

appsettings.json dosyasına Kestrel Http/2 konfigürasyonunu ekleyelim.

Hemen gerekli paketleri kuralım. Proje, sunucu rolünde olacağı için Grpc.AspNetCore isimli paketi kurmamız gerekmektedir.

Paketi kurduktan sonra kontratımızı yazmaya başlayalım. Bunun için projemize Protos isimli bir klasör açarak product.proto isminde bir dosya oluşturalım ve içini aşağıdaki gibi dolduralım.

Koda baktığınızda ProductProtoService isminde bir arayüz tanımlandığını ve içerisinde 6 adet rpc’nin (Remote Prosedure Call) aldıkları parametre ve geri dönüş tipleriyle birlikte tanımlandığını görebilirsiniz.

Oluşturduğumuz Proto Buffer dosyasını ProductGrpc.csproj dosyamıza ekleyelim ve projemizi derleyelim, böylece ihtiyacımız olan sınıflar generate edilecektir. Burada dikkat edilmesi gereken nokta servisin istemci olarak mı sunucu olarak mı kullanılacağının GrpcServices attribute’ü içerisinde bildirilmesidir.

Proje derlendikten sonra obj/net5.0/Protos dizininde oluşturulan gRPC servisine göz atabilirsiniz. Bu servis oluşturulurken hazırladığımız product.proto dosyasından beslenmiştir.

Şimdi kullanacağımız model ve mock-datalarımızı oluşturalım. Bunun için Models klasörü altına Product.cs ve Data klasörü altına Mock.cs dosyalarımızı aşağıdaki gibi oluşturalım.

Generate edilmiş servisi inherit ederek methodlarımızın içerisini doldurmaya başlayalım, bunun için Services klasörü altına ProductService.cs dosyasını oluşturalım ve ProductProtoService.ProductProtoServiceBase sınıfından türetelim. Bu isim oluşturduğumuz proto dosyasında servise verdiğimiz isme göre değişmektedir.

Oluşturulan servis ile Startup.cs dosyasında Grpc’yi konfigüre edelim.

Client (İstemci) Projesi

Oluşturduğumuz sunucu projesini consume edecek istemci projesini yine aynı yöntemle ProductGrpcClient isminde ve Worker Service tipinde oluşturalım.

Projeyi oluşturduktan sonra Protos isimli bir klasör açarak ProductGrpc projesindeki product.proto dosyasını içerisine kopyalayıp ilgili aşağıdaki değişikliği yapalım.

ProductGrpcClient.csproj dosyası içerisine .proto dosyamızı ekleyelim. Burada GrpcServices attribute’ünü Client olarak işaretlediğimize dikkat edin.

Bu işlemden sonra sunucu projemizi iki yoldan consume edebiliriz. İlkine göz atalım. Bunun için öncelikle Google.Protobuf, Grpc.Net.Client ve Grpc.Tools paketlerini kurarak işleme devam edelim.

Bu yolla rpc fonksiyonlarımızı artık çağırabiliriz. Bir diğer yönteme göz atalım, bunun için ise Grpc.AspNetCore isimli paketi kurmamız yeterli. Ardından ConfigureServices methodu içerisinden servisimizi client olarak işaretleyelim.

Daha sonra consume edeceğimiz client servisindeki methodları işleyeceğimiz Services klasörü altına ProductService.cs isimli sınıfımızı oluşturalım.

Yazmış olduğumuz servis methodlarını kullandığımız örneğe göz atalım.

Bonus: gRPCurl

gRPCurl, gRPC sunucularına komut satırından erişmek için kullanılan bir tooldur. Bu bağlantıyı kullanarak kurulum yapıldıktan sonra Grpc.AspNetCore.Server.Reflection paketini kurup bu özelliği kullanacağımızı Startup.cs dosyasında bildirdikten sonra aktif hale getiriyoruz.

Aşağıdaki komutları kullanarak komut satırı üzerinden, çalışan bir gRPC sunucusuna ulaşarak ilgilendiğiniz kaynaklara ulaşabilirsiniz.

Bonus: Logging

gRPC servisi ve istemcisi built-in log altyapısını kullanılır, loglar beklenmeyen durumların debug edilmesinde işlerimizi kolaylaştırır. Loglamayı aktif etmek için iki yol izleyebiliriz, bunlardan ilki appsettings.json içerisine aşağıdaki kod, log düzeğiyle birlikte eklenmelidir.

Bir diğer yöntemdeyse, Program.cs altından ConfigureLogging methodunu çağırarak aktif hale gelmektedir.

Kaynak dosyasına buradan ulaşabilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.