0Pricing
C# Academy · Ders

gRPC ve Protobuf Temelleri

.proto dosyalarında hizmet sözleşmeleri tanımlayın, Grpc.Tools ile C# kodu oluşturun ve gRPC aktarımını anlayın.

gRPC ve Protobuf Temelleri, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

gRPC Nedir?

gRPC, Google tarafından geliştirilen yüksek performanslı ve dilden bağımsız bir RPC çatısıdır. Taşıma için HTTP/2, serileştirme biçimi olarak da Protocol Buffers (Protobuf) kullanır — HTTP/1.1 üzerinden JSON'a kıyasla çok daha hızlı ve daha az yer kaplar.

Protocol Buffers: IDL

Hizmet sözleşmenizi bir .proto dosyasında tanımlarsınız. Protobuf IDL'si (Arayüz Tanımlama Dili) güçlü türlendirilmiş ve dilden bağımsızdır — aynı dosya C#, Go, Python vb. dillerde istemci ve sunucu kodu oluşturur.

// greet.proto
syntax = "proto3";

option csharp_namespace = "GrpcService";

package greet;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

.NET'te gRPC Sunucusu Kurma

dotnet new grpc ile bir gRPC projesi oluşturun. Projeye .proto dosyaları ekleyin; Grpc.Tools, derleme zamanında C# sınıflarını otomatik olarak oluşturur.

// .csproj snippet
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

// Program.cs
builder.Services.AddGrpc();

var app = builder.Build();
app.MapGrpcService<GreeterService>();
app.Run();

gRPC Hizmeti Uygulama

Oluşturulan temel sınıftan kalıtım alın ve RPC metodunu geçersiz kılın. Çatı, serileştirmeyi, HTTP/2 çerçevelemesini ve yönlendirmeyi otomatik olarak yönetir.

using Grpc.Core;
using GrpcService;

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;
    public GreeterService(ILogger<GreeterService> logger) => _logger = logger;

    public override Task<HelloReply> SayHello(
        HelloRequest request,
        ServerCallContext context)
    {
        _logger.LogInformation("Saying hello to {Name}", request.Name);
        return Task.FromResult(new HelloReply
        {
            Message = $"Hello, {request.Name}!"
        });
    }
}

gRPC İstemcisi Oluşturma

Protobuf derleyicisi ayrıca güçlü türlendirilmiş bir istemci sınıfı oluşturur. Bağlanmak ve hizmeti yerel bir metotmuş gibi çağırmak için GrpcChannel kullanın.

// Client project: add Grpc.Net.Client package
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);

var reply = await client.SayHelloAsync(
    new HelloRequest { Name = "Alice" });

Console.WriteLine(reply.Message); // Hello, Alice!

Protobuf Türleri ve Alan Numaraları

Bir Protobuf iletisindeki her alanın benzersiz bir alan numarası vardır (1–536870911). Alan numaraları ikili biçimde kodlanır — dağıtımdan sonra bunları asla değiştirmeyin; aksi takdirde geriye dönük uyumluluğu bozarsınız.

message Product {
  int32  id          = 1;
  string name        = 2;
  double price       = 3;
  int32  stock       = 4;
  bool   is_active   = 5;
  repeated string tags = 6; // array
}

// Supported scalar types:
// int32, int64, uint32, uint64, float, double
// bool, string, bytes, enum

Numaralandırmalar ve İç İçe İletiler

Protobuf, numaralandırmaları ve iç içe ileti türlerini destekler. Hizmet sözleşmenizdeki karmaşık etki alanı nesnelerini modellemek için bunları kullanın.

enum OrderStatus {
  ORDER_STATUS_UNSPECIFIED = 0;
  ORDER_STATUS_PENDING     = 1;
  ORDER_STATUS_SHIPPED     = 2;
  ORDER_STATUS_CANCELLED   = 3;
}

message Order {
  int32       id       = 1;
  OrderStatus status   = 2;
  repeated OrderLine lines = 3;
}

message OrderLine {
  int32  product_id = 1;
  int32  quantity   = 2;
  double price      = 3;
}

HTTP/2 ve gRPC Taşıması

