Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

gRPC – Client Streaming Yöntemiyle Client ve Server İletişimi

Merhaba,

Bu içeriğimizde, iki uygulama arasında iletişimin gRPC üzerinden Client Streaming yöntemiyle nasıl sağlandığını pratikte inceliyor olacağız.

İlk olarak Client Streaming yönteminin ne olduğunu hatırlayarak başlayalım.

gRPC Nedir? Ne Amaçla ve Nasıl Kullanılır?

Client’ın server’a stream mesaj gönderdiği ve server’ın tek bir response döndürüğü RPC türüdür. Yani client birden çok mesaj gönderiyor, server buna karşılık tek bir cevap döndürüyor. Anlayacağınız Server Streaming’in tam tersi bir akış söz konusudur.


Evet, Server Streaming‘de incelediğimiz akışın tam tersi Client Streaming için geçerlidir. Ş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(stream MessageRequest) returns (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’ stream’i istemekte ve response olarak geriye ‘MessageResponse’ nesnesi döndürmektedir. Yani gönderilen birden fazla ‘MessageRequest’ nesnesine karşılık tek bir ‘MessageResponse’ nesnesini cevap olarak göndermektedir.

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<MessageResponse> GetMessage(IAsyncStreamReader<MessageRequest> requestStream, ServerCallContext context)
        {
            await Task.Run(async () =>
            {
                while (await requestStream.MoveNext())
                {
                    Console.WriteLine($"Mesaj alınmıştır.");
                    Console.WriteLine("Gelen mesaj : ");
                    Console.WriteLine(requestStream.Current.Message);
                }
            });

            return new MessageResponse { Message = "İstek alındı ve işlendi..." };
        }
    }

Yukarıdaki servis detayını incelerseniz eğer kullanılan Client Streaming yöntemine uygun olacak şekilde stream olarak birden fazla değer şeklinde gelen request’e karşılık tek bir response dönülmektedir.

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 request = messageClient.GetMessage();

            await Task.Run(async () =>
            {
                int count = 0;
                while (++count <= 10)
                {
                    await request.RequestStream.WriteAsync(new MessageRequest { Message = $"Gönderilen mesaj {count}" });
                    await Task.Delay(1000);
                }
            });

            //RequestStream başarıyla sonlandırılıyor.
            await request.RequestStream.CompleteAsync();

            var response = await request;
            Console.WriteLine($"Gelen Cevap : {response.Message}");
        }
    }

Dikkat ederseniz client, kullanılan Client Streaming yöntemine uygun olacak şekilde stream data ile istekte bulunmakta, buna karşılık server’dan gelen ‘MessageResponse’ türünden sonucu elde ederek ekrana yazdırmaktadır.

Test Edelim

gRPC - Client Streaming Yöntemiyle Client ve Server İletişimi

Görüldüğü üzere Client Streaming yöntemiyle client ve server arasında başarıyla iletişim kurulabilmekte ve yapılan stream request’e karşılık tek bir 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

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. 06 Ocak 2021

    […] Streaming, önceden ele aldığımız Client Streaming ile Server Streaming‘in kombine edilmiş varyasyonu olarak çalışmakta ve her iki […]

  2. 17 Ocak 2021

    […] ise tam tersi client’dan server’a akış gerçekleştirileceğinden Client Streaming veri iletim tipi […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*