素晴らしいものを作る準備はできましたか?このガイドではcurl
がインストールされていることを前提としています。他のHTTPクライアントでも問題ありません。
最初のGoaサービスのための新しいワークスペースをセットアップすることから始めましょう:
mkdir hello-goa && cd hello-goa
go mod init hello
注意:このガイドでは簡単なモジュール名
hello
を使用していますが、実際のプロジェクトでは 通常github.com/yourusername/hello-goa
のようなドメイン名を使用します。心配しないでください - 学ぶ概念はまったく同じように機能します!
さあ、ワクワクする部分です - サービスの設計です!Goaの強力なDSLを使用して、 わずか数行のコードでクリーンでプロフェッショナルなAPIを作成できます。
design
フォルダの追加mkdir design
design/design.go
):package design
import (
. "goa.design/goa/v3/dsl"
)
var _ = Service("hello", func() {
Description("シンプルな挨拶を返すサービス。")
Method("sayHello", func() {
Payload(String, "挨拶する相手の名前")
Result(String, "挨拶メッセージ")
HTTP(func() {
GET("/hello/{name}")
})
})
})
この設計の内容を見てみましょう:
Service("hello", ...)
は"hello"という名前の新しいサービスを定義しますsayHello
を定義し、以下を含みます:Payload
- 挨拶したい相手の名前Result
- 挨拶メッセージ/hello/{name}
のHTTP GETエンドポイントへのマッピング({name}
は自動的にペイロードにバインドされます)この簡単な設計は、Goaの宣言的なアプローチを示しています - APIに何をしてほしいかを記述し、パラメータのバインド、ルーティング、OpenAPIドキュメントなどの実装の詳細はGoaが処理します。
ここで魔法が起こります!Goaのコードジェネレータを使用して、あなたの設計を 完全に機能するサービス構造に変換しましょう:
goa gen hello/design
これにより、必要なすべてのもの - エンドポイント、トランスポートロジック、さらにはOpenAPI仕様を含む
gen
フォルダが作成されます。すごいでしょう?
次に、example
コマンドで動作するサービスのスキャフォールドを作成しましょう:
goa example hello/design
注意:
example
コマンドは出発点と考えてください - 構築の基礎となる動作する実装を提供します。 設計が変更されたときはgen
を再実行しますが、example
から得たコードはカスタマイズと拡張が可能です。
hello-goa
フォルダには以下のものが作成されます:
hello-goa
├── cmd
│ ├── hello
│ │ ├── http.go
│ │ └── main.go
│ └── hello-cli
│ ├── http.go
│ └── main.go
├── design
│ └── design.go
├── gen
│ ├── ...
│ └── http
└── hello.go
サービスに命を吹き込む時が来ました!hello.go
ファイルを編集し、
SayHello
メソッドを以下の歓迎の実装に置き換えましょう:
func (s *hellosrvc) SayHello(ctx context.Context, name string) (string, error) {
log.Printf(ctx, "hello.sayHello")
return fmt.Sprintf("こんにちは、%sさん!", name), nil
}
もう少しです - 驚くほど簡単でしたね?
まず、すべての依存関係を整理しましょう:
go mod tidy
さあ、真実の瞬間です - サービスをオンラインにしましょう:
go run hello/cmd/hello --http-port=8080
INFO[0000] http-port=8080
INFO[0000] msg=HTTP "SayHello" mounted on GET /hello/{name}
INFO[0000] msg=HTTP server listening on "localhost:8080"
新しいターミナルを開いて、サービスを動作させてみましょう:
curl http://localhost:8080/hello/Alice
"こんにちは、Aliceさん!"
🎉 素晴らしい!最初のGoaサービスを作成してデプロイしました。これはGoaで構築できるものの始まりに過ぎません!
もっとクールなものを試してみませんか?Goaは自動的にコマンドラインクライアントを生成しました。 試してみましょう:
go run hello/cmd/hello-cli --url=http://localhost:8080 hello say-hello -p=Alice
CLIで他に何ができるか気になりますか?すべての機能を確認してみましょう:
go run hello/cmd/hello-cli --help
サービスが成長するにつれて、新機能を追加したくなるでしょう。設計に新しいメソッド、 フィールド、エラーを追加するたびに、以下を実行します:
goa gen hello/design
サービスコードはあなたのものです - Goaはgen
フォルダ外のものには触れないので、
好きなように拡張とカスタマイズができます!
Goaのスキルをさらに高めたいですか?チュートリアルに進んで、 強力なREST API、gRPCサービスなどの構築方法を学びましょう。可能性は無限大です!