Skip to content

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クライアント

ベストプラクティス ​

  1. バージョニング: APIの後方互換性を保つ
  2. エラーハンドリング: gRPCステータスコードを適切に使用
  3. 認証: TLSとトークンベース認証の実装
  4. タイムアウト: 適切なデッドラインの設定
  5. ロードバランシング: クライアントサイドロードバランシング

トラブルシューティング ​

接続エラー ​

bash
# ポートが開いているか確認
lsof -i :50051

# サービスが起動しているか確認
docker ps | grep grpc

プロトコルバージョン不一致 ​

bash
# proto定義を再生成
task backend:proto-gen

関連ドキュメント ​