go_webapp_hands_on_2nd

command module
v0.0.0-...-ec52452 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 2, 2023 License: Apache-2.0 Imports: 11 Imported by: 0

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.ServerListenAndServeメソッドを利用して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 ポート番号を変更できるようにする
  • 任意のポートでHTTPサーバーを起動できるようにする。
    • run関数外部から動的に選択したポート番号のリッスンを開始したnet.Listenerインターフェースを満たす型の値を渡す。
    • net/httpパッケージではポート番号に0を指定すると、利用可能なポート番号を選択してくれることを利用。
    • main関数では、実行時の引数でポート番号を指定する。
    REM ポート番号を指定してmain関数を実行する
    go run . %port_no%
    

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 環境変数から設定をロードする
  • 引数での指定を戻して、環境変数を使って起動する。
  • TODO: ポート番号の動的指定をしなくなったためテストコードを一時的にスキップ
    REM パッケージの取得
    go get -u github.com/caarlos0/env/v6
    
    REM go.mod ファイル/go.sum ファイルの更新
    go mod tidy
    

2023/09/02

SECTION-061 シグナルをハンドリングする
  • グレースフルシャットダウンを実現する。
    • TODO:正しく動いてなさそう(Windowsからのコールだから検証できていないだけ?)
    REM 時間計測
    Measure-Command {curl http://localhost:18000/from_browsess }
    

SECTION-062 「Server」構造体を定義する
  • http.Server型をラップした独自定義型を作成する。
  • 動的に選択したポートをリッスンするためnet.Listener型の値を引数で受け取る。
  • 責務から分離するため、ルーティングの設定を引数で受け取る。

SECTION-063 ルーティング定義を分離した「NewMux」を定義する
  • どのようなハンドラーの実装をどんなURLで公開するかのルーティングを定義するNewMux関数を実装する。
  • *http.Server型の値ではなく、http.Handlerインターフェースにすることで内部実装に依存しない関数シグネチャにする。
  • HTTPサーバーが稼働中かどうかを確認する/healthエンドポイントを宣言する。

Documentation

Overview

server.go

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL