gRPC mülakat soruları ve cevapları, Rest ile farkları,Örnek Java ve Spring Boot gRPC uygulama kodu

gRPC Kapsamlı Rehber ve Örnek Uygulama

gRPC Kapsamlı Rehber ve Örnek Uygulama

gRPC Diagram

Aşağıda bir gRPC mülakatı için olası birkaç soru ve yanıtlarını bulabilirsiniz. Bu sorular, bir adayın gRPC'yi ne kadar iyi anladığını ve nasıl kullanabileceğini belirlemeye yardımcı olabilir.

Soru: gRPC nedir?
Yanıt: gRPC, Google tarafından geliştirilen açık kaynaklı bir yüksek performanslı uzaktan prosedür çağrısı (RPC) çerçevesidir. Bu çerçeve, istemci ve sunucu uygulamalarının aynı sistemde veya farklı sistemlerde bulunmasına bakılmaksızın birbirleriyle iletişim kurmasını sağlar. gRPC, HTTP/2 üzerinde çalışır ve Protobuf (Protocol Buffers) adı verilen bir veri formatını kullanır.
Soru: gRPC'nin anahtar özelliklerinden bazıları nelerdir?
Yanıt: gRPC'nin anahtar özelliklerinden bazıları şunlardır:
  • İstemci ve sunucu arasında düşük gecikmeli, yüksek hızlı iletişim.
  • HTTP/2 üzerinde çalışma yeteneği.
  • Protobuf veri formatı kullanma, bu da verilerin hızlı ve verimli bir şekilde serileştirilmesine ve tersine çevrilmesine olanak sağlar.
  • Tek yönlü, çift yönlü akış ve streaming desteği.
  • Çok dilli destek, yani çeşitli dillerde yazılmış servislerin birbiriyle iletişim kurabilmesi.
Soru: Protobuf (Protocol Buffers) nedir ve neden kullanılır?
Yanıt: Protobuf, Google'ın platformlar ve diller arasında veri alışverişi için geliştirdiği bir veri formatıdır. gRPC, Protobuf'u, veri serileştirmesi ve tersine çevirmesi hızlı ve verimli olduğu için kullanır. Bu, gRPC'nin yüksek performansını sağlar. Ayrıca, Protobuf dosyaları .proto dosyalarında tanımlanır ve bu dosyaları kullanarak otomatik olarak istemci ve sunucu kodu oluşturabiliriz.
Soru: gRPC'nin RESTful servislere göre avantajları nelerdir?
Yanıt: gRPC'nin RESTful servislere göre birkaç avantajı vardır. Öncelikle, Protobuf kullanımı sayesinde gRPC, JSON'a göre daha hızlı veri serileştirmesi ve tersine çevirme işlemi yapabilir. Ayrıca, HTTP/2 üzerinde çalışır, bu da daha verimli ağ kullanımı, daha düşük gecikme ve çift yönlü iletişim gibi avantajları beraberinde getirir. Son olarak, gRPC tek yönlü ve çift yönlü streaming'i desteklerken, RESTful API'lar genellikle bunu desteklemez.
Soru: gRPC'nin hangi durumlarda kullanılması uygundur?
Yanıt: gRPC genellikle aşağıdaki durumlarda kullanılır:
  • Mikroservisler arasında hızlı ve verimli iletişim gerektiğinde.
  • Poliglot (çok dilli) programlama gerektiren durumlarda, çünkü gRPC çeşitli dilleri destekler.
  • Tek yönlü veya çift yönlü veri akışı gerektiren durumlarda.
