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, enumEnums 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/SayHelloPraxisbeispiel: 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
- Grundlagen von gRPC und Protobuf
- Unäre und serverseitige Streaming-RPCs
- Client- und bidirektionales Streaming
- Deadlines, Abbruch und Interceptors