本文へスキップ
BecomeCoder

C#実践コース · 第11章 モダンC#実務 · レッスン67

gRPC 入門

ローカル実施

導入

サービス同士(マイクロサービス)の通信では、JSON over HTTP より速く・型が厳密な手段がほしくなります。gRPC は、.proto という定義ファイルからC#のコードを自動生成し、バイナリで効率よく通信するしくみです。専用のホスト・ツールが必要なため、ここではコード例で読みます。

説明

flowchart LR
    P[".proto<br/>サービスとメッセージの定義"] -->|コード生成| S["サーバー実装(C#)"]
    P -->|コード生成| C["クライアント(C#)"]
    C <-->|HTTP/2 + バイナリ| S
    style P fill:#e1f5fe

サンプル

// greet.proto ― 通信の「契約」を定義する
syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest { string name = 1; }
message HelloReply   { string message = 1; }
// サーバー: 生成された基底クラスを継承して実装する
public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        => Task.FromResult(new HelloReply { Message = $"Hello, {request.Name}" });
}

// クライアント: 生成された型付きクライアントを呼ぶだけ
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "Taro" });
Console.WriteLine(reply.Message);   // Hello, Taro
  • .proto に「サービス」と「メッセージ」を定義し、そこからC#コードを自動生成する
  • 通信は HTTP/2 + バイナリ(Protocol Buffers) で、JSONより高速・コンパクト
  • 型が厳密なので、サーバーとクライアントの食い違いをコンパイル時に防げる
  • サービス間通信(マイクロサービス)や社内API で採用が多い。ブラウザからは gRPC-Web を使う

演習

手元で dotnet new grpc を作り、生成される greet.proto を眺めてから、SayHello の返すメッセージを書き換えてみましょう。定義から実装・クライアントがどうつながるかを追えます。

まとめ

  • gRPCは .proto から型付きのサーバー/クライアントを生成する
  • HTTP/2 + バイナリで高速・厳密。JSON over HTTP の代替
  • マイクロサービス間通信の定番。ブラウザ向けは gRPC-Web

次回: C#実践コースはここまで。文法・OOP・パターンで培った力を、実務の各領域で発揮していきましょう。