このチュートリアルでは、Goaを使用して簡単なgRPCサービスを設計します。Goaは RESTエンドポイントによく使用されますが、gRPCトランスポートにも ファーストクラスのサポートを提供します。以下の方法を学びます:
.proto
ファイルを生成するコードを生成するようにgRPCのアノテーションを付けるSayHello
という単一のメソッドを持つ**greeter
サービスを作成します。
このメソッドはペイロードで名前を受け取り、挨拶メッセージを返します。また、
標準的なgRPCコードでgRPCレスポンスを修飾**する方法も示します。
メソッド | gRPC RPC | 説明 |
---|---|---|
SayHello | rpc SayHello | ユーザーが提供した名前に対する挨拶を返す |
このプロジェクトgrpcgreeter
のための新しいGoモジュールを作成します:
mkdir grpcgreeter
cd grpcgreeter
go mod init grpcgreeter
このフォルダ内に、DSLファイルを格納するdesign/
ディレクトリを設定します:
mkdir design
以下の内容で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", ...)
を使用してリモートプロシージャコールを定義します。GRPC(func() {...})
**を追加することで、生成されるコードに.proto
定義とこのメソッドのスタブが含まれることを保証します。Field(1, "name", String, ...)
を使用してリクエストとレスポンス
メッセージのフィールドを定義します。数字は生成される.proto
ファイルの
タグです。これはHTTPメソッドでフィールドを定義する際のAttribute
の使用に
代わるものです。HTTPとgRPCの両方のトランスポートをサポートするメソッドは、
フィールドの定義にField
を使用できます(タグはHTTPでは無視されます)。gRPCサービス設計が完了したら、次のチュートリアルに進みましょう:
これでGoaを使用して最小限のgRPCサービスを設計しました。DSLアプローチにより、 リクエスト/レスポンスの型、バリデーション、gRPCステータスマッピングの 単一の信頼できる情報源が提供され、サービスを時間とともに進化させ、 維持することが容易になります!