1. Übersicht
gRPC ist ein sprach- und plattformneutrales Framework und Toolset für Remoteprozeduraufrufe (Remote Procedure Call, RPC), das bei Google entwickelt wurde. Damit können Sie einen Dienst mit Protocol Buffers definieren, einem besonders leistungsstarken binären Serialisierungstoolset und einer besonders leistungsstarken Sprache. Anschließend können Sie aus Ihrer Dienstdefinition idiomatische Client- und Server-Stubs in verschiedenen Sprachen generieren.
In diesem Codelab erfahren Sie, wie Sie einen C#-Dienst erstellen, der eine API über das gRPC-Framework bereitstellt. Sie interagieren mit diesem Dienst über einen Konsolenclient, der in C# geschrieben wurde und dieselbe Dienstbeschreibung wie der Dienst verwendet.
Lerninhalte
- Die Sprache des Protokollzwischenspeichers.
- So implementieren Sie einen gRPC-Dienst mit C#.
- So implementieren Sie einen gRPC-Client mit C#.
- So aktualisieren Sie einen gRPC-Dienst.
Voraussetzungen
- Ein Browser, z. B. Chrome oder Firefox.
- Visual Studio 2013 oder höher ist installiert.
- Sie sind mit dem .NET Framework und der Sprache C# vertraut.
Wie werden Sie diese Anleitung verwenden?
Wie würden Sie Ihre Erfahrung mit der Google Cloud Platform bewerten?
2. gRPC C#-Beispiele herunterladen und erstellen
Beispiele herunterladen
Laden Sie das gRPC C#-Beispielrepository als ZIP-Datei herunter und entpacken Sie es.
Alternativ können Sie auch das Git-Repository klonen.
git clone https://github.com/meteatamel/grpc-samples-dotnet.git
In jedem Fall sollten Sie einen grpc-samples-dotnet-Ordner mit folgendem Inhalt haben:

Lösung entwickeln
Der Ordner der Beispielanwendung enthält GrpcSamples.sln, eine Visual Studio-Lösung. Doppelklicken Sie, um die Lösung in Visual Studio zu öffnen. Sie sollten eine Lösung mit einer Reihe von Projekten sehen.

