gRPC
UZUプロジェクトにおけるgRPCの実装と利用方法。
概要
gRPCは、UZUプロジェクトでマイクロサービス間の通信に使用される高性能RPCフレームワークです。Protocol Buffersを使用してサービス定義とメッセージフォーマットを記述します。
主な用途
- マイクロサービス間の内部通信
- リアルタイム通信
- バックエンドサービス間のデータ同期
- 高スループットが必要なAPI
プロトコル定義
ディレクトリ構成
backend/
├── proto/
│ ├── user/
│ │ └── user.proto
│ ├── room/
│ │ └── room.proto
│ └── scenario/
│ └── scenario.protoサンプル定義
protobuf
syntax = "proto3";
package uzu.user.v1;
service UserService {
rpc GetUser(GetUserRequest) returns (GetUserResponse);
rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
}
message GetUserRequest {
string user_id = 1;
}
message GetUserResponse {
User user = 1;
}Go実装
サーバー実装
go
type server struct {
pb.UnimplementedUserServiceServer
}
func (s *server) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserResponse, error) {
// 実装
return &pb.GetUserResponse{
User: user,
}, nil
}クライアント実装
go
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("Failed to connect: %v", err)
}
defer conn.Close()
client := pb.NewUserServiceClient(conn)
resp, err := client.GetUser(context.Background(), &pb.GetUserRequest{
UserId: "user-123",
})コード生成
bash
# Protocol Buffersからコード生成
protoc --go_out=. --go-grpc_out=. proto/**/*.proto
# または go generate を使用
go generate ./...開発環境
ローカル開発
bash
# gRPCサーバー起動
task backend:grpc-server
# gRPCクライアントでテスト
grpcurl -plaintext localhost:50051 listデバッグツール
- grpcurl: コマンドラインからgRPCサービスをテスト
- BloomRPC: GUI版のgRPCクライアント
- Evans: インタラクティブなgRPCクライアント
ベストプラクティス
- バージョニング: APIの後方互換性を保つ
- エラーハンドリング: gRPCステータスコードを適切に使用
- 認証: TLSとトークンベース認証の実装
- タイムアウト: 適切なデッドラインの設定
- ロードバランシング: クライアントサイドロードバランシング
トラブルシューティング
接続エラー
bash
# ポートが開いているか確認
lsof -i :50051
# サービスが起動しているか確認
docker ps | grep grpcプロトコルバージョン不一致
bash
# proto定義を再生成
task backend:proto-gen