1. 概要
gRPC は、Google で開発された、言語やプラットフォームに依存しないリモート プロシージャ コール(RPC)フレームワークおよびツールセットです。これにより、プロトコル バッファ(特に強力なバイナリ シリアル化ツールセットおよび言語)を使用してサービスを定義できます。それにより、さまざまな言語で、サービス定義から慣用的なクライアント スタブとサーバースタブを生成できます。
この Codelab では、gRPC フレームワークを使用して API を公開する C# サービスを構築する方法を学びます。このサービスとのやり取りには、C# で記述されたコンソール クライアントを使用します。このクライアントでは、サービスと同じサービス記述を使用します。
学習内容
- プロトコル バッファ言語。
- C# を使用して gRPC サービスを実装する方法。
- C# を使用して gRPC クライアントを実装する方法。
- gRPC サービスを更新する方法。
必要なもの
- ブラウザ(Chrome、Firefox など)。
- Visual Studio 2013 以降がインストールされている。
- .NET フレームワークと C# 言語に関する基本的な知識。
このチュートリアルの利用方法をお選びください。
Google Cloud Platform のご利用経験について、いずれに該当されますか?
<ph type="x-smartling-placeholder">2. gRPC C# のサンプルをダウンロードしてビルドする
サンプルをダウンロード
zip ファイルとして gRPC C# のサンプル リポジトリをダウンロードし、展開します。
または、その Git リポジトリのクローンを作成することもできます。
git clone https://github.com/meteatamel/grpc-samples-dotnet.git
どちらの場合も、次の内容の grpc-samples-dotnet
フォルダが必要です。
ソリューションを構築する
サンプル アプリケーション フォルダには、Visual Studio ソリューションの GrpcSamples.sln
が含まれています。ダブルクリックして Visual Studio でソリューションを開きます。複数のプロジェクトを含むソリューションが表示されます。
プロジェクトについては次のセクションで詳しく説明しますが、まずはプロジェクトをビルドするだけです。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 サービスを更新する方法。
次のステップ
- Google Cloud Platform 上の Windows の詳細を学ぶ
- Google Cloud Platform での .NET の詳細を学ぶ
- Cloud Tools for Visual Studio の使い方を学ぶ