※この投稿は、丸太式 Advent Calendar 2014の6日目です
昨日に引き続き、JJUG CCC 2014 Fallの参加レポートです。
概要
R1-5 JavaでやってみるThe Twelve-Factor App
by 渡辺 祐さん(株式会社ビズリーチ)
@nabedge
メモ
The Twelve Factor App
- 論文(っぽいよみもの)
- Herokuの元CEOが作った
- "どんなWebアプリケーションであっても、だいたいこの方針で作ればいいんじゃねーの"というもの
ポートバインディングを通じてアプリケーションを公開せよ
- 【自らポートを開いて】
- 開発したアプリケーションの"依存ライブラリのTomcat/Jettyで"ポートを開く
- main()メソッドで起動できるので、Run As -> Java ApplicationでTomcatがポートをバインドして起動できる
- WTP Plugin, Sysdeo Tomcat Pluginはいらない
- Tomcatのバージョンアップも、pom.xmlのバージョンを変えれば良い→普通のリリースフローで対応可能
廃棄容易性
- 高速な起動はJavaではあきらめる
- グレースフルなシャットダウン: Shutdown Hookを使う
- Springなら@PreDestroyアノテーションをつけるとシャットダウン前に呼ばれる
ログをイベントストリームとして扱え
- 「全てのログを標準出力に集める」
- とりあえず標準出力に出しておけば、後から好きなところに流せるので。
- 依存ライブラリのログ出力はslf4jのブリッジライブラリなどで集約する
- GCログは・・・
設定はOS環境変数に格納せよ
- 設定ファイルに本番DBのパスワードも格納してVCSに管理するの?
- OSが違っても環境変数の設定はほとんど同じ
- 気の利いたライブラリはOS環境変数からの設定値読み込みは対応している
- 今時ならChef/Puppet/Ansibleで設定するでしょ
依存関係を明示的に宣言し分離せよ、ビルド/リリース/実行は厳密に分離せよ
ビルド
バイナリ間の依存関係管理機能のあるビルドツールを使う(Maven, Gradle)※Antはダメよ
ビルドの結果はjar, warというバイナリ
- バイナリはパッケージリポジトリサーバにデプロイするもの
- MavenもGradleも、依存関係の解決にはパッケージリポジトリを使う
リリース
- パッケージリポジトリから開発したアプリのJARと依存ライブラリのJARを取得して、依存JARをコピーしてZIPに固めてSCPで送り、サーバー上でUNZIPするまで
実行
- java -cp "jar群の展開dir/*" com.example.ExampleMainClass
- 設定は環境変数に格納されているはず
アプリケーションをステートレスなプロセスとして実行せよ
- 少なくとも、Stickyセッションを使うな→現実問題難しい
- ステートレス:アプリケーションサーバにセッションを持たせない