おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

gRPCのUnary通信をC#で体験してみた。

はじめに

最近少しずつ名前を聞くようになってきたgRPCを学習してみました。

gRPCには4つの通信方法がありますが、今回は最も基本的な通信UnaryC#で体験してみようと思います。

gRPCについて

gRPCについては以下の2記事がとても丁寧で分かりやすかったです!

qiita.com

blog.xin9le.net

作るもの

今回作るものはコンソールアプリ(クライアント側)で2つの数値を指定し、それらの値をサーバへ送ったあとにその合計値が返却されるものを作ってみたいと思います。

protoファイル

まずはprotoファイルを作ります。

syntax = "proto3";

package calc;

service CalcManager {
  rpc CalcPlusValue (CalcRequest) returns (CalcReply);
}

message CalcRequest {
  int32 value1 = 1;
  int32 value2 = 2;
}

message CalcReply {
  string message = 1;
  int32 sumValue = 2;
}

リクエストの型を定義したCalcRequest, レスポンスの型を定義したCalcReply, それらを用いるCalcPlusValueメソッドを定義しています。

サーバ側の実装

protoファイルをビルド時に読み込むようcsprojファイルへ以下を追記します。
サーバ側のため、GrpcServicesServerとします。

<ItemGroup>
  <Protobuf Include="../Protos/calc.proto" GrpcServices="Server" />
</ItemGroup>

これでビルド(リビルド)後にprotoファイルをもとに自動生成されたベースのコードがobjフォルダ配下に出来上がります。 (これらをアセットというらしい...?)

C# を使用した gRPC サービス | Microsoft Docs

自動生成されたコードの中に{Service名} + "Base"のクラスがあるので、そちらを継承してサービスの処理を作ります。

public sealed class CalcService : CalcManager.CalcManagerBase
{
    public override Task<CalcReply> CalcPlusValue(CalcRequest request, ServerCallContext context)
    {
        return Task.FromResult(new CalcReply
            {
                Message = "計算結果を返します。",
                SumValue = request.Value1 + request.Value2,
            });
        }
    }
}

クライアント側の実装

サーバ側の実装時と同様にcsprojファイルへ以下を追記します。
クライアント側のため、GrpcServicesClientとします。

<ItemGroup>
  <Protobuf Include="../Protos/calc.proto" GrpcServices="Client" />
</ItemGroup>

実行するコードは以下のようにします。

using Calc;
using Grpc.Net.Client;

// サーバのURLを適宜変更する必要があります。
using var channel = GrpcChannel.ForAddress("https://localhost:7015");
var client = new CalcManager.CalcManagerClient(channel);

// 足し算用の値を2つ用意する
var value1 = int.Parse(Console.ReadLine());
var value2 = int.Parse(Console.ReadLine());

Console.WriteLine("・・・サーバへ送信中・・・");

var reply = await client.CalcPlusValueAsync(new CalcRequest { Value1 = value1, Value2 = value2 });
Console.WriteLine($"{reply.Message}");
Console.WriteLine($"{reply.SumValue}");

Console.WriteLine("Press any key to exit...");
Console.ReadKey();

実行してみる

サーバを立ち上げた状態でクライアントアプリ(コンソールアプリ)を実行し、任意の数値2つを入力すると以下のように返却されることが確認できます。

3
4
・・・サーバへ送信中・・・
計算結果を返します。
7
Press any key to exit...

おわりに

以上、gRPCのUnary通信をC#で体験してみたという内容でした。

補足

他の通信についても以下の記事で体験したのでご興味があればぜひ!

gRPCのServer Streaming通信をC#で体験してみた。 - おーみんブログ

gRPCのClient Streaming通信をC#で体験してみた。 - おーみんブログ

gRPCのBidirectional streaming通信をC#で体験してみた。 - おーみんブログ