このエントリーをはてなブックマークに追加

Ratpackについて(前編)

はじめに

この記事は、G*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2014 の6日目として書かれたものです。

5日目は @kyon_mm さんの Geb 0.10の新機能紹介 #gadvent です。

7日目は @grimrose さんの Ratpackについて(後編) です。

Ratpackとは

http://www.ratpack.io/

Ratpackは、NettyをベースとしたJava8とGroovyで書かれたWebアプリケーションフレームワークです。

アプリケーションもまた、Java8またはGroovyで記述出来ます。

フルスタックなフレームワークではなく所謂、MicroWebフレームワークとか軽量Webフレームワークとか呼ばれるカテゴリに属しています。

一番の特徴としては、Nettyをベースにしていることもあるので、Asynchronous & Non Blocking です。

JavaでWebアプリケーションフレームワークというと、ServletやFilterをラップしたフレームワークが多いですが、その場合、別途GlassfishやTomcat, Jettyといったアプリケーションサーバが必要です。

もちろん組み込み可能なアプリケーションサーバを内蔵してwarファイルから起動というようなことも出来ます。

そういった従来のServlet前提のWebアプリケーションとは違い、Ratpackはアプリケーションサーバを必要としません。

fat-jarやZipで固めてデプロイ出来るフレームワークなので、Dockerなどのコンテナと相性が抜群です。

他のWAFとの違い

http://www.ratpack.io/manual/current/intro.html#compared_to

Ratpackから見た他のWebアプリケーションフレームワークとの違いは、以下のような内容です。

Netty

http://netty.io

Nettyは、Ratpackのベースとなっているように、低位のレイヤーをサポートしてるライブラリです。 HTTP以外のプロトコルもサポートしているため、NettyをベースにしたフレームワークはRatpack以外にも様々存在します。

RatpackはNettyをベースとしていますが、オーバーヘッドになるような処理は加えておらず、パフォーマンスはNettyと遜色ありません。

パフォーマンスを優先したいような場合は、NettyのAPIにアクセス出来るようになっています。

Vert.x

http://vertx.io

Vert.xは、個人的に好きなフレームワークで、Ratpackと同じくNettyをベースとしています。

各モジュールがJSONをメッセージバスを介してやりとりを行うようなアプリケーションコンテナとしての性格が強く、言語もJavaやGroovy以外のJVM上で動作できるものを組み合わせて扱うことが出来るようになっています。

また、非同期の処理を行う手段として、コールバックを採用しました。

Ratpackは、よりHTTPに特化しており、Vert.xのWebアプリケーションフレームワークである Yoke に似てます。また、非同期処理の手段は、Vert.xと違い、所謂 Promise を基調とした処理を採用しています。

RxNetty

https://github.com/Netflix/RxNetty

RxNettyは、RxJavaを使い、NettyのAPIをよりリアクティブにしたものです。

Grails

http://grails.org

言わずと知れたGroovyのフルスタックなWebアプリケーションフレームワークです。

Servletをベースとし、SpringFramework, Groovyを採用したフレームワークで、様々なプラグインを組み合わせることで多機能なアプリケーションを作ることが出来ます。

Spark

http://www.sparkjava.com

並列データ処理フレームワークである Apache Spark ではなく、Sinatraに影響を受けたMicroWebフレームワークです。

Servletをベースとしていますが、Servlet APIを意識させないようなコードを書かせるようなフレームワークです。

また、Java8のlambda式を使うことで、より短く簡潔に書けるようになっています。

組み込みアプリケーションサーバのJettyを採用しているので、fat-jarでデプロイすることが出来ます。

Dropwizard

https://dropwizard.github.io/dropwizard

RatpackのページではTBD扱いされていますが、2014年注目されたWebアプリケーションフレームワークの一つです。

Javaでは定番のライブラリを採用したフルスタックなフレームワークです。

組み込みアプリケーションサーバを内蔵し、fat-jarでデプロイ可能というコンセプトは、Twelve-Factor App に基いており、Immutable Infrastructureと相性が良く、そのアイデアの素晴らしさからか、Springframeworkへかなり影響を与え、SpringBootがリリースされたのは記憶に新しいところです。

アーキテクチャ

Ratpackは, MVC2で言われる所謂コントローラー層としての機能を担当しています。

ratpack.handling.Context とそれを扱う ratpack.handling.Handler が主なInterfaceです。

Handlerは所謂FunctionalInterfaceなので、lambda式で書くことが出来ます。

ビュー層は、以下のテンプレートエンジンであれば、モジュールが用意されています。

  • handlebars
  • thymeleaf
  • Groovy Template

APIとして使う場合にも、JacksonやGroovyのJSONのモジュールが用意されています。

モデル層は、特定のものが用意されている訳ではありませんが、Ratpackが用意しているモジュールにはH2、HikariCPといったものがあるので利用できます。 もちろんGroovyが使えるので、GroovyのSQLに関する機能も使えます。

DIコンテナとしてGuiceが用意されているので、モジュールを作ればモデル層や他のテンプレートエンジン等を使うことが出来ます。

モデル層で注意しなければならないのは、Nettyがイベント駆動のエンジンであることから、イベントループをblockする コード、例えばDBにアクセスするコード等です。

但し、Ratpackでは、blockするような場合は、明示的に Context#blocking(Callable) を使うことで対応できます。

また、Context#promise(Action<Fulfiller<T>>) を使うことで、同期的な処理をすることが出来ます。

HTTPのリクエストやレスポンスは、Contextから取得する事で利用できます。

こういったHandlerの処理を src/ratpack/ratpack.groovy に記載していきます。

Groovyの場合は、以下のように記載していきます。

import static ratpack.groovy.Groovy.ratpack

ratpack {
  handlers {
    get {
      render "Hello world!"
    }

    get('foo')  {
      render "Foooooooo!"
    }

  }
}

後編へつづく

次回は、実際にRatpackを使ったWebアプリケーションを作ってHerokuへ公開するまでを紹介してみたいと思います。

このエントリーをはてなブックマークに追加