paint-brush
反復的なボイラープレートを使用せずに Go で RESTful API サービスを構築する@ichebykin
1,184 測定値
1,184 測定値

反復的なボイラープレートを使用せずに Go で RESTful API サービスを構築する

Mify6m2023/03/06
Read on Terminal Reader

長すぎる; 読むには

私たちはかなり長い間サービスを作成してきましたが、多くの場合、サービスをつなぎ合わせるという面倒なプロセスをすべてスキップして、有用なコードだけを作成したいと思うことがよくあります。そのため、オープンソース インフラストラクチャのボイラープレート ジェネレーターである Mify を作成しました。このチュートリアルでは、Mify を使用して単純なサービスを作成する方法を、古典的な例である To Do アプリで示します。
featured image - 反復的なボイラープレートを使用せずに Go で RESTful API サービスを構築する
Mify HackerNoon profile picture



サービスの作成方法に関する資料はたくさんあります。最初に使用するフレームワークを選択する必要があり、次にハンドラー、構成、ログ、ストレージなどの配線が必要であり、そのサービスをどこかにデプロイすることは言うまでもありません。私たちはかなり長い間サービスを書いてきましたが、多くの場合、サービスをつなぎ合わせるという面倒なプロセスをすべてスキップして、便利なコードを書きたいと思うでしょう。


Mify と呼ばれるツールを作成したのはそのためです。これはオープンソース インフラストラクチャのボイラープレート ジェネレーターであり、これまでのベスト プラクティスを利用してサービスを構築するのに役立ちます。そのため、このチュートリアルでは、Mify を使用して単純なサービスを作成する方法を、古典的な例である To Do アプリで示します。

前提条件

このチュートリアルを開始する前に、完全な例へのリンクを次に示します: https://github.com/mify-io/todo-app-example

プロジェクトの作成

Mify をインストールした後、プロジェクトを開始するには、ワークスペースを作成する必要があります。

 $ mify init todo-app $ cd todo-app


新しいワークスペースに入ったら、次を実行します。

 $ mify add service todo-backend


これで、To Do バックエンド用の Go テンプレートが作成されます。生成されたすべてのファイルを含むワークスペースの簡略化されたツリーを次に示します。

 . ├── go-services │ ├── cmd │ │ ├── dev-runner │ │ │ └── main.go │ │ └── todo-backend │ │ ├── Dockerfile │ │ └── main.go │ ├── go.mod │ ├── go.sum │ └── internal │ ├── pkg │ │ └── generated │ │ ├── configs │ │ │ └── ... │ │ ├── consul │ │ │ └── ... │ │ ├── logs │ │ │ └── ... │ │ └── metrics │ │ └── ... │ └── todo-backend │ ├── app │ │ ├── request_extra.go │ │ ├── router │ │ │ └── router.go │ │ └── service_extra.go │ └── generated │ ├── api | | └── ... │ ├── app │ │ └── ... │ ├── apputil │ │ └── ... │ └── core │ └── ... ├── schemas │ └── todo-backend │ ├── api │ │ └── api.yaml │ └── service.mify.yaml └── workspace.mify.yaml


Mify は一般的な Go レイアウトの 1 つに大まかに従っており、1 つのリポジトリで複数のサービスに適しています。 internal/pkg/generatedには、複数のサービスで再利用できる構成、ログ、およびメトリック用の共通ライブラリがあります。サービスの go-to ディレクトリはinternal/todo-backendにあります。

この時点で、このサービスはかなりむき出しになっているため、API を追加する必要があります。

API の定義

todo-backend の OpenAPI スキーマはschemas/todo-backend/api/api.yamlファイルにあります。ワークスペースのルートにある Schemas ディレクトリは、Mify に関連するすべてのサービス構成が格納される場所です。


todo バックエンド用の単純な CRUD API を作成しましょう。

  • 新しい To Do ノートを追加するためのPOST /todos
  • それらを更新、取得、および削除するためのPUT,GET,DELETE /todos/{id}

OpenAPI スキーマでこの API を検索する方法は次のとおりです。

https://gist.github.com/chebykinn/5dc7b30a2a57a1ab4584895131295e1f

以前のスキーマをこれに置き換えて、 mify generateを実行します。スキーマを更新するたびに実行でき、変更されたすべてのものを再生成します。

構築とテスト

$ cd go-services $ go mod tidy $ go run ./cmd/todo-backend


次のような起動ログが表示されるはずです。

starting api serverでサービス ポートを確認し、それを Postman にコピーして、いくつかの API ハンドラーを呼び出してみてください。

ハンドラーが何も返していないことがわかります。これは、エラーが示唆するように、まだ実装されていないためです。

モデルとモック ストレージの追加

まず、todo ノートのモデルを作成する必要があります。それをdomainパッケージに入れます。

go-services/internal/todo-backend/domain/todo.go :

これは、ストレージのインターフェイスを定義するのにも適した場所です。これは、永続化ロジックをアプリケーションから切り離すのに役立ちます。このチュートリアルでは、メモリ内のモック ストレージを使用しますが、Mify は Postgres もサポートしているため、後でフォローアップ記事で追加できます。 go-services/internal/todo-backend/storage/todo_mem.go:

ロジックはこれですべてです。あとは、ハンドラに追加するだけです。

ハンドラーの実装

POST メソッドのgo-services/internal/todo-backend/handlers/todos/service.go 、および

その他の場合go-services/internal/todo-backend/handlers/todos/id/service.go

POST メソッドのスタブの例を次に示します。

それでは、すべてのハンドラを実装しましょう。

go-services/internal/todo-backend/handlers/todos/service.go :

インポートを更新することを忘れないでください:

 import ( "net/http" "strconv" "example.com/namespace/todo-app/go-services/internal/todo-backend/domain" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/api" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/apputil" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/core" "example.com/namespace/todo-app/go-services/internal/todo-backend/handlers" )


go-services/internal/todo-backend/handlers/todos/id/service.go :

また、それらのインポートも次のとおりです。

 import ( "errors" "fmt" "net/http" "strconv" "example.com/namespace/todo-app/go-services/internal/todo-backend/domain" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/api" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/apputil" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/core" "example.com/namespace/todo-app/go-services/internal/todo-backend/handlers" "example.com/namespace/todo-app/go-services/internal/todo-backend/storage" )


ハンドラーのロジックは非常に単純です。生成された OpenAPI モデルをアプリケーションに変換し、元に戻すだけです。コードの重複を避けるために、これらの実装で使用される TodoNode 応答を作成するためのヘルパーを次に示します。

go-services/internal/todo-backend/handlers/common.go :

再テスト

まず、POST リクエストで新しい todo ノートを追加できます。

GET リクエストで追加されているかどうかを確認します。

PUT リクエストで更新します。

消して:

GET をもう一度実行して、削除されたかどうかを確認します。

次は何ですか

  • Postgres などの永続ストレージ

  • 構成、

  • 認証ミドルウェア、

  • クラウドへの展開。


このようなことのほとんどはドキュメントでカバーされているので、https: //mify.io/docsで確認してください。ただし、次の記事にご期待ください。


こちらにも掲載