sprayでwebサービス作るチュートリアル 第1回

2014-09-03

はじめに

sprayってなあに?

sprayはscalaのwebフレームワークです。
「akkaベースで速くて軽いぜ」と唱っています。

http://spray.io/

sprayのライブラリ

sprayはいくつかのライブラリで構成されています。
sprayのドキュメントに詳しい説明があります。
webサービスを作るのに、全てを使う必要はありません。
自分の作りたいものにフィットしたライブラリを適宜使います。

  • spray-cachingAkkaのFutureと
    concurrentlinkedhashmap
    を使った軽くて高速なインメモリ・キャッシュを提供
  • 
spray-canspray-ioをベースとした、低次元&低オーバーヘッドなハイ・パフォーマンスなHTTPサーバとクライアントを提供
    (完全非同期、ノンブロッキング)
  • spray-client高次元HTTPクライアントを提供。ベースはspray-can。
  • spray-httpHTTPリクエストやHTTPレスポンスなどのHTTP構造体を提供。
  • spray-httpxHTTPメッセージに関する高次ロジックを提供。
    ※spray-routingやspray-clientに依存していない。
  • spray-io低次元ネットワークI/Oレイヤーを提供。非同期でJava NIOソケットに接続する。
    これがベース。
  • spray-routingハイレベルでとてもフレキシブルなルーティングDSLを提供。
    ※後述しますが、Freeモナドの結集体
  • spray-servletサーブレット上にspray-canのインターフェイスを提供。
    ※sprayをサーブレット・コンテナで動かすときはこれ使います。
  • spray-testkitsprayのテスト・キット。
    actorに依存しないテストを書くことができる。
    spray-util
    いろいろユーティリティ。

これらのライブラリを組み合わせてアプリケーションをつくります。

sprayのソースコード

Githubにあります。
https://github.com/spray/spray

ドキュメントはこちら。
http://spray.io/documentation/1.2.1/

必要なもの

sprayでつくったWebサービスを動かすために、下記をインストールしておく必要があります。

  • JDK (>=1.6 ※現時点でscalaがサポートしているのは1.6なので、敢えて1.7や1.8を使う必要はありません。)
  • sbt (gradleでも可。お好みの方で)

またIDEを使うと開発がしやすいです。
わたしはIntelliJ(Community版)を使っています。

サンプルを動かしてみる

JDKやsbtをインストールしたら早速動かします。
Githubのsprayリポジトリにはサンプル・コードがあります。
これは実際のプロジェクトを作成する上でもテンプレートになりますので、持ってきて実行してみます。

https://github.com/spray/spray/tree/master/examples

ここで、spray-canとspray-routingのどちらを使えば良いのか迷います。
sprayのドキュメントを読むと、

  • spray-can・・・プリミティブなHTTPレイヤー機能を提供
  • spray-routing・・・spray-can + 高機能なルーティング機能

のようなので、エンドポイントが少ないサービスだったらspray-canを使っても良いのかもしれません。
ここでは、’Webサービス’をつくりたいのでエンドポイントがある程度多いことを予想してspray-routingを使います。

git clone git://github.com/spray/spray.git
cd spray
sbt "project simple-routing-app" run

PermGenErrorが出る場合

sbt appears to be exiting abnormally.
  The log file for this session is at /var/folders/1t/d9_8ydjd73v7qqpppm8tch8c79n593/T/sbt695834379471927656.log
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space

このようなエラーが出たら、sbt実行ファイルに
-XX:PermSize=128M -XX:MaxPermSize=128M
を追加してあげます。

vi sbt
~
#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.5/libexec/sbt-launch.jar "$@"
↓
exec java -Xms512M -Xmx1536M -XX:PermSize=128M -XX:MaxPermSize=128M -Xss1M -XX:+CMSClassUnloadingEnabled ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.5/libexec/sbt-launch.jar "$@"
~

これで動きました。
curlやブラウザで
http://127.0.0.1:8080/
を実行してみます。

応答が返ってくるのがわかります。

console_spray_run

次回はこのサンプルをテンプレートとしてWebサービスを作成していきます。