gRPC
Tags: grpc
Published: 2023-10-04 07:59:26


### IDL(Interface description language)
- IDL'nin temel amacı, farklı dillerde yazılmış bileşenlerin birbirleriyle etkileşimde bulunabilmelerini sağlamaktır. 
- Bir bileşenin sunmuş olduğu hizmetleri ve veri türlerini açıkça belirlemek, diğer bileşenlerin bu hizmetlere ve verilere erişimini kolaylaştırır.
- Temel olarak, bir bileşenin veya modülün dışarıya açtığı fonksiyonların, veri yapılarının ve diğer arayüz öğelerinin nasıl görünmesi gerektiğini tanımlayan bir dil olarak düşünülebilir.
- Google protocol Buffers(protobuf), Apache Thrift, Apache Avro, openAPI/swagger, WSDL, CORBA gibi teknolojiler örnek olaraka verilebilir.<br><br>


### Protocol Buffers
- Google tarafından geliştirilen bir veri serileştirme ve iletişim biçimi formatıdır. 
- Protocol Buffers, hızlı, taşınabilir ve veri boyutunu minimize ederek veri alışverişini optimize eden bir veri serileştirme formatıdır.
- Bu format, özellikle dil ve platform bağımsız uygulamalar arasında veri alışverişi gerektiren senaryolarda yaygın olarak kullanılır.
- Protobuf, XML veya JSON gibi diğer veri serileştirme formatlarına alternatif olarak hafif ve hızlı bir yapı sunar. 
- Dosya uzantısı .proto formatında dır.
- Şu anda protobuf dosyaları yazarken 3. versiyon kullanılır. Her .proto uzantılı dosyanın başına syntax="proto3"; eklenmesi gerekir<br><br>


### RPC(Remote Procedure Call) 
- Farklı dillerde yazılmış servislerin birbirleriyle iletişim kurmalarını kolaylaştıran yapıdır.
- Servislerin güvenli, güvenilir ve etkili bir şekilde iletişim kurmalarını sağlamak bazı özellikler vardır:
  * Servis Keşfi (Service Discovery): Servislerin otomatik olarak birbirlerini tespit edebilmelerini sağlar. Bu, Servislerin IP adresleri veya bağlantı noktaları gibi detayları bilmelerine gerek kalmadan birbirleriyle iletişim kurmalarını sağlar.
  *  Authentication: Authentication, hizmetlerin birbirlerini tanımalarını ve yetkisiz erişimi engellemelerini sağlar.
  * Transport Layer Security (TLS): TLS, verilerin şifrelenerek iletilmesini sağlayan bir güvenlik protokolüdür. Bu, hizmetlerin verileri üçüncü şahısların okuyamayacağı şekilde iletmelerini sağlar.
  * Retries: İletişim sırasında geçici hatalar meydana gelebilir. Eğer bir çağrı başarısız olursa, hizmetler otomatik olarak yeniden deneyebilir.
  * Timeouts: Timeouts, bir çağrının belirli bir süre içinde cevap alamaması durumunda çağrının sonlandırılmasını sağlar.
  * Cancellation: Client, uzun sürecek bir çağrıyı iptal etmek isteyebilir. Bu özellik, client bir çağrıyı başlatıp iptal etmesini ve hizmetin gereksiz yere kaynak kullanımını önlemesini sağlar.<br><br>


### gRPC
- gRPC, Google tarafından geliştirilen ve açık kaynaklı bir Remote Procedure Call (RPC) framework'üdür. 
- Temelde, farklı dillerde yazılmış servislerin birbirleriyle iletişim kurmasını kolaylaştıran bir teknolojidir. 
- gRPC, Protocol Buffers (Protobuf) adı verilen bir veri serileştirme formatını temel alır ve modern dağıtık sistemlerde hızlı, verimli ve güvenilir iletişimi sağlamayı amaçlar.
- Protobuf, JSON veya XML'e göre daha hafif ve verimli bir veri taşıma biçimidir.
- gRPC, HTTP/2 tabanlı bir iletişim protokolünü kullanarak düşük geçikme süreleri ve yüksek veri iletim hızları sağlar. HTTP/2, tek bir bağlantı üzerinden çoklu veri akışını destekler.
- gRPC, otomatikleştirilmiş yük dengeleme, zaman aşımı, hata yönetimi, güvenlik (TLS), kimlik doğrulama ve yeniden deneme gibi ortak özellikleri destekler.
- gRPC, Protobuf tabanlı bir Service Definition Language kullanır. Bu dille servislerin ve mesajların tanımlanması sağlanır.
- Büyük ve karmaşık sistemlerde kullanım için tasarlanmıştır. Mikro hizmet mimarileri ve bulut tabanlı uygulamalar gibi senaryolarda sıkça tercih edilir.<br><br>

### Protobuf <br>

#### Message
- Protobuf'da `message`, veriyi taşımak ve iletmek için kullanılan bir yapıdır. 
- Bu mesajlar, farklı sistemler veya bileşenler arasında veri paylaşımını kolaylaştırmak için kullanılır. 
- Mesajlar, sahip oldukları fields ve bu alanların veri türleri ile tanımlanır.

`message ClientMsg {`<br>
  `  string firstVar = 1;`<br>
  `  int32 secondVar = 2;`<br>
`}`<br>

`message ServerMsg {`<br>
 `  string name = 1;`<br>
 `  int32 age = 2;`<br>
`}`<br>
<br>
#### Service
- Protobuf'da `service`, farklı bileşenlerin birbirleriyle iletişim kurmalarını sağlayan bir yapıdır.
- Servisler, clientlara serverlara belirli işlemleri yapması için talepte bulunabildiği bir yapıdır. 
- RPC kavramını Protobuf'da uygulamak için servisler kullanılır.

`service ServiceName {`<br>
`  rpc rpcCall (ClientMsg) returns (ServerMsg) {}`<br>
`}`<br>

rpcCall: RPC çağrısının adıdır. Client bu adı kullanarak servera belirli bir işlem yapma talebi gönderebilir.
<br>
#### Stream
`stream` verileri Protobuf ile RPC çağrılarıyla iletmek, büyük veri miktarlarını hızlı ve etkili bir şekilde işlemek, gerçek zamanlı uygulamalarda kullanmak, enerji tasarrufu yapmak ve daha fazla senkronizasyon ve yönetim esnekliği sağlamak gibi birçok avantajı beraberinde getirir.<br>
<br>
* Server Streaming: Sunucu tarafından tek bir isteğe karşı birden fazla yanıt gönderilebilir.<br>
`rpc rpcCall (ClientMsg) returns (stream ServerMsg) {}`<br>

* Client Streaming: İstemci tarafından birden fazla istek gönderilebilir ve sunucu tek bir yanıt gönderir.<br>
`rpc rpcCall (stream ClientMsg) returns (ServerMsg) {}`<br>

* Bidirectional streaming: client ile server arasında chat gibi req-res gönderir.<br>
`rpc rpcCall (stream ClientMsg) returns (stream ServerMsg) {}`<br>
<br>
Not: gRPC kullanan uygulamalarda url'deki v1,v2 yani versionlama protobuf'nin değiştiği anlamına gelir.