gRPCサービスの設計
サービス定義、メソッドのアノテーション、protobufの生成、適切なgRPCステータスコードのマッピングを含む、GoaでのgRPCサービスの設計方法を学びます。
このチュートリアルでは、Goaを使用して簡単なgRPCサービスを設計します。Goaは RESTエンドポイントによく使用されますが、gRPCトランスポートにも ファーストクラスのサポートを提供します。以下の方法を学びます:
- GoaのDSLでサービスとメソッドを定義する
.protoファイルを生成するコードを生成するようにgRPCのアノテーションを付ける- ペイロードを検証し、エラーをgRPCステータスコードにマッピングする
作成するもの
SayHelloという単一のメソッドを持つ**greeterサービスを作成します。
このメソッドはペイロードで名前を受け取り、挨拶メッセージを返します。また、
標準的なgRPCコードでgRPCレスポンスを修飾**する方法も示します。
| メソッド | gRPC RPC | 説明 |
|---|---|---|
| SayHello | rpc SayHello | ユーザーが提供した名前に対する挨拶を返す |
1. 新しいモジュールとフォルダの作成
このプロジェクトgrpcgreeterのための新しいGoモジュールを作成します:
mkdir grpcgreeter
cd grpcgreeter
go mod init grpcgreeter
このフォルダ内に、DSLファイルを格納するdesign/ディレクトリを設定します:
mkdir design
2. サービス設計の記述
以下の内容でdesign/greeter.goというファイルを作成します:
package design
import (
. "goa.design/goa/v3/dsl"
)
// gRPCベースのgreeterサービスを定義
var _ = Service("greeter", func() {
Description("シンプルなgRPCサービスで挨拶を返します。")
Method("SayHello", func() {
Description("ユーザーに挨拶を送信します。")
// リクエストペイロード(クライアントが送信するもの)を定義
Payload(func() {
Field(1, "name", String, "挨拶する相手の名前", func() {
Example("Alice")
MinLength(1)
})
Required("name")
})
// 結果(サーバーが返すもの)を定義
Result(func() {
Field(1, "greeting", String, "フレンドリーな挨拶メッセージ")
Required("greeting")
})
// このメソッドをgRPC経由で公開することを示す
GRPC(func() {
// 成功レスポンスのデフォルトコードはCodeOK(0)です。
// 必要に応じてカスタムマッピングも定義できます:
// Response(CodeOK)
})
})
})
重要なポイント
Method("SayHello", ...)を使用してリモートプロシージャコールを定義します。- Payloadは入力フィールドを指定します。gRPCの用語では、これはリクエスト メッセージになります。
- Resultは出力フィールドを定義します。gRPCの用語では、これはレスポンス メッセージになります。
- **
GRPC(func() {...})**を追加することで、生成されるコードに.proto定義とこのメソッドのスタブが含まれることを保証します。 Field(1, "name", String, ...)を使用してリクエストとレスポンス メッセージのフィールドを定義します。数字は生成される.protoファイルの タグです。これはHTTPメソッドでフィールドを定義する際のAttributeの使用に 代わるものです。HTTPとgRPCの両方のトランスポートをサポートするメソッドは、 フィールドの定義にFieldを使用できます(タグはHTTPでは無視されます)。
3. 次のステップ
gRPCサービス設計が完了したら、次のチュートリアルに進みましょう:
- サービスの実装: コードを生成し、カスタムロジックを組み込み、GoaでgRPCサーバーを実行する方法を学びます。
- サービスの実行: 公式のgRPC CLIやその他のツールを使用してエンドポイントを呼び出し、すべてが正しく動作することを確認する方法を探ります。
これでGoaを使用して最小限のgRPCサービスを設計しました。DSLアプローチにより、 リクエスト/レスポンスの型、バリデーション、gRPCステータスマッピングの 単一の信頼できる情報源が提供され、サービスを時間とともに進化させ、 維持することが容易になります!