gRPC’de Proto Dosyası ve Client Server Uygulamalarının Oluşturulması

Tugba Avci
4 min readAug 10, 2023

--

Selamlar, bir önceki yazımda gRPC nin ne olduğunu, gRPC Nedir, Hangi Amaçla ve Nasıl Kullanılır? başlığı altında teorik olarak anlatmaya çalıştım. Bu yazımda ise client — server uygulamalarının nasıl oluşturulup geliştirildiğini, iki uygulama arasında ki iletişimi proto dosyası ile nasıl sağladığımızı anlatmaya çalışacağım.

gRPC Server Projesi Oluşturma

İlk olarak bir gRPC server projesi oluşturarak başlayalım. Visual Studio ortamında gRPC service platformumuzu seçip ardından proje ismini belirtiyoruz. Ben “GrpcServerExample” ismini verdim.

Framework olarakta .net 6 da oluşturuyorum.

Startup.cs dosyasını incelersek eğer, ilk olarak bir uygulamanın gRPC servisi olması için AddGrcp() komutunun eklenmesi gerekir.

İkinci aşama ise server’ın aksiyonlarını belirlediği service belirtilmiştir. Client’tan gelen requestteki methodu hangi servisin karşılayacağını bildirmiş oluruz.

Oluşturulan projeye bakarsak, ekstradan ‘Protos’ klasörü ve altındaki ‘greet.proto’ dosyasını görebiliriz.
Client-server arasındaki iletişimi üstlenecek olan dosyadır.

Biraz daha yakından inceleyelim.Proto dosyamızın içerisinde ‘syntax’, ‘option’ ve ‘package’ keywordler ile ‘service’ ve ‘message’ tanımlamaları bulunmaktadır.

· syntax
Proto sürümünü ifade eder.
· option
Generate edilecek servisin namespace adını ifade eder.
· package
Generate edilecek servis dosyalarında kullanılacak paketleri ifade eder.
· service
Uygulamadaki generate edilecek servisin adını ve içerisindeki metot ifade etmektedir.
· message
Client ile server arasındaki veri iletiminde kullanılacak mesaj türünü ifade etmektedir.

Yukarıdaki projeyi ele alırsak,

1 de gösterilen oluşturulacak olan servisin adı,
2 de ise servisin içerisinde yer alacak olan fonksiyonun adı,
3 de bu fonksiyonumuzun hangi türde bir parametre alacağını belirlediğimiz kısım (request esnasında gelen mesaj olarak düşünebiliriz ),
4 de ise requestin sonucunda geriye dönülecek olan response türüdür.

Service ile birlikte mesaj türlerinide belirttiğimize göre artık bunu kullanacak olan servisinde yazılması gerekiyor.Örnek proje de Services klasörunun altında ‘GreeterService’ classını görebiliriz.

Yukarıdaki servise bakarsanız eğer servisin name.nameBase şeklinde isimlendirildiğini görebilirsiniz. Böylese servis, base class içerisinde generate ettiği proto dosyası ile, methodun implementasyonunun bulunduğu kod bloklarından oluşan bir servis sınıfı haline gelir.

gRPC Client Projesi Oluşturma

Şimdi gelelim yukarıda oluşturduğumuz uygulamaya gRPC üzerinden request atabilmesi için bir client service oluşturulmasına..

Ben console uygulamasını tercih ettim fakat siz web, mobil, windows form yada console platformlarından herhangi birini tercih edebilirsiniz.
Aşağıdaki gibi proto dosyası oluşturalım.

Server ile client ın haberleşmesini sağlayacak ve türlerin generate operasyonunu üstlenecek olan proto dosyasıdır. Birebir aynı içerikte olması gerekir. Dosyada sadece csharp_namespace değiştirilmiş.

Client uygulamasında Google.Protobuf,Grcp.Net.Client ve Grpc.Tool paketlerinin yüklenmesi gerekmektedir.

· Google.Protobuf
Protobuf serialization ve deserialization işlemleri için
· Grpc.Net.Client
.NET mimarilerine uygun gRPC kütüphanesidir.
· Grpc.Tools
Proto dosyalarını derlemek için gerekli compiler’ı içeren kütüphanedir.

Geriye yapılması gereken son bir adım kaldı, clientın servera requestte bulunması için aşağıdaki kog bloğunu program.cs dosyasına yazabilirsiniz.

static async Task Main(string[] args)
{
var channel = GrpcChannel.ForAddress("http://localhost:5001");
var greetClient = new Greeter.GreeterClient(channel);
HelloReply response = await greetClient.SayHelloAsync(new HelloRequest
{ Name = "Tugba" });
Console.WriteLine($"Gelen Cevap : {response.Message}");
}

Kod bloğunu incelersek eğer, Grpc server a istek atabilmesi için, server ın adresini dinleyen bir channel oluşturulmaktadır. Ardından proto dosyamızda belirttiğimiz server da da bulunan, SayHello methoduna istediği nesne( HelloRequest) birlikte request atıp , HelloReply responsu elde edilir.

Test kısmında iki projeyide sırasıyla ayağa kaldırıp denediğimizde aşağıdaki sonucu aldığımızı görürüz.

Test ederken farkedeceğinizi umduğum şey, bu sürecin Http/2 protokolü üzerinden daha hızlı yanıt döndüğünü anlamanız.

Bir sonraki yazımda görüşmek üzere
gRPC’de Unary Yöntemi ile Client — Server Uygulaması Oluşturma

Umarım faydalı bir paylaşım olmuştur.

Sevgiler..

--

--