grpc-golang について
Go 開発者向けに、本番用 gRPC サービスの設計と実装を案内するスキルです。Protobuf と Buf による契約管理、mTLS、ストリーミング、OpenTelemetry による可観測性を扱います。
主な機能
- 01Go の gRPC サービス設計
- 02Protobuf 契約のバージョン管理
- 03Buf による lint と互換性検査
- 04mTLS によるサービス認証
- 05OpenTelemetry の計装
活用シーン
- 01Go マイクロサービス通信の設計
- 02Protobuf に基づく内部 API の構築
- 03単項またはストリーミング RPC の実装
- 04gRPC サービスへのトレースとメトリクス追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill grpc-golangインストール後、Claude Code で/grpc-golangを入力して読み込まれたか確認します。
同梱ファイルresources/implementation-playbook.md
詳細
gRPC Golang (gRPC-Go)
概要
Go で本番環境向けの gRPC サービスを設計、実装するための包括的なガイドです。Buf によるコントラクトの標準化、mTLS によるトランスポート層のセキュリティ、OpenTelemetry の計装による詳細な可観測性を扱います。
このスキルを使用する場合
- Go で gRPC を使ったマイクロサービス間通信を設計するとき。
- Protobuf を使用して高パフォーマンスな内部 API を構築するとき。
- ストリーミング処理(単方向または双方向)を実装するとき。
- Protobuf と Buf を使用して API コントラクトを標準化するとき。
- サービス間認証のために mTLS を設定するとき。
このスキルを使用しない場合
- gRPC の要件がない、REST/HTTP のみの公開 API を構築するとき。
- 新しい API バージョン(例:
api.v2)を導入できず、後方互換性も確保できない状況で、レガシーな.protoファイルを変更するとき。 - サービスメッシュのトラフィックルーティング(例:Istio/Linkerd)を管理するとき。これはアプリケーションコードの範囲外です。
ステップごとのガイド
- 技術的なコンテキストを確認する:Go のバージョン、gRPC-Go のバージョン、プロジェクトで Buf と素の protoc のどちらを使用しているかを特定します。
- 要件を確認する:mTLS の必要性、負荷パターン(単項/ストリーミング)、SLO、メッセージサイズの上限を特定します。
- スキーマを計画する:パッケージのバージョン管理(例:
api.v1)、リソースの種類、エラーのマッピングを定義します。 - セキュリティを設計する:サービス間認証のために mTLS を実装します。
- 可観測性を確保する:トレース、メトリクス、構造化ログのためにインターセプターを設定します。
- 検証する:コード生成を確定する前に、必ず
buf lintと破壊的変更のチェックを実行します。
詳しいパターン、コード例、アンチパターンについては、resources/implementation-playbook.md を参照してください。
例
例 1:サービスとメッセージの定義(v1 API)
syntax = "proto3";
package api.v1;
option go_package = "github.com/org/repo/gen/api/v1;apiv1";
service UserService {
rpc GetUser(GetUserRequest) returns (GetUserResponse);
}
message User {
string id = 1;
string name = 2;
}
message GetUserRequest {
string id = 1;
}
message GetUserResponse {
User user = 1;
}
ベストプラクティス
- ✅ 推奨:
buf.yamlとbuf.gen.yamlを使用して、ツールチェーンとリンティングを Buf で標準化します。 - ✅ 推奨: パッケージのパスでは常にセマンティックバージョニングを使用します(例:
package api.v1)。 - ✅ 推奨: すべての内部サービス間通信で mTLS を必須にします。
- ✅ 推奨: リソースリークを防ぐため、すべてのストリーミングハンドラーで
ctx.Done()を処理します。 - ✅ 推奨: ドメインエラーを標準の gRPC ステータスコード(例:
codes.NotFound)にマッピングします。 - ❌ 非推奨: 生の内部エラー文字列やスタックトレースを gRPC クライアントに返します。
- ❌ 非推奨: リクエストごとに新しい
grpc.ClientConnを作成します。接続は必ず再利用してください。
トラブルシューティング
- エラー:Gen の不整合:生成されたコードがスキーマと一致しない場合は、
buf generateを実行し、go_packageオプションを確認します。 - エラー:コンテキストの期限切れ:クライアントのタイムアウトを確認し、ストリーミングハンドラーでサーバーが無期限にブロックされないようにします。
- エラー:mTLS ハンドシェイク:クライアント側とサーバー側の両方で、CA 証明書が
x509.CertPoolに正しく追加されていることを確認します。
制限事項
- サービスメッシュのトラフィックルーティング(Istio/Linkerd の設定)は扱いません。
- gRPC-Web やブラウザベースの gRPC 統合は扱いません。
- バージョン固有の例を示すものであり、サポート対象バージョンの一覧ではありません。現在の Go/gRPC-Go モジュールの要件と API(例:
grpc.Dialとgrpc.NewClient)を確認してください。 - L7 の gRPC 対応ロードバランサーの設定(例:Envoy、NGINX)は扱いません。
- Buf lint の範囲を超える Protobuf スキーマレジストリや大規模なスキーマガバナンスは扱いません。
リソース
- 詳しいパターン、コード例、アンチパターンについては
resources/implementation-playbook.mdを参照してください。 - Google API 設計ガイド
- Buf ドキュメント
- gRPC-Go ドキュメント
- OpenTelemetry Go 計装
関連スキル
- @golang-pro - gRPC レイヤー以外の一般的な Go のパターンとパフォーマンス最適化。
- @go-concurrency-patterns - ストリーミングハンドラー向けの高度な goroutine ライフサイクル管理。
- @api-design-principles -
.protoファイルを作成する前のリソース命名とバージョニング戦略。 - @docker-expert - gRPC サービスのコンテナ化と、Docker secrets を介した TLS 証明書の注入設定。
コメント
Markdown 対応