Soru: gRPC nasıl çalışır?
Yanıt: gRPC, Protobuf kullanarak istemci ve sunucu arasında veri aktarır. İstemci, bir RPC çağrısı yapar ve bu çağrı Protobuf kullanılarak serileştirilir ve HTTP/2 üzerinden sunucuya gönderilir. Sunucu, isteği alır, gerekli işlemleri yapar ve yanıtı Protobuf kullanarak serileştirir ve istemciye geri gönderir.
Soru: gRPC'de hata yönetimi nasıl gerçekleştirilir?
Yanıt: gRPC, hata durumlarını yönetmek için durum kodları kullanır. Bir RPC çağrısı başarısız olduğunda, sunucu bir durum kodu ve isteğe bağlı olarak bir hata mesajı döner. Durum kodları, gRPC belirtiminde standartlaştırılmıştır ve çeşitli durumları kapsarlar, örneğin "CANCELLED", "UNKNOWN", "INVALID_ARGUMENT", "DEADLINE_EXCEEDED" ve daha fazlası.
Soru: gRPC'nin "çift yönlü streaming" özelliği nedir?
Yanıt: Çift yönlü streaming, gRPC'nin bir istemci ve sunucunun birbirine bağımsız olarak ve istedikleri sırada mesaj göndermelerini sağlayan bir özelliğidir. Bu, iletişim için çok daha fazla esneklik sağlar. Çift yönlü streaming, HTTP/2'nin bu tür bağlantıları destekleme yeteneğini kullanır.
Soru: gRPC'nin HTTP/2 üzerinde çalışmasının avantajları nelerdir?
Yanıt: HTTP/2'nin kullanılmasının birkaç avantajı vardır. Öncelikle, HTTP/2, aynı anda birden çok isteği aynı bağlantı üzerinden gönderme yeteneği olan çoklu iletişim kanallarını (multiplexing) destekler. Bu, ağ kaynaklarını çok daha verimli bir şekilde kullanır ve gecikmeyi azaltır. İkincisi, HTTP/2 çift yönlü iletişimi destekler, bu da çift yönlü streaming'i mümkün kılar. Üçüncüsü, HTTP/2 sunucu tarafından itme (server push) özelliğini destekler, bu da sunucunun istemci tarafından açıkça istenmeyen verileri göndermesini sağlar.
Soru: gRPC'nin desteklediği dillerden bazıları nelerdir?
Yanıt: gRPC, C++, Java, Python, Go, Ruby, C#, Node.js, Android Java, Objective-C ve PHP gibi çeşitli dilleri destekler. Bu, farklı dillerde yazılmış uygulamaların birbirleriyle etkili bir şekilde iletişim kurabilmesini sağlar.
Soru: gRPC ile birlikte nasıl kimlik doğrulama yapılır?
Yanıt: gRPC, çeşitli kimlik doğrulama yöntemlerini destekler. Google'ın belirteci tabanlı (token-based) OAuth2'yi desteklemesi gibi, ayrıca SSL/TLS ve çift taraflı SSL/TLS'yi de destekler. İstemci ve sunucu arasında güvenli bir bağlantı kurmak için bu yöntemler kullanılabilir. SSL/TLS, istemci ve sunucu arasındaki veri aktarımını şifreler ve çift taraflı SSL/TLS, hem istemcinin hem de sunucunun kimliklerini doğrular.
Soru: gRPC'de deadline / timeout kavramı nedir?
Yanıt: Deadline ya da timeout, bir RPC çağrısının ne kadar süre içinde tamamlanması gerektiğini belirler. Eğer belirtilen süre içerisinde bir yanıt alınamazsa, gRPC çağrısı hata döner. Bu özellik, uzun sürebilecek veya belirsiz sürede tamamlanabilecek işlemler için önemlidir ve böylece bir uygulamanın asla yanıt gelmeyen bir istek nedeniyle bloke olmasını önler.
Soru: gRPC ve REST arasındaki farklar nelerdir?
Yanıt: gRPC ve REST arasında birkaç önemli fark vardır:
  • Veri Formatı: gRPC, Protobuf kullanır, bu da verinin küçük boyutlu ve hızlı bir şekilde serileştirilmesine olanak sağlar. REST genellikle JSON kullanır, bu da daha okunabilir ama daha büyük boyutludur.
  • HTTP Sürümü: gRPC, HTTP/2 kullanır, bu sayede aynı bağlantı üzerinden birden çok isteği aynı anda işlemek ve çift yönlü iletişim kurmak mümkündür. REST genellikle HTTP/1.1 üzerinde çalışır.
  • İletişim Şekli: gRPC, hem tek yönlü hem de çift yönlü akışları destekler. REST genellikle sadece istek/yanıt modelini kullanır.
  • API Tasarımı: gRPC, daha belirgin bir sözleşmeyle servislerin ve istek/yanıt mesajlarının açıkça tanımlandığı bir .proto dosyası kullanır. REST daha esnektir ve belirgin bir sözleşme zorunluluğu yoktur.
