gRPCサービスの設計

サービス定義、メソッドのアノテーション、protobufの生成、適切なgRPCステータスコードのマッピングを含む、GoaでのgRPCサービスの設計方法を学びます。

このチュートリアルでは、Goaを使用して簡単なgRPCサービスを設計します。Goaは RESTエンドポイントによく使用されますが、gRPCトランスポートにも ファーストクラスのサポートを提供します。以下の方法を学びます:

  • GoaのDSLでサービスとメソッドを定義する
  • .protoファイルを生成するコードを生成するようにgRPCのアノテーションを付ける
  • ペイロードを検証し、エラーをgRPCステータスコードにマッピングする

作成するもの

SayHelloという単一のメソッドを持つ**greeterサービスを作成します。 このメソッドはペイロードで名前を受け取り、挨拶メッセージを返します。また、 標準的なgRPCコードでgRPCレスポンスを修飾**する方法も示します。

メソッドgRPC RPC説明
SayHellorpc 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ステータスマッピングの 単一の信頼できる情報源が提供され、サービスを時間とともに進化させ維持することが容易になります!