導入
サービス同士(マイクロサービス)の通信では、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・パターンで培った力を、実務の各領域で発揮していきましょう。