Soru: gRPC'deki Interceptor'lar nedir?
Yanıt: Interceptor'lar, gRPC çağrıları üzerinde özel bir mantığın çalıştırılmasına olanak sağlar. Bunlar, istemci ve sunucu tarafında, RPC'lerin gönderilmesi veya alınması sırasında uygulanabilir. Örneğin, Interceptor'lar, kimlik doğrulama, günlük kaydı (logging), metrik toplama ve hata işleme gibi görevler için kullanılabilir.
Soru: gRPC, hangi dillerdeki uygulamalar arasında iletişim kurabilir?
Yanıt: gRPC, çok dilli (polyglot) destek sunar, bu da birçok farklı programlama dilinde yazılmış uygulamaların birbirleriyle iletişim kurabileceği anlamına gelir. gRPC'nin desteklediği diller arasında Java, C#, Go, Python, Ruby, Dart, Kotlin ve daha pek çok dil bulunur.
Soru: gRPC'nin "idempotent" kavramı nedir ve neden önemlidir?
Yanıt: Idempotency, bir işlemin tekrarlanmasının sonucu değiştirmeyeceği anlamına gelir. Bu, ağ bağlantısı sorunları gibi durumlarda önemlidir: bir istemci, bir isteğin başarılı olup olmadığından emin olamazsa, aynı isteği güvenle tekrar gönderebilir. Eğer RPC idempotent olarak işaretlenmişse, bu işlem sonucu değiştirmeyecektir. gRPC'deki bazı metodlar idempotent olarak işaretlenebilir.
Soru: gRPC'deki "streaming" kavramı ne anlama gelir ve hangi türleri vardır?
Yanıt: gRPC'deki streaming, büyük veri setlerinin parçalar halinde aktarılabilmesini sağlar. Bu, gRPC'nin çok büyük veri setlerini işlemek için etkili bir şekilde ölçeklenebilmesini sağlar. gRPC'nin dört tür streaming'i destekler: tek yönlü (isteğe yanıt verme veya istemciye yanıt), sunucudan istemciye (sunucu birden çok yanıt gönderir), istemciden sunucuya (istemci birden çok istek gönderir) ve çift yönlü (hem istemci hem de sunucu birden çok mesaj gönderebilir).
Soru: gRPC servislerini nasıl tanımlarız ve nasıl kullanırız?
Yanıt: gRPC servisleri, .proto dosyaları kullanılarak tanımlanır. Bu dosyalar, servislerin ve istek/yanıt mesajlarının tanımlarını içerir. .proto dosyalarını kullanarak, gRPC otomatik olarak belirli bir dil için istemci ve sunucu kodu oluşturabilir. Bu kodu kullanarak, servislerle etkileşim kurabilir ve RPC çağrıları yapabiliriz.
Soru: gRPC'de "backoff" stratejisi nedir?
Yanıt: Bir backoff stratejisi, ağ hatalarının veya zaman aşımının ardından yeni bağlantı girişimlerinin sıklığını yönetir. Exponential backoff stratejisi gibi stratejiler, bir dizi başarısız bağlantı girişiminin ardından bağlantı girişimlerinin arasındaki süreyi sürekli olarak artırır. Bu, ağı gereksiz yere yüklemekten kaçınmak için kullanılır.
Soru: gRPC'de neden TLS/SSL kullanmalıyız?
Yanıt: TLS/SSL, gRPC trafiğini şifrelemek ve böylece istemci ve sunucu arasında iletilen verilerin gizliliğini ve bütünlüğünü korumak için kullanılır. Ayrıca, TLS/SSL, sunucunun kimliğini doğrulamak için de kullanılabilir, böylece istemcilerin kiminle iletişim kurduklarından emin olmalarını sağlar. Son olarak, gRPC'nin çift taraflı SSL/TLS desteği, istemcinin de kimliğini sunucuya doğrulamasına olanak sağlar. Bu, her iki tarafın da kiminle iletişim kurduklarını doğrulamalarını ve verilerin bütünlüğünü ve gizliliğini sağlamalarını sağlar.
Soru: gRPC'deki "circuit breaking" kavramı nedir ve neden önemlidir?
Yanıt: Circuit breaking, bir hizmetin istemcileri, aşırı yük veya hatalı durumların ağı tıkanmasına veya sistemlerin düzgün çalışmamasına yol açabileceği durumlarda koruma stratejisi sunar. Circuit breaker, başarısız olan bir hizmete yapılan çağrıları bir süre için durdurabilir ve bu süre zarfında hizmetin kendisini toparlamasını sağlar. Bu, özellikle dağıtılmış sistemlerde ve mikro hizmetlerde önemlidir.
Soru: gRPC'nin herhangi bir dezavantajı var mı?
Yanıt: gRPC'nin birkaç dezavantajı bulunmaktadır. İlk olarak, HTTP/1.1 ile tam uyumlu olmadığı için, bazı eski proxy ve firewall'larla uyumsuz olabilir. İkincisi, gRPC, Protobuf kullanırken daha az okunabilir olabilir ve bu da hata ayıklama sürecini zorlaştırabilir. Üçüncü olarak, gRPC genellikle JSON veya XML kullanılarak yapılan basit HTTP REST isteklerinden daha karmaşık bir kurulum ve kullanım gerektirir.
Soru: gRPC'nin sağladığı özelliklerden bazıları nelerdir?
Yanıt: gRPC'nin sunduğu özellikler arasında hızlı ve etkili Protobuf tabanlı iletişim, çok dilli destek, hızlı ve etkili HTTP/2 iletişim protokolü, çift yönlü ve tek yönlü streaming, idempotent ve non-idempotent işlemler, zaman aşımı ve deadline gibi özellikler, güçlü hata işleme ve durum kodları, geniş çapta kimlik doğrulama ve güvenlik seçenekleri bulunur.
Soru: gRPC ve GraphQL arasındaki farklar nelerdir?
Yanıt: gRPC ve GraphQL, servislerin iletişim kurmasına yardımcı olan iki farklı teknoloji olmasına rağmen, birkaç temel farkları vardır. gRPC, Protobuf kullanır ve genellikle daha hızlı ve daha verimli iletişim sağlar. Bu yüzden genellikle mikroservisler arasındaki iletişim için kullanılır. Öte yandan, GraphQL genellikle bir API Gateway olarak kullanılır ve istemcilerin spesifik veri ihtiyaçlarını karşılamak için veriye şekil verme yeteneği sağlar.
Soru: gRPC'nin "flow control" özelliği nedir?
Yanıt: Flow control, gRPC'nin HTTP/2 tabanlı bir özelliğidir. HTTP/2, veri akışını kontrol etmek ve böylece ağı tıkanmayı önlemek için bir mekanizma sağlar. Bu, hem istemci hem de sunucunun, bir seferde ne kadar veri gönderebileceğini veya alabileceğini kontrol etmesine olanak sağlar.
Soru: gRPC'nin yüksek performanslı olmasını sağlayan unsurlar nelerdir?
Yanıt: gRPC'nin yüksek performanslı olmasını sağlayan birkaç faktör vardır. Öncelikle, Protobuf iletişimi, veriyi sıkıştırmak ve ağı üzerinden hızlı bir şekilde taşımak için oldukça verimlidir. İkincisi, HTTP/2, aynı anda çoklu istekleri gönderme yeteneği sağlar, bu da ağ kaynaklarını daha etkili kullanılmasını sağlar. Üçüncüsü, gRPC, çeşitli özellikler ve optimizasyonlar sayesinde hem ağ trafiğini hem de CPU kullanımını optimize eder.
Soru: gRPC'nin sağladığı kimlik doğrulama seçenekleri nelerdir?
Yanıt: gRPC, çeşitli kimlik doğrulama seçenekleri sunar. Bu seçenekler arasında Google'ın belirteci tabanlı (token-based) OAuth2, SSL/TLS ve çift taraflı SSL/TLS bulunur. İstemci ve sunucu arasında güvenli bir bağlantı kurmak için bu yöntemler kullanılabilir. SSL/TLS, istemci ve sunucu arasındaki veri aktarımını şifreler ve çift taraflı SSL/TLS, hem istemcinin hem de sunucunun kimliklerini doğrular.
Soru: gRPC'de Load Balancing nasıl yapılır?
Yanıt: gRPC, çeşitli yük dengeleme stratejilerini destekler. Bu stratejiler, Round-robin, Least request, Random ve IP Hash gibi yaygın yük dengeleme algoritmalarını içerir. Load balancing, genellikle proxy veya yük dengeleyici gibi bir ağ öğesi tarafından gerçekleştirilir. gRPC, client-side ve server-side load balancing'i destekler.
Soru: gRPC üzerinde "health checking" nasıl yapılır?
Yanıt: Health checking, bir uygulamanın veya hizmetin düzgün çalışıp çalışmadığını kontrol etmek için kullanılır. gRPC'de, health checking genellikle bir "health checking" RPC servisi kullanılarak yapılır. Bu servis, istemcinin sunucunun durumunu düzenli aralıklarla sorgulamasına olanak sağlar. Eğer bir hizmet çalışmıyorsa, bu durumun belirlenmesi ve uygun tedbirlerin alınması sağlanır.
Soru: gRPC'deki "channel" kavramı nedir?
Yanıt: gRPC'deki bir "channel", istemci ve sunucu arasındaki iletişim kanalını temsil eder. Bir istemci, belirli bir sunucuya RPC çağrıları yapmak için bir channel oluşturur. Bu channel üzerinden, bir veya daha fazla RPC çağrısı gerçekleştirilebilir. Channel'lar genellikle uzun ömürlüdür ve birden çok RPC çağrısı için yeniden kullanılabilirler.
Soru: gRPC'deki "Metadata" nedir ve ne için kullanılır?
Yanıt: gRPC'deki metadata, bir RPC çağrısı ile ilgili ek bilgiler taşır. Metadata, genellikle HTTP/2 headerları ve trailerları aracılığıyla iletilir. Kimlik doğrulama bilgileri, lokalizasyon bilgisi, custom headers ve diğer benzeri bilgiler, metadata aracılığıyla iletilir. gRPC, hem standart HTTP/2 headerlarını hem de custom metadata'yı destekler.

