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

1. 概要

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

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

学習内容

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

必要なもの

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

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

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

初心者 中級者 上級者

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 サンプルです。クライアントとサーバーのベースとなる共通のサービス定義(proto ファイル)を含む Greeter プロジェクトがあります。

Greeter Project

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

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

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

Greeter サーバー

これは 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 をエントリ ポイントとしています。サーバーと通信するためのチャネルを作成し、生成されたスタブからチャネルを使用してクライアントを作成します。次に、リクエストを作成し、クライアント スタブを使用してサーバーに送信します。

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

まず、Greeter Server を起動します。コマンド プロンプトを開き、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 クライアントを実行します。別のコマンド プロンプトで、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 サービスに新しいメソッド goodbye を追加します。このメソッドは、クライアントに 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 サービスを更新する方法。

次のステップ