Wir werden uns die Projekte im nächsten Abschnitt genauer ansehen, aber zuerst erstellen wir das Projekt. Rufen Sie Build > Build Solution oder Ctrl + Shift + B auf, um die Lösung zu erstellen. Dadurch werden alle Abhängigkeiten von NuGet heruntergeladen und die Anwendung wird kompiliert.
Am Ende sollte in der Visual Studio-Konsolenausgabe die Meldung Build succeeded angezeigt werden.
3. Beispiel „Greeter“ ansehen
„Greeter“ ist ein einfaches gRPC-Beispiel, bei dem ein Client eine Anfrage mit einem Namen sendet und der Server mit einer Nachricht antwortet, gefolgt vom Namen. Es gibt ein Greeter-Projekt, das die gemeinsame Dienstdefinition (Proto-Datei) enthält, auf der Client und Server basieren.
Greeter Project
Dies ist das gemeinsame Projekt, das vom Client und vom Server genutzt wird. Sie enthält eine greeter.proto, die die gRPC-Dienstdefinition ist, die von Client und Server verwendet wird. Die Dienstdefinition definiert einen gRPC-Dienst namens GreetingService mit der Methode greeting, die HelloRequest als Eingabe und HelloResponse als Ausgabe verwendet.
service GreetingService {
rpc greeting(HelloRequest) returns (HelloResponse);
}
Dies ist eine unäre Methode (d.h. kein Streaming), bei der der Client eine einzelne Anfrage sendet und eine einzelne Antwort vom Server erhält. Sie können sich den restlichen Inhalt von greeter.proto. ansehen. Dieses Projekt enthält auch ein Skript namens generate_protos.bat, mit dem Client- und Server-Stubs aus der Protobuf-Datei generiert werden können. Das Projekt enthält bereits generierte Client- und Server-Stubs, sodass Sie sie nicht selbst generieren müssen. Wenn Sie jedoch etwas an der Dienstdefinitionsdatei ändern, müssen Sie dieses Skript ausführen, um die Stubs neu zu generieren.
Greeter-Server
Dies ist das Projekt für den gRPC-Server. Program.cs ist der Haupteinstiegspunkt, an dem der Port und die Serverimplementierung eingerichtet werden. Die wichtige Klasse ist GreeterServiceImpl.cs. Sie hat eine greeting-Methode, in der die eigentliche Funktionalität implementiert ist.
public override Task<HelloResponse> greeting(HelloRequest request,
ServerCallContext context)
{
return Task.FromResult(new HelloResponse {
Greeting = "Hello " + request.Name });
}
Greeter-Client
Dies ist die Clientseite des gRPC-Dienstes. Sie hat auch Program.cs als Einstiegspunkt. Es wird ein Kanal für die Kommunikation mit dem Server erstellt und dann ein Client mit dem Kanal aus dem generierten Stub. Anschließend wird eine Anfrage erstellt und mithilfe des Client-Stubs an den Server gesendet.
4. Greeter-Beispiel ausführen
Starten Sie zuerst den Greeter-Server. Öffnen Sie eine Eingabeaufforderung, rufen Sie den Ordner bin > Debug des Greeter-Servers auf und führen Sie die ausführbare Datei aus. Der Server sollte jetzt auf Anfragen warten.
> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...
Führen Sie als Nächstes den Greeter-Client aus. Rufen Sie in einer separaten Eingabeaufforderung den Ordner bin > Debug des Greeter-Servers auf und führen Sie die ausführbare Datei aus. Sie sollten sehen, dass der Client die Anfrage sendet und eine Antwort vom Server empfängt.
> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
Press any key to exit...
5. Greeter-Beispiel aktualisieren
Sehen wir uns an, wie das Aktualisieren unseres Dienstes aussieht. Füge unserem gRPC-Dienst eine neue Methode namens „goodbye“ hinzu, die anstelle von „hello“ „goodbye“ an den Client zurückgibt.
Im ersten Schritt müssen Sie die Dienstdefinitionsdatei greeter.proto. aktualisieren.
service GreetingService {
rpc greeting(HelloRequest) returns (HelloResponse);
rpc goodbye(HelloRequest) returns (HelloResponse);
}
Als Nächstes müssen Sie die Client- und Server-Stubs neu generieren. Führen Sie über eine Eingabeaufforderung generate_protos.bat aus. Nachdem die Stubs generiert wurden, müssen Sie Ihre Visual Studio-Projekte möglicherweise aktualisieren, um den aktualisierten Code zu erhalten.
Aktualisieren Sie schließlich den Client- und Servercode, um die neue Methode zu nutzen. Aktualisieren Sie GreeterServiceImpl.cs im Dienst und fügen Sie eine neue goodbye-Methode hinzu.
public override Task<HelloResponse> goodbye(HelloRequest request,
ServerCallContext context)
{
return Task.FromResult(new HelloResponse {
Greeting = "Goodbye " + request.Name });
}
Rufen Sie im Client die Methode goodbye in Program.cs. auf.
response = client.goodbye(request);
Console.WriteLine("GreeterClient received response: "
+ response.Greeting);
Erstellen Sie das Projekt neu und führen Sie den Server und den Client noch einmal aus. Der Kunde sollte jetzt eine Abschiedsnachricht erhalten.
> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
GreeterClient received response: Goodbye Mete - on C#
Press any key to exit...
6. Chat-Beispiel ansehen
Die Lösung enthält außerdem ein ChatServer- und ein ChatWindowsClient-Projekt. Wie der Name schon sagt, handelt es sich um ein Client- und Serverpaar für eine einfache Chatanwendung. Das Projekt Chat enthält die Dienstdefinitionsdatei chat.proto. Sie definiert eine ChatService mit einer chat-Methode.
service ChatService {
rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}
Wichtig ist, dass sowohl eingehende als auch ausgehende Chatnachrichten mit dem Keyword stream markiert werden. Dadurch wird die Verbindung im Grunde in einen bidirektionalen Stream umgewandelt, in dem Client und Server jederzeit Nachrichten aneinander senden können. Das ist die perfekte Lösung für eine Chatanwendung.
Sie können das Beispiel weiter untersuchen, es erstellen und ausführen, um zu sehen, wie es funktioniert.
7. Glückwunsch!
Behandelte Themen
- Die Protocol Buffer-Sprache.
- So implementieren Sie einen gRPC-Dienst mit C#.
- So implementieren Sie einen gRPC-Client mit C#.
- So aktualisieren Sie einen gRPC-Dienst.