Örnek Java ve Spring Boot gRPC uygulama kodu

Aşağıda, gRPC'yi kullanarak basit bir "Hello World" uygulaması oluşturmak için bir Java ve Spring Boot örneği bulabilirsiniz. Bu örnek, bir gRPC server (sunucu) ve client (istemci) oluşturur.

1. ProtoBuf tanımları (helloworld.proto)


syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}
    

2. gRPC sunucusu (GreeterService.java)


package com.example.grpc;

import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;

@GrpcService
public class GreeterService extends GreeterGrpc.GreeterImplBase {

    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
        HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
    }
}
    

3. Spring Boot uygulaması (Application.java)


package com.example.grpc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
    

4. gRPC istemcisi (GrpcClient.java) (devam)


import io.grpc.ManagedChannelBuilder;

public class GrpcClient {
    public static void main(String[] args) throws InterruptedException {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9090)
                .usePlaintext()
                .build();

        GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);

        HelloReply helloReply = stub.sayHello(HelloRequest.newBuilder()
                .setName("John")
                .build());

        System.out.println("Response received from server:\n" + helloReply);

        channel.shutdown();
    }
}
    

Bu örnekteki gRPC server ve client'ınız localhost üzerinde 9090 portunda çalışacaktır. Client "John" isimli bir HelloRequest gönderir ve server bu isteğe "Hello John" mesajını içeren bir HelloReply döndürür.

