0Pricing
C# Academy · Lektion

Grundlagen von gRPC und Protobuf

Definieren Sie Serviceverträge in .proto-Dateien, generieren Sie C#-Code mit Grpc.Tools und verstehen Sie den gRPC-Transport.

Grundlagen von gRPC und Protobuf ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist gRPC?

gRPC ist ein von Google entwickeltes, leistungsstarkes und sprachunabhängiges RPC-Framework. Es verwendet HTTP/2 für den Transport und Protocol Buffers (Protobuf) als Serialisierungsformat – deutlich schneller und kompakter als JSON über HTTP/1.1.

Protocol Buffers: Die IDL

Sie definieren Ihren Dienstvertrag in einer .proto-Datei. Die Protobuf-IDL (Interface Definition Language) ist stark typisiert und sprachneutral – aus derselben Datei wird Client-/Servercode für C#, Go, Python usw. generiert.

// 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;
}

Einen gRPC-Server in .NET einrichten

Erstellen Sie ein gRPC-Projekt mit dotnet new grpc. Fügen Sie dem Projekt .proto-Dateien hinzu, und Grpc.Tools generiert die C#-Klassen automatisch zur Buildzeit.

// .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();

Einen gRPC-Dienst implementieren

Leiten Sie Ihre Klasse von der generierten Basisklasse ab und überschreiben Sie die RPC-Methode. Das Framework übernimmt Serialisierung, HTTP/2-Framing und Routing automatisch.

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}!"
        });
    }
}

Einen gRPC-Client erstellen

Der Protobuf-Compiler generiert außerdem eine stark typisierte Clientklasse. Verwenden Sie GrpcChannel, um eine Verbindung herzustellen und den Dienst aufzurufen, als wäre er eine lokale Methode.

// 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-Typen und Feldnummern

Jedes Feld in einer Protobuf-Nachricht verfügt über eine eindeutige Feldnummer (1–536870911). Feldnummern werden im Binärformat codiert – ändern Sie sie nach der Bereitstellung niemals, da Sie sonst die Abwärtskompatibilität brechen.

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

Enums und verschachtelte Nachrichten

Protobuf unterstützt Enums und verschachtelte Nachrichtentypen. Verwenden Sie sie, um komplexe Domänenobjekte in Ihrem Dienstvertrag abzubilden.

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 und gRPC-Transport

gRPC verwendet HTTP/2, das Multiplexing unterstützt – mehrere gleichzeitige RPC-Aufrufe über eine einzige TCP-Verbindung. Dadurch werden Latenz und Verbindungsaufwand im Vergleich zu HTTP/1.1 reduziert.

// 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");

Fehlerbehandlung mit StatusCode

gRPC verwendet eigene Statuscodes, die sich von HTTP-Statuscodes unterscheiden. Lösen Sie eine RpcException mit einem Status aus, um typisierte Fehlerantworten an Clients zu senden.

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));
}

gRPC-Reflection für die Entwicklung

Aktivieren Sie gRPC-Reflection, damit Tools wie grpcurl und Postman Ihre Dienste erkennen können, ohne direkt auf die .proto-Datei zugreifen zu müssen.

// 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

Praxisbeispiel: Produktsuche per Microservice

Ein Produktdienst, der einen intern von einem Bestelldienst verwendeten gRPC-Endpunkt bereitstellt – ein klassisches Muster für die Kommunikation zwischen Diensten.

// 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 };
    }
}

Kurzer Check

Warum sollten Sie eine vorhandene Protobuf-Feldnummer nach der Bereitstellung niemals ändern?

Zusammenfassung: Grundlagen von gRPC und Protobuf

Wichtige Erkenntnisse:

  • gRPC verwendet HTTP/2 + Protobuf für eine schnelle, stark typisierte Kommunikation zwischen Diensten
  • Definieren Sie Dienstverträge in .proto-Dateien – der Code wird zur Buildzeit generiert
  • Feldnummern bestimmen die Codierung auf der Leitung – ändern oder verwenden Sie sie niemals erneut
  • Leiten Sie Ihre Klasse von der generierten Basisklasse ab und überschreiben Sie RPC-Methoden
  • Verwenden Sie RpcException mit StatusCode für typisierte Fehlerantworten
  • Aktivieren Sie gRPC-Reflection zur Unterstützung von Tools während der Entwicklung

Häufig gestellte Fragen

Ist die Lektion „Grundlagen von gRPC und Protobuf“ kostenlos?

Ja — der vollständige Text von „Grundlagen von gRPC und Protobuf“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Grundlagen von gRPC und Protobuf“?

Definieren Sie Serviceverträge in .proto-Dateien, generieren Sie C#-Code mit Grpc.Tools und verstehen Sie den gRPC-Transport. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Grundlagen von gRPC und Protobuf“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Grundlagen von gRPC und Protobuf
  2. Unäre und serverseitige Streaming-RPCs
  3. Client- und bidirektionales Streaming
  4. Deadlines, Abbruch und Interceptors
← Zurück zu C# Academy