gRPC – Server Streaming Yöntemiyle Client ve Server İletişimi
Merhaba,
Bu içeriğimizde, iki uygulama arasında iletişimin gRPC üzerinden Server Streaming yöntemiyle nasıl sağlandığını pratikte inceliyor olacağız.
İlk olarak Server Streaming yönteminin ne olduğunu hatırlayarak başlayalım.
Bu yöntemde server tek bir request’e karşılık birden fazla response dönebilmektedir.
Şimdi gelin, bu yöntem ile bir client ve server çalışması sergileyelim.
Proto Dosyası
Client ve server olmak üzere her iki uygulama arasındaki kontratı aşağıdaki message.proto dosyası üzerinden sağlayacağız.
syntax = "proto3"; option csharp_namespace = "gRPCExample"; package message; service Message { rpc GetMessage(MessageRequest) returns (stream MessageResponse); } message MessageRequest { string message = 1; } message MessageResponse { string message = 1; }
Yukarıdaki message.proto içeriğine göz atarsanız eğer içerisinde ‘GetMessage’ isimli fonksiyon barındıran ‘Message’ isimli bir servis oluşturulmaktadır. İlgili fonksiyon yapılacak request neticesinde bir ‘MessageRequest’ nesnesi istemekte ve response olarak geriye ‘MessageResponse’ stream’i döndürmektedir. Yani bu birden fazla ‘MessageResponse’ nesnesi döndürebilir demektir. Şimdi gelin bu durumu inceleyelim.
Server’da Message Service’i
Client’tan gelecek olan isteği server’da karşılayacak olan ‘MessageService’i aşağıdaki gibi tasarlayalım.
public class MessageService : MessageBase { public override async Task GetMessage(MessageRequest request, IServerStreamWriter<MessageResponse> responseStream, ServerCallContext context) { Console.WriteLine($"Mesaj alınmıştır."); Console.WriteLine("Gelen mesaj : "); Console.WriteLine(request.Message); await Task.Run(async () => { int count = 0; while (++count <= 10) { await responseStream.WriteAsync(new MessageResponse { Message = $"Gönderilen mesaj {count}" }); await Task.Delay(1000); } }); } }
Dikkat ederseniz eğer ‘MessageService’ geriye bir stream döndüreceğinden dolayı override edilen ‘GetMessage’ metodunun ikinci parametresi ‘IServerStreamWriter’ olarak generate edilmiştir. Yani stream edilebilir bir türde ilgili response değerimiz gelmiştir. Haliyle bizde örneklendirme amaçlı, ilgili metot içerisinde operasyonel olarak 1’er saniye arayla toplamda 10 adet mesaj stream eden sembolik bir operasyon gerçekleştirmekteyiz.
Client
İstek gönderecek client’ın aşağıdaki gibi geliştirilmesi yeterli olacaktır;
class Program { static async Task Main(string[] args) { var channel = GrpcChannel.ForAddress("https://localhost:5001"); var messageClient = new Message.MessageClient(channel); Console.WriteLine("Lütfen gönderilecek mesajı giriniz."); var messageResponse = messageClient.GetMessage(new MessageRequest { Message = Console.ReadLine() }); await Task.Run(async () => { while (await messageResponse.ResponseStream.MoveNext(new System.Threading.CancellationToken())) Console.WriteLine($"Gelen mesaj : {messageResponse.ResponseStream.Current.Message}"); }); } }
Dikkat ederseniz client kullanılan Server Streaming yöntemine uygun olacak şekilde tek bir istekte bulunmakta, lakin stream’den gelen birçok veriyi döngüyle elde etmektedir.
Test Edelim
Görüldüğü üzere Server Streaming yöntemiyle client ve server arasında başarıyla iletişim kurulabilmekte ve yapılan tek bir request’e karşılık birden fazla response elde edilebilmektedir.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…
Not : Örnek projeleri indirebilmek için aşağıdaki adreslere tıklayınız.
gRPCClientExample
gRPCServerExample
2 Cevaplar
[…] Server Streaming‘de incelediğimiz akışın tam tersi Client Streaming için geçerlidir. Şimdi gelin, bu […]
[…] server’dan client’a bir akış söz konusu olacağından dolayı Server Streaming veri iletim tipi benimsenmişken, ‘FileUpload’da ise tam tersi client’dan […]