command
module
Version:
v0.0.0-...-ec52452
Opens a new window with list of versions in this module.
Published: Sep 2, 2023
License: Apache-2.0
Opens a new window with license information.
Imports: 11
Opens a new window with list of imports.
Imported by: 0
Opens a new window with list of known importers.
README
¶
go_webapp_hands_on_2nd
Go言語 Webアプリケーション開発 ハンズオンrev2.0
写経元リポジトリ(参考)
https://github.com/budougumi0617/go_todo_app
セントラルリポジトリ
https://github.com/teru-0529/go_webapp_hands_on_2nd
変更履歴
2023/08/30
SECTION-053 プロジェクトの初期化
SECTION-054 Webサーバーを起動する
SECTION-055 リファクタリングとテストコード
- テスト容易性を高めるため
main
からrun
関数へ処理を分離する。
- 出力結果を検証しやすくする。
- 外部からの中断操作、異常状態を検知できるようにする。
- 外部からの中断操作を受け付けるため、
Shutdown
メソッドが実装されている*http.Server
のListenAndServe
メソッドを利用してHTTPサーバーを起動する。
*http.Server.ListenAndServe
メソッドを実行してHTTPリクエストを受け付ける。
- 引数で渡された
context.Context
を通じて処理の中断命令を検知し、*http.Server.Shutdown
メソッドでサーバー機能を終了する。
- 戻り値として
*http.Server.ListenAndServe
の戻り値のエラーを返す。
*http.Server.ListenAndServe
メソッドを実行しつつ、context.Context
から伝播される終了通知を待機する。
[golang.org/x/sync/errgroup]
パッケージを利用して終了通知を待機する。
errgroup.WithContext
関数を使い、取得した*errgroup.Group
型の値のGo
メソッドを利用することで、func() error
というシグネチャの関数を別ゴルーチンで起動する。
run
関数はHTTPリクエストを待機しつつ、引数で受け取ったcontext.Context
型の値のDone
メソッドの戻り値として得られるチャネルからの通知を待つ。
【参考】sync.ErrGroupで複数のgoroutineを制御する
REM パッケージの取得
go get -u golang.org/x/sync
REM go.mod ファイル/go.sum ファイルの更新
go mod tidy
run
関数のテスト
- 期待通りにHTTPサーバーが起動しているか(HTTPサーバーの戻り値の検証)
- 意図通りに終了するか(run関数の終了通知処理検証)
REM テスト実行
go test -v ./...
SECTION-056 ポート番号を変更できるようにする
SECTION-057 Dockerを利用した実行環境
- マルチステージビルドを実施し、ビルド環境/実行環境を分割する。
- dev環境では
air
コマンドを実行しファイルの更新を検知した際にgo build
コマンドを再実行、プログラム再起動を行う。ローカルマシンのディレクトリをマウントしておくことでホットリロードを実現。
- ビルド後コンテナを起動することで、ローカルマシンからリクエストが送信できる
docker compose up
【参考】Goでリリースビルドするときに最低限付けておきたいオプション
SECTION-058 Makefileを追加する
- windwos環境のため、help(grep)/testの一部(-raceオプション)以外を作成
SECTION-059 Github Actionsを利用した継続的インテグレーション環境
2023/08/31
SECTION-060 環境変数から設定をロードする
2023/09/02
SECTION-061 シグナルをハンドリングする
SECTION-062 「Server」構造体を定義する
http.Server
型をラップした独自定義型を作成する。
- 動的に選択したポートをリッスンするため
net.Listener
型の値を引数で受け取る。
- 責務から分離するため、ルーティングの設定を引数で受け取る。
SECTION-063 ルーティング定義を分離した「NewMux」を定義する
- どのようなハンドラーの実装をどんなURLで公開するかのルーティングを定義する
NewMux
関数を実装する。
*http.Server
型の値ではなく、http.Handler
インターフェースにすることで内部実装に依存しない関数シグネチャにする。
- HTTPサーバーが稼働中かどうかを確認する
/health
エンドポイントを宣言する。
Documentation
¶
Source Files
¶
Directories
¶
Click to show internal directories.
Click to hide internal directories.