gRPC-Dienst mit C# erstellen

1. Übersicht

gRPC ist ein sprach- und plattformneutrales RPC-Framework und -Toolset, das bei Google entwickelt wurde. Sie können damit einen Dienst mithilfe von Protocol Buffers definieren, einem besonders leistungsstarken Toolset und einer Sprache für die binäre Serialisierung. Anschließend können Sie idiomatische Client- und Server-Stubs aus Ihrer Dienstdefinition in verschiedenen Sprachen generieren.

In diesem Codelab erfahren Sie, wie Sie einen C#-Dienst erstellen, der eine API mithilfe des gRPC-Frameworks verfügbar macht. Sie interagieren mit diesem Dienst über einen in C# geschriebenen Console-Client, der dieselbe Dienstbeschreibung wie der Dienst verwendet.

Aufgaben in diesem Lab

  • Die Sprache des Protokollzwischenspeichers.
  • So implementieren Sie einen gRPC-Dienst mit C#.
  • gRPC-Client mit C# implementieren.
  • So aktualisieren Sie einen gRPC-Dienst.

Voraussetzungen

Wie möchten Sie diese Anleitung nutzen?

<ph type="x-smartling-placeholder"></ph> Nur bis zum Ende lesen Lies sie dir durch und absolviere die Übungen

Wie würden Sie Ihre Erfahrung mit der Google Cloud Platform bewerten?

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

2. gRPC-C#-Beispiele herunterladen und erstellen

Beispiele herunterladen

Laden Sie das gRPC-C#-Beispiel-Repository als ZIP-Datei herunter und extrahieren Sie es.

Alternativ können Sie das Git-Repository klonen.

git clone https://github.com/meteatamel/grpc-samples-dotnet.git

In beiden Fällen sollten Sie einen grpc-samples-dotnet-Ordner mit folgendem Inhalt haben:

d056832ff4ce0c8f.png

Lösung erstellen

Der Beispielanwendungsordner enthält GrpcSamples.sln, eine Visual Studio-Lösung. Doppelklicken Sie, um die Projektmappe in Visual Studio zu öffnen. Sie sollten eine Lösung mit mehreren Projekten sehen.

61da9ddc86c08019.png

Im nächsten Abschnitt gehen wir genauer auf die Projekte ein. Zuerst erstellen wir jedoch 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 kompiliert.

Am Ende sollte in der Visual Studio-Konsolenausgabe die Meldung Build succeeded angezeigt werden.

3. Greeter-Beispiel ansehen

Greeter ist ein einfaches gRPC-Beispiel, bei dem ein Client eine Anfrage mit einem Namen sendet und der Server mit einer Nachricht, gefolgt vom Namen, antwortet. Es gibt ein Greeter-Projekt, das die allgemeine Dienstdefinition (.proto-Datei) enthält, auf der der Client und der Server basieren.

Greeter-Projekt

Dies ist das gemeinsame Projekt, das vom Client und dem Server gemeinsam genutzt wird. Sie hat eine greeter.proto, also die gRPC-Dienstdefinition, die vom Client und Server verwendet wird. Die Dienstdefinition definiert einen gRPC-Dienst mit dem Namen GreetingService. Er enthält eine greeting-Methode, die HelloRequest als Eingabe und HelloResponse als Ausgabe annimmt.

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 Antwort vom Server erhält. Sie können sich den Rest von greeter.proto. ansehen. Dieses Projekt enthält auch ein Skript namens generate_protos.bat, mit dem Client- und Server-Stubs aus der Proto-Datei generiert werden können. Das Projekt enthält bereits generierte Client- und Server-Stubs, sodass Sie diese nicht selbst generieren müssen. Falls Sie jedoch Änderungen an der Dienstdefinitionsdatei vornehmen, 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 die Port- und Serverimplementierung eingerichtet wird. Die wichtige Klasse ist GreeterServiceImpl.cs. Sie verfügt über eine greeting-Methode, bei der die eigentliche Funktion implementiert wird.

public override Task<HelloResponse> greeting(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Hello " + request.Name });
}

Kunde grüßen

Dies ist die Clientseite des gRPC-Dienstes. Program.cs ist der Einstiegspunkt. Sie erstellt einen Kanal für die Kommunikation mit dem Server und erstellt dann einen 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 die Eingabeaufforderung, gehen Sie zum Ordner bin > Debug von Greeter Server und führen Sie die ausführbare Datei aus. Der Server sollte nun angezeigt werden.

> 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. Gehen Sie in einer separaten Eingabeaufforderung zum Ordner bin > Debug von Greeter Server und führen Sie die ausführbare Datei aus. Sie sollten sehen, wie der Client die Anfrage sendet und eine Antwort vom Server erhält.

> 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 die Aktualisierung unseres Dienstes aussieht. Fügen Sie unserem gRPC-Dienst namens "goodbye" eine neue Methode hinzu, die dem Client "Goodbye" statt "hello" zurückgibt.

Der erste Schritt besteht darin, die Dienstdefinitionsdatei greeter.proto. zu 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 in der Eingabeaufforderung generate_protos.bat aus. Nachdem die Stubs generiert wurden, müssen Sie möglicherweise Ihre Visual Studio-Projekte aktualisieren, um den aktualisierten Code zu erhalten.

Aktualisieren Sie schließlich den Client- und Servercode, um die neue Methode nutzen zu können. Aktualisieren Sie im Dienst GreeterServiceImpl.cs 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 Client 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 auch ein ChatServer- und ein ChatWindowsClient-Projekt. Wie der Name schon sagt, handelt es sich hierbei um ein Client-Server-Paar für eine einfache Chatanwendung. Chat-Projekt enthält die Dienstdefinitionsdatei chat.proto. Sie definiert ein ChatService mit einer chat-Methode.

service ChatService {
 rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}

Wichtig dabei ist, dass sowohl eingehende als auch ausgehende Chatnachrichten mit dem Schlüsselwort stream gekennzeichnet sind. Dies wandelt die Verbindung im Grunde in einen bidirektionalen Stream um, bei dem Client und Server sich jederzeit gegenseitig Nachrichten senden können. die perfekte Lösung für eine Chat-Anwendung.

Sie können das Beispiel weiter untersuchen, erstellen und ausführen, um zu sehen, wie es als Übung funktioniert.

7. Glückwunsch!

Behandelte Themen

  • Die Protokollzwischenspeichersprache.
  • So implementieren Sie einen gRPC-Dienst mit C#.
  • gRPC-Client mit C# implementieren.
  • So aktualisieren Sie einen gRPC-Dienst.

Nächste Schritte