Bu örnek bir mikro servis mimarisi içinde yer alabilir ve gerçek hayatta birçok farklı servisi ve çok daha karmaşık Protobuf mesajlarını içerebilir.

Not: Bu örnekte "net.devh:grpc-spring-boot-starter" adlı bir kütüphanenin kullanılması gerekmektedir.

Sonuç

gRPC, modern uygulamaların ihtiyaçlarını karşılamak için tasarlanmış güçlü bir RPC (Remote Procedure Call) çerçevesidir. Yüksek performansı, çoklu dil desteği ve streaming özellikleri ile özellikle mikroservis mimarilerinde popüler bir seçenektir. Bu rehberde gördüğümüz gibi, gRPC birçok avantaj sunar, ancak her teknoloji gibi kendi zorlukları ve dezavantajları da vardır.

gRPC'yi etkin bir şekilde kullanabilmek için, Protocol Buffers, HTTP/2, ve ilgili kavramlar hakkında iyi bir anlayışa sahip olmak önemlidir. Ayrıca, gRPC'nin sunduğu özellikleri - streaming, interceptor'lar, load balancing, health checking gibi - anlamak ve uygulamak, gRPC tabanlı sistemlerin tam potansiyelini ortaya çıkarmak için kritiktir.

Bu rehberde sunulan bilgiler ve örnek uygulama, gRPC'ye başlamak ve temel kavramları anlamak için bir başlangıç noktası sağlar. Gerçek dünya uygulamalarında, bu kavramları daha karmaşık senaryolara uygulamak ve gRPC'nin sunduğu diğer özellikleri keşfetmek gerekecektir.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال