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(例:GetUser、ListUsers) - リクエストメッセージ:
{MethodName}Request - レスポンスメッセージ:
{MethodName}Response
パッケージバージョニング: user.v1のようなバージョン付きパッケージを使用してAPI進化をサポートします。破壊的変更を行う場合は、v1を変更する代わりにuser.v2を作成します。
コード生成
言語固有のgRPCプラグインでprotocを実行すると以下が生成されます:
- RPCごとに1メソッドのサーバーインターフェース/抽象クラス
- 接続、シリアライゼーション、エラーハンドリングを処理するメソッドを持つクライアントスタブ
- すべてのリクエスト/レスポンス型のメッセージクラス
ユースケース
複数のプログラミング言語(Go、Java、Python、TypeScriptなど)向けの自動コード生成を備えた、明確に定義されたコントラクトが必要なマイクロサービスAPIレイヤーの構築。