ProtobufでのgRPCサービス定義

protobufでユナリRPCメソッドを持つgRPCサービスの定義方法。サービス宣言、リクエスト/レスポンスパターン、メソッド命名規則を解説します。

Services & RPCs

詳細な説明

gRPCサービスの定義

protobufのserviceは、サーバーが実装しクライアントが呼び出せるRPC(Remote Procedure Call)メソッドのセットを定義します。これらの定義はgRPC APIの基盤です。

syntax = "proto3";

package user.v1;

service UserService {
  // ユナリRPC: 単一リクエスト、単一レスポンス
  rpc GetUser(GetUserRequest) returns (GetUserResponse);
  rpc CreateUser(CreateUserRequest) returns (CreateUserResponse);
  rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
  rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse);
  rpc ListUsers(ListUsersRequest) returns (ListUsersResponse);
}

message GetUserRequest {
  int64 user_id = 1;
}

message GetUserResponse {
  User user = 1;
}

message CreateUserRequest {
  string name = 1;
  string email = 2;
  string role = 3;
}

message CreateUserResponse {
  User user = 1;
}

message UpdateUserRequest {
  int64 user_id = 1;
  string name = 2;
  string email = 3;
}

message UpdateUserResponse {
  User user = 1;
}

message DeleteUserRequest {
  int64 user_id = 1;
}

message DeleteUserResponse {}

message ListUsersRequest {
  int32 page_size = 1;
  string page_token = 2;
}

message ListUsersResponse {
  repeated User users = 1;
  string next_page_token = 2;
}

message User {
  int64 id = 1;
  string name = 2;
  string email = 3;
  string role = 4;
}

サービス設計パターン

個別のRequest/Response型: 各RPCは他のRPCと同じに見えても、独自のリクエスト・レスポンスメッセージ型を持つべきです。これにより破壊的変更なしに独立した進化が可能になります。

命名規則:

  • サービス名: Serviceで終わるPascalCase(例: UserService
  • メソッド名: 動詞-名詞のPascalCase(例: GetUserListUsers
  • リクエストメッセージ: {MethodName}Request
  • レスポンスメッセージ: {MethodName}Response

パッケージバージョニング: user.v1のようなバージョン付きパッケージを使用してAPI進化をサポートします。破壊的変更を行う場合は、v1を変更する代わりにuser.v2を作成します。

コード生成

言語固有のgRPCプラグインでprotocを実行すると以下が生成されます:

  • RPCごとに1メソッドのサーバーインターフェース/抽象クラス
  • 接続、シリアライゼーション、エラーハンドリングを処理するメソッドを持つクライアントスタブ
  • すべてのリクエスト/レスポンス型のメッセージクラス

ユースケース

複数のプログラミング言語(Go、Java、Python、TypeScriptなど)向けの自動コード生成を備えた、明確に定義されたコントラクトが必要なマイクロサービスAPIレイヤーの構築。

試してみる — Protobuf Definition Parser

フルツールを開く