C# での gRPC サービスの構築

1. 概要

gRPC は、Google で開発された、言語やプラットフォームに依存しないリモート プロシージャ コール(RPC)フレームワークおよびツールセットです。これにより、プロトコル バッファ(特に強力なバイナリ シリアル化ツールセットおよび言語)を使用してサービスを定義できます。それにより、さまざまな言語で、サービス定義から慣用的なクライアント スタブとサーバースタブを生成できます。

この Codelab では、gRPC フレームワークを使用して API を公開する C# サービスを構築する方法を学びます。このサービスとのやり取りには、C# で記述されたコンソール クライアントを使用します。このクライアントでは、サービスと同じサービス記述を使用します。

学習内容

  • プロトコル バッファ言語。
  • C# を使用して gRPC サービスを実装する方法。
  • C# を使用して gRPC クライアントを実装する方法。
  • gRPC サービスを更新する方法。

必要なもの

このチュートリアルの利用方法をお選びください。

通読するのみ 内容を読んで演習を完了する

Google Cloud Platform のご利用経験について、いずれに該当されますか?

<ph type="x-smartling-placeholder"></ph> 初心者 中級 上達 をご覧ください。

2. gRPC C# のサンプルをダウンロードしてビルドする

サンプルをダウンロード

zip ファイルとして gRPC C# のサンプル リポジトリをダウンロードし、展開します。

または、その Git リポジトリのクローンを作成することもできます。

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

どちらの場合も、次の内容の grpc-samples-dotnet フォルダが必要です。

d056832ff4ce0c8f.png

ソリューションを構築する

サンプル アプリケーション フォルダには、Visual Studio ソリューションの GrpcSamples.sln が含まれています。ダブルクリックして Visual Studio でソリューションを開きます。複数のプロジェクトを含むソリューションが表示されます。

61da9ddc86c08019.png

プロジェクトについては次のセクションで詳しく説明しますが、まずはプロジェクトをビルドするだけです。Build > Build Solution または Ctrl + Shift + B に移動して、ソリューションを構築します。これにより、NuGet からすべての依存関係がダウンロードされ、アプリがコンパイルされます。

最後に、Visual Studio コンソールの出力に Build succeeded メッセージが表示されます。

3. Greeter サンプルを確認する

Greeter はシンプルな gRPC サンプルです。クライアントが名前を指定してリクエストを送信し、サーバーがメッセージの後に名前を付けたレスポンスを返します。Greeter プロジェクトには、クライアントとサーバーのベースとなる共通サービス定義(proto ファイル)が含まれています。

Greeter Project

これは、クライアントとサーバー間で共有される共通のプロジェクトです。これには、クライアントとサーバーが使用する gRPC サービス定義である greeter.proto があります。サービス定義では、GreetingService という gRPC サービスを定義し、HelloRequest を入力として受け取り、HelloResponse を出力として受け取る greeting メソッドがあります。

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
}

これは、クライアントが 1 つのリクエストを送信してサーバーから 1 つのレスポンスを取得する単項(つまりストリーミングなし)メソッドです。greeter.proto. の残りの内容も調べられます。このプロジェクトには、proto ファイルからクライアント スタブとサーバーのスタブを生成するために使用できる generate_protos.bat というスクリプトもあります。プロジェクトにはすでに生成されたクライアント スタブとサーバーのスタブが含まれているため、自身で生成する必要はありません。ただし、サービス定義ファイルの内容を変更した場合は、このスクリプトを実行してスタブを再生成する必要があります。

Greeter Server

これは gRPC サーバーのプロジェクトです。Program.cs は、ポートとサーバーの実装が設定されたメインのエントリ ポイントです。重要なクラスは GreeterServiceImpl.cs です。実際の機能を実装する greeting メソッドがあります。

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

Greeter クライアント

これは gRPC サービスのクライアント側です。また、エントリポイントとして Program.cs もあります。サーバーと通信するためのチャネルを作成し、生成されたスタブのチャネルを使用してクライアントを作成します。次に、リクエストを作成し、client スタブを使用してサーバーに送信します。

4. Greeter サンプルを実行する

まず、Greeter サーバーを起動します。コマンド プロンプトを開き、Greeter Server の bin > Debug フォルダに移動して、実行可能ファイルを実行します。サーバーがリッスンしていることがわかります。

> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...

次に、Greeter Client を実行します。別のコマンド プロンプトで、Greeter Server の bin > Debug フォルダに移動して、実行可能ファイルを実行します。クライアントがリクエストを送信し、サーバーからレスポンスを受信していることがわかります。

> 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 サンプルを更新する

では、サービスを更新する方法を見ていきましょう。gRPC サービスに「bye」という新しいメソッドを追加します。このメソッドは、クライアントに「hello」ではなく「Goodbye」を返します。

まず、サービス定義ファイル greeter.proto. を更新します。

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
    
    rpc goodbye(HelloRequest) returns (HelloResponse);
}

次に、クライアント スタブとサーバースタブを再生成する必要があります。コマンド プロンプトで generate_protos.bat を実行します。スタブが生成されたら、更新されたコードを取得するために Visual Studio プロジェクトを更新する必要があります。

最後に、クライアントとサーバーのコードを更新して、新しいメソッドを活用します。サービスで GreeterServiceImpl.cs を更新し、新しい goodbye メソッドを追加します。

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

クライアントで、Program.cs.goodbye メソッドを呼び出します。

response = client.goodbye(request);
Console.WriteLine("GreeterClient received response: " 
                       + response.Greeting);

プロジェクトを再ビルドし、サーバーとクライアントを再度実行します。クライアントに終了メッセージが表示されます。

> 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 サンプルを見る

ソリューションには、ChatServer プロジェクトと ChatWindowsClient プロジェクトもあります。名前が示すように、単純なチャット アプリケーション用のクライアントとサーバーのペアです。Chat プロジェクトには、chat.proto というサービス定義ファイルがあります。chat メソッドで ChatService を定義しています。

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

ここで重要なのは、チャットの受信メッセージと送信メッセージの両方に stream キーワードが付いていることです。これにより基本的に、接続が双方向ストリームになり、クライアントとサーバーはいつでも互いにメッセージを送信できます。チャット アプリケーションに最適なソリューションです。

サンプルを詳しく調べてビルドし、演習としてどのように機能するかを確認できます。

7. 完了

学習した内容

  • プロトコル バッファ言語。
  • C# を使用して gRPC サービスを実装する方法。
  • C# を使用して gRPC クライアントを実装する方法。
  • gRPC サービスを更新する方法。

次のステップ