gRPC, çoklamayı destekleyen HTTP/2'yi kullanır — tek bir TCP bağlantısı üzerinden birden çok eşzamanlı RPC çağrısı yapılabilir. Bu, HTTP/1.1'e kıyasla gecikmeyi ve bağlantı yükünü azaltır.

// gRPC requires HTTP/2
// For local dev with HTTP (not HTTPS), enable HTTP/2 cleartext:
builder.WebHost.ConfigureKestrel(opt =>
    opt.ListenLocalhost(5000, o => o.Protocols = HttpProtocols.Http2));

// Client for cleartext (dev only)
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
using var channel = GrpcChannel.ForAddress("http://localhost:5000");

StatusCode ile Hata İşleme

gRPC, HTTP'dekilerden farklı kendi durum kodlarını kullanır. İstemcilere türlendirilmiş hata yanıtları göndermek için bir Status ile RpcException fırlatın.

public override Task<ProductReply> GetProduct(
    ProductRequest request,
    ServerCallContext context)
{
    var product = _repo.FindById(request.Id);
    if (product is null)
        throw new RpcException(
            new Status(StatusCode.NotFound, $"Product {request.Id} not found"));

    return Task.FromResult(MapToReply(product));
}

Geliştirme için gRPC Yansıtması

grpcurl ve Postman gibi araçların .proto dosyasına doğrudan erişmeden hizmetlerinizi keşfedebilmesi için gRPC yansıtmasını etkinleştirin.

// dotnet add package Grpc.AspNetCore.Server.Reflection

builder.Services.AddGrpcReflection();

if (app.Environment.IsDevelopment())
    app.MapGrpcReflectionService();

// Now use grpcurl:
// grpcurl -plaintext localhost:5000 list
// grpcurl -plaintext localhost:5000 greet.Greeter/SayHello

Gerçek Dünya: Mikro Hizmetle Ürün Arama

Bir sipariş hizmeti tarafından dahili olarak kullanılan bir gRPC uç noktası sunan ürün hizmeti — hizmetler arası iletişim için klasik bir örüntü.

// product.proto
service ProductService {
  rpc GetProduct (GetProductRequest) returns (ProductResponse);
  rpc ListProducts (ListProductsRequest) returns (ListProductsResponse);
}

// Order service calls it:
public class OrderService
{
    private readonly ProductService.ProductServiceClient _products;
    public OrderService(ProductService.ProductServiceClient p) => _products = p;

    public async Task<Order> PlaceOrderAsync(int productId, int qty)
    {
        var product = await _products.GetProductAsync(
            new GetProductRequest { Id = productId });
        return new Order { ProductName = product.Name, Quantity = qty };
    }
}

Hızlı Kontrol

Dağıtımdan sonra mevcut bir Protobuf alan numarasını neden asla değiştirmemelisiniz?

Özet: gRPC ve Protobuf Temelleri

Önemli çıkarımlar:

  • gRPC, hızlı ve güçlü türlendirilmiş hizmetler arası iletişim için HTTP/2 + Protobuf kullanır
  • Hizmet sözleşmelerini .proto dosyalarında tanımlayın — kod derleme zamanında oluşturulur
  • Alan numaraları kablo üzerindeki kodlamadır — bunları asla değiştirmeyin veya yeniden kullanmayın
  • Oluşturulan temel sınıftan kalıtım alın ve RPC metotlarını geçersiz kılın
  • Türlendirilmiş hata yanıtları için StatusCode ile RpcException kullanın
  • Geliştirme sırasında araç desteği için gRPC yansıtmasını etkinleştirin

Sıkça Sorulan Sorular

“gRPC ve Protobuf Temelleri” dersi ücretsiz mi?

Evet — “gRPC ve Protobuf Temelleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“gRPC ve Protobuf Temelleri” dersinde ne öğreneceğim?

.proto dosyalarında hizmet sözleşmeleri tanımlayın, Grpc.Tools ile C# kodu oluşturun ve gRPC aktarımını anlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“gRPC ve Protobuf Temelleri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. gRPC ve Protobuf Temelleri
  2. Tekli ve Sunucu Akışlı RPC'ler
  3. İstemci ve Çift Yönlü Akış
  4. Son Tarihler, İptal ve Araya Giriciler
← C# Academy Sayfasına Dön