ゴア・フレームワーク

Go マイクロサービス向けのデザインファースト API 開発と自動コード生成。

概要

Goa は Go でマイクロサービスを構築するためのデザインファーストのフレームワークです。Goa の強力な DSL を使って API を定義し、Goa が定型コード、ドキュメント、クライアントライブラリを生成します。

主な機能

  • 設計優先 — 実装コードを書く前に、強力な DSL を使って API を定義します。
  • コード生成 — サーバー、クライアント、ドキュメントを自動生成します。
  • 型安全性 — 設計から実装までエンドツーエンドで型安全です。
  • マルチトランスポート — 1 つの設計から HTTP と gRPC をサポートします。
  • バリデーション — 設計に基づくリクエストバリデーションが組み込まれています。
  • ドキュメント — OpenAPI 仕様を自動生成します。

Goa の仕組み

Goa は API 設計と実装を分離する 3 フェーズのワークフローを採用しており、一貫性を保ちながら定型コードを削減します。

Goa の 3 フェーズ・ワークフロー:Design → Generate → Implement

フェーズ 1: 設計(あなたが書く)

設計フェーズでは、Go ファイル上の Goa DSL(通常は design/ ディレクトリ)で API を定義します。

  • 型(Types): バリデーションルール付きのデータ構造を定義します。
  • サービス(Services): 関連するメソッドをグループ化します。
  • メソッド(Methods): ペイロードと結果を持つ操作を定義します。
  • トランスポート(Transports): メソッドを HTTP エンドポイントや gRPC プロシージャへマッピングします。
  • セキュリティ(Security): 認証・認可スキームを定義します。

あなたが作るもの: API 仕様を Go コードとして表現した design/*.go ファイルです。

フェーズ 2: 生成(自動)

goa gen を実行すると、定型コードをすべて自動生成します。

goa gen myservice/design

Goa が作るものgen/ ディレクトリ配下):

  • リクエストルーティングとバリデーションを備えたサーバースキャフォールド
  • 型安全なクライアントライブラリ
  • OpenAPI/Swagger 仕様
  • Protocol Buffer 定義(gRPC 用)
  • トランスポートのエンコーダー/デコーダー

重要: gen/ 配下のファイルは編集しないでください。goa gen を実行するたびに再生成されます。

フェーズ 3: 実装(あなたが書く)

生成されたサービスインターフェイスを実装して、ビジネスロジックを書きます。

// service.go - あなたが書く
type helloService struct{}

func (s *helloService) SayHello(ctx context.Context, p *hello.SayHelloPayload) (string, error) {
    return fmt.Sprintf("Hello, %s!", p.Name), nil
}

あなたが作るもの: 実際のビジネスロジックを含むサービス実装ファイルです。

手書き vs 自動生成

あなたが書くGoa が生成する
design/*.go — API 定義gen/ — すべてのトランスポートコード
service.go — ビジネスロジックOpenAPI 仕様
cmd/*/main.go — サーバー起動Protocol Buffer 定義
テストとカスタムミドルウェアリクエストバリデーション

ドキュメントガイド

ガイド説明〜トークン
クイックスタートGoa をインストールして、最初のサービスを作成します。~1,100
DSL リファレンスGoa デザイン言語の完全なリファレンスです。~2,900
コード生成Goa のコード生成プロセスを理解します。~2,100
HTTP ガイドHTTP トランスポート機能、ルーティング、パターンを扱います。~1,700
gRPC ガイドgRPC トランスポート機能とストリーミングを扱います。~1,800
エラーハンドリングエラーの定義とハンドリングを扱います。~1,800
インターセプターインターセプターとミドルウェアのパターンを扱います。~1,400
プロダクション観測可能性、セキュリティ、デプロイメントを扱います。~1,300

セクション合計: ~14,500 トークン

クイック例

package design

import . "goa.design/goa/v3/dsl"

var _ = Service("hello", func() {
    Method("sayHello", func() {
        Payload(String, "Name to greet")
        Result(String, "Greeting message")
        HTTP(func() {
            GET("/hello/{name}")
        })
    })
})

生成して実行します:

goa gen hello/design
goa example hello/design
go run ./cmd/hello

はじめに

クイックスタート ガイドで Goa をインストールし、最初のサービスを数分で構築しましょう。

包括的な DSL カバーについては DSL リファレンス を参照してください。