gRPC Genel Bakış ve .Net Core ile Client/Server Örnekleri

Berk Emre Çabuk
3 min readJan 19, 2020

--

.Net Core 3.0 ile birlikte gRPC hakkında makaleler tekrar hareketlenince ben de küçük bir katkıda bulunayım dedim. Başlık beklentiyi biraz yükseltebilir ama bu yazımda gRPC’ye basit bir giriş yaparak Star Wars evreninden küçük bir kullanım örneği göstereceğim.

Nedir bu gRPC?

Google, kendi iç servislerinde kullandığı json serialization yükünden bıkarak binary seviyesinde kullanabileceği protobuf protokolü ile rpc(remote procedure call) modelini birleştiriyor ve başına da google’ın g sini koyup 2016 yılında gRPC’yi tanıtıyor. Peki neden böyle bir şeye ihtiyaç duyuldu?

Öncelikle gRPC HTTP/2 kullanmaktadır yani diğer REST/HTTP1 yöntemlerine göre;

  • tek tcp connection ile bir çok istek gönderebiliyor
  • RTT sayısı daha az
  • Binary seviyesinde iletişim kuruyor
  • http headers’ları sıkıştırılabiliyor

HTTP/2’ nin bu farkları %30–40 oranında fazla performans sağlıyor. Ayrıca gRPC, binary serialization kullandığından dolayı json serialization’a göre hem daha performanslı hem de daha az bandwidth ihtiyacı duymaktadır.

Genel olarak gRPC’nin avantajları:

  • HTTP/2 kullanması
  • Binary serialization ile json’a göre daha yüksek performans daha az bandwidth kullanımı
  • Çoklu dil/platform desteği ile geniş bir kitleye destek vermesi
  • Open Source ve arkasındaki güçlü comminity
  • Bi-directional Streaming işlemlerini desteklemesi
  • SSL/TLS kullanımını desteklemesi
  • Bir çok Authentication yöntemini desteklemesi
faydaları say say bitmez

“Oh be! gRPC geldi de rest graphQl vs. hayatımızdan çıktı.” diyeceğimiz bir dünya yok tabi ki. Çünkü her birinin cevap verdiği ihtiyaçlar farklı. Bundan dolayı “Rest bitiyor mu?” sorusunun cevabı bence hayır. Peki gRPC hangi ihtiyacımıza çözüm oluyor? Tabi ki başta streaming işlemleri geliyor. (Netflix buna güzel bir örnek.) Bunun dışında kendi içinde haberleşen servislerimizde, performansa ihtiyacımız olan yerlerde kullanabiliriz. (Google da buna güzel bir örnek).

Her şey güzel, faydaları da oldukça fazla. Peki biz bunu nasıl kullanacağız?
Server ve clientın iletişim kuracağı metod ve modellerin tanımlandığı Contract temelli çalışır. Yani aslında REST’ten daha çok SOAP’a benziyor. Buradaki contract’larımız aslında protoc dosyalarımız olacaktır.

4 farklı servis metodu bulunmaktadır. Şimdi işin keyifli tarafı geldi

Basit bir konsol uygulaması ile gRPC’nin 4 farklı metodunu deneyelim. Bunun için projemiz 3 farklı bölümden oluşacaktır.

  • Contract
  • Server
  • Client

Öncelikle Server ve Client’ın hangi model ve fonksiyonları kullanacaklarının belirlendiği contract’larımızı tanımlayalım. Modeller içerisinde her bir property’e belirli bir değer atıyoruz sebebi ise binary formata çevrildiği zaman propertylerin ayırt edilebilmesini sağlamaktadır. Ayrıca model ve fonksiyonların dışında enumlarımızı da başta bir proto tipinde tanımlayıp diğer contract’larımıza import edip kullanabiliriz.

Contract dosyalarımız protoc tipindedir. Çoğunlukla syntax olarak ise protoc3 kullanılır. protoc3 veya protoc2'ye bu yazımda değinmeyeceğim merak edenler için;

Tanımlarımızı yaptıktan sonra projeyi build ettiğimizde iki adet class oluşmaktadır.

StarWarsContractGrpc.cs

ContractGrpc class’ımız içerisinde ServiceBase’i server projemizde ilgili classımıza inheritance ettikten sonra metodları override ederek istediğimiz şekilde kullanabiliriz.

İlk Önce Server tarafını hazırlayalım

Server tarafında ilgili metodları nasıl kullanacağımızdan bahsetmiştim.

Star Wars’un efsane gemilerinden Millennium Falcon’un ana sistemi bizim server tarafımız olacak ve toplamda 4 örnek metodumuz bulunuyor :

1)rpc OpenLightSpeed(requestType) return(responseType):

“Unary RPC” metodunu kullanmaktadır. Aslında alışkın olduğumuz request-response kullanımı.

2)rpc AutoControl(RequestType) returns(stream ResponseType):

“Server Streaming RPC” metodunu kullanmaktadır. Aslında client’ın gönderdiği request’e cevap olarak stream data döneceğimiz sıralı response metodu server tarafı .

3)rpc OpenRadarScanning(stream RequestType) return(ResponseType):

“Client Streaming RPC” metodunu kullanmaktadır. Server Streaming’in tam tersidir bir upload işlemi olarak düşünülebilir.

4) rpc RadioControl(stream RequestType) return(stream ResponseType):

“Bi-directional Streaming RPC” metodunu kullanmaktadır. Çift taraflı streaming data akışı olmaktadır.

Server tarafını hazırlayıp ayağa kaldırdıktan sonra şimdi Client tarafına geçebiliriz.

Client tarafında ise channel’ı oluşturduktan sonra metodlarımızı teker teker çağırıp çalışma mantığını console a yazdırdığımız bilgilerden takip ediyoruz. Denemek isteyenler için örnek proje:

Bu yazımda basit bir giriş yapmak istedim, bir sonraki gRPC yazılarımda gRPC Authentication, gRPC-Gateway, örnek api projesi ile metodların detaylı anlatımı başlıklarına değinmeyi düşünüyorum.

--

--