文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

2014年のjavaフレームワークはTwelve-Factor Appに注目!

皆大好き、javaのフレームワークの話題です。


f:id:treeapps:20180426142529p:plain

2014年のトレンドは・・・


Twelve-Factor App

です。

現代では、ソフトウェアは一般にサービスとして提供され、Webアプリケーション や Software as a Service と呼ばれる。Twelve-Factor Appは、次のようなSoftware as a Serviceを作り上げるための方法論である。

  • セットアップ自動化のために 宣言的な フォーマットを使い、プロジェクトに新しく加わった開発者が要する時間とコストを最小化する。
  • 下層のOSへの 依存関係を明確化 し、実行環境間での 移植性を最大化 する。
  • モダンな クラウドプラットフォーム 上への デプロイ に適しており、サーバー管理やシステム管理を不要なものにする。
  • 開発環境と本番環境の 差異を最小限 にし、アジリティを最大化する 継続的デプロイ を可能にする。
  • ツール、アーキテクチャ、開発プラクティスを大幅に変更することなく スケールアップ できる。
http://twelve-factor-ja.herokuapp.com/

何やらherokuの中の人が提唱しているもので、中々よさそうな方法論です。
twelve(12)のfactor(要因)は以下の通りです。

1 コードベース (Codebase) バージョン管理されている1つのコードベースと複数のデプロイ
2 依存関係 (Dependencies) 依存関係を明示的に宣言し分離する
3 設定 (Config) 設定を環境変数に格納する
4 バックエンドサービス (Backing Services) バックエンドサービスをアタッチされたリソースとして扱う
5 ビルド、リリース、実行 (Build, release, run) ビルド、リリース、実行の3つのステージを厳密に分離する
6 プロセス (Processes) アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する
7 ポートバインディング (Port binding) ポートバインディングを通してサービスを公開する
8 並行性 (Concurrency) プロセスモデルによってスケールアウトする
9 廃棄容易性 (Disposability) 高速な起動とグレースフルシャットダウンで堅牢性を最大化する
10 開発/本番一致 (Dev/prod parity) 開発、ステージング、本番環境をできるだけ一致させた状態を保つ
11 ログ (Logs) ログをイベントストリームとして扱う
12 管理プロセス (Admin processes) 管理タスクを1回限りのプロセスとして実行する

このTwelve-Factor Appを実践するフレームワークが、これからのjavaフレームワークの主流になりそうです。

12の要因の中でもプロセスモデルな点が面白いです。
例えばPCサイトとスマホサイトを別々のプロジェクトで作っており、2つのwarをデプロイするとします。

webapps/
├── pc.war
└── sp.war

この場合、tomcatを停止するとpcもspも停止してしまいますね。
しかしpc.jar、sp.jarとして起動すれば、並列に起動する事もできるし、tomcatがdownしても巻き添えを食わなくて済むし、ロードするアプリも1個だけなので起動・停止も速い、と。

jarによるプロセスモデルになると、デプロイ時にソースコードをclone・ビルドするのではなく、ビルド済みのjarと設定ファイルだけをcloneし、後は起動するだけ、というデプロイになるのかもしれませんね。そうなるとビルド・デプロイ時間も大幅に短縮できていい感じになりそうです。


さて、話を戻して、Twelve-Factor Appを実践するフレームワークは今のところ2つだけです。

1, Dropwizard

Dropwizard pulls together stable, mature libraries from the Java ecosystem into a simple, light-weight package that lets you focus on getting things done.

Dropwizard has out-of-the-box support for sophisticated configuration, application metrics, logging, operational tools, and much more, allowing you and your team to ship a production-quality web service in the shortest time possible.

https://dropwizard.github.io/dropwizard/

このDropwizardが大本命です。

将来性

Technology Trends for 2017 | Technology Radar | ThoughtWorks
後述するspring bootやplay frameworkを抜いて、Dropwizardは「採用すべきプロダクト」に選ばれています。

起動の仕方

今までのjava-webアプリは、tomcatにwarをデプロイする事でアプリを起動していました。
Dropwizardはサーブレットコンテナを組み込み、fat jarとして1ファイルのjarにし、以下のようにjavaプロセスとして起動する方式です。

java -jar target/hello-world-0.0.1-SNAPSHOT.jar server hello-world.yml

jar内にサーブレットコンテナも含んでいるので、1ファイルのjarだけでアプリが起動します。javaさえあれば動くのです

この起動の仕方はyumでインストールしたjenkinsと全く同じですね。
jenkinsの起動方式いいなあと思っていたら、今後これが主流になりそうなんですね。
CentOSにyumでjenkinsをインストールする - 文系プログラマによるTIPSブログ

メトリクス収集機能

今までのようにシェルスクリプトで頑張って取得した情報をCloudWatchに送信するので無く、アプリケーションレベルでメトリクスを収集する機能を備えています。

RESTful

JAX-RS実装のJerseyを使ったRESTfulに対応しています。
jsonはお馴染みのjacksonで操作します。

組み込みサーブレットコンテナ

jettyです。

ORM

hibernateです。

DBマイグレーション

Liquibase | Database Refactoring | Liquibase

Flyway by Boxfuse • Database Migrations Made Easy.
です。
liquibaseは多機能重量級で、flywayは低機能軽量級です。
以前以下の記事を書いたので、合わせて御覧ください。
flywayでDBマイグレーション!:調査編1:簡単な挙動確認 - 文系プログラマによるTIPSブログ

テンプレートエンジン

FreeMarker Java Template Engine

{{ mustache }}
です。

2, Spring boot

お馴染みの超、超、超、超、重量級のspringです。
springはJavaEEへのアンチテーゼとして開発されたのですが、あまりにもサブプロジェクトが増えすぎてしまい、JavaEEよりも巨大になってしまうという、本末転倒な、非常に残念なフレームワークの代表格です。

これに嫌気が差して、国産フレームワークであるSastrutsに逃げた人は数知れないでしょう。

しかしこのspringが最近ようやく反省したらしく、Dropwizardを参考(ほぼパクリ)にする事で、軽量化を果たしました。流石に参考にしただけあって、ほぼ全てDropwizardと同じ機能です。。。

将来性

実はかなりあります。
現在Spring Source社は、あの有名なVMWareの子会社になっています。親が強力なので、潰れる心配はほぼ無いでしょうし、springは成長(肥大化)を続けているので、seasarフレームワークのように開発を止める心配も少なそうです。

しかしとにかく機能を豊富にしたがる傾向があり、もの凄い数のサブプロジェクトがあります。Spring bootで一旦軽量化したとはいえ、すぐにブクブクの肥満体になるであろう事が予想できます。

番外編

play framework

ここ数年で流行ったplay frameworkですが、DropwizardとSpring bootの出現で、もう危うくなっているような気がします。playのアドバンテージはもはやakkaによる並列処理くらいでしょうか。

type safe社はscala言語の開発会社なので、今後javaを徐々に捨ててscala推しになっていく可能性もあり、java屋さんにとってはちょっと心配ですね。(ver2になってviewのテンプレートエンジンを、groovyを捨ててscalaに変更した前科有り)

SaStruts

サポートが切れたとはいえ使っている人が多いであろうSaStruts。
RESTに対応できない点を覗いてそれなりの機能もあるし、頑張って拡張できてしまうので、継続して使われる可能性はありますね。

トレンドで見るframework動向

f:id:treeapps:20140814162458p:plain
少し見切れてるのはご容赦ください。
このトレンドはニュース記事の量等で決めているようです。

play frameworkが圧倒的に人気のようですね。
しかしSpring bootとDropwizardが急激に上昇しており、今後はplayとSpring boot・Dropwizardの順位は入れ替わるでしょう。

雑感

いつも思いますが、
フレームワークの流行り廃りの速度は速い
ですね。

私は業務でSaStrutsを使っているのですが、そろそろplayに移行かな、とか思っていた矢先に、DropwizardとSpring bootの登場です。

やはりクラウドに合うように凄い勢いでアプリケーションが進化しているので、それに合わせて使うフレームワークも乗り換えていかなければ、生き残れないですね。


ところでやるお君、キミは今どんなフレームワークを使っているんだい?


S a S t r u t s !!!!


やるお君、キミ、クラウドって知ってる?

 

え?FF7は嫌いですけど。

 

キミもうstruts時代に戻れよ