「最速」フルスタックWebフレームワーク「revel」の紹介

#速さは正義！
やはり「最速」という言葉は胸を熱くするものがあります。
使うWebフレームワークのレスポンスが速ければ速いほど、ユーザービリティはよくなる上に、必要なサーバー台数も減らせるなど、いいことづくめです。

ただ、レスポンスの速さだけを追い求めて機能を削ったものは、開発の速度を遅くします。
Web開発に通常必要な機能は全て用意した上で、なお速い、そんな都合のいいフレームワークが求められます。

そこで、最近知った「revel」という「最速」にして「フルスタック」のWebフレームワークについて、調べたことを記載していきます。

![20130929131800.jpg](https://qiita-image-store.s3.amazonaws.com/0/36837/4e927f81-6643-1be8-2bac-e7d8b9709f5d.jpeg)


今回は、

- 速さの計測方法解説
- revelの概要
- Go言語の概要
- revelのインストール・実行までの手順

などについて記載します。


**※ ここで言っている「最速」とは、一秒間に何レスポンス返せるか、というような、ベンチマーク的な意味です。** 
**※ ここで言っている「フルスタックWebフレームワーク」とは、テンプレート、データベース補助、ルーティングなど、Web開発に必要になるメジャーな機能を一通り全部そろえたフレームワーク、という意味です。** 




#速さの計測方法
「revel」が最速だとする根拠ですが、TechEmpowerというWeb開発会社が公開しているベンチマークをもとに判断しました。

何種類か計測結果があるのですが、私が主に注目したのは以下の２つのテストです。
どちらも、EC2の m1.large を使っています。

##テスト１：Jsonシリアライズ
オブジェクトをJSONにシリアライズして
{"message":"Hello, World!"}
とレスポンスを行う一連の流れを、一秒間に何回出来るか計測しています。
http://www.techempower.com/benchmarks/#section=data-r8&hw=ec2&test=json&c=1

##テスト２：DB値の複数行取得とJsonシリアライズ
複数行検索されるSELECTクエリをを実行してデータを取得し、JSONにシリアライズしてレスポンスを行う一連の流れを、一秒間に何回出来るか計測しています。
http://www.techempower.com/benchmarks/#section=data-r8&hw=ec2&test=query&c=1

##詳しい計測条件
もっと詳しい条件は以下に記載されています。
http://www.techempower.com/benchmarks/#section=code&hw=ec2&test=json&c=1

計測したフレームワークについては下記に一覧があります。
http://www.techempower.com/benchmarks/#section=environment&hw=i7&test=json

また、計測に使ったソースコードはGithubに公開されています。
https://github.com/TechEmpower/FrameworkBenchmarks

#計測結果解説
どちらも実はrevelではなく、「gemini」というWebサーバーが1位になってますが、これは計測を行ったTeckEmpowerさんの社内フレームワークで、公開もされてないらしいので、ノーカンです。

実質、今回紹介する「revel」が現時点の「最速」フルスタックWebフレームワークだと言えるでしょう。

その速さは凄まじく、例えばJSONシリアライズのほうだと、最大で秒間21920回(!?)のレスポンスをさばけ、
他のフレームワークと比べると、例えば

- Ruby on Railsと比べると約25倍
- CakePHPだと80倍、
- コンパイル言語で出来たSpring Frameworkと比べても4倍

という、なかなか衝撃の結果になっています。


#revelはどんなフレームワークか
revelは、Go言語で作られたWebフレームワークです。開発もGo言語で行います。

↓本家
http://revel.github.io/

ホットリロードを備えているため、コンパイルのストレスなく開発でき、ルーティング、バリデーション、テンプレートエンジン、DB処理、テスト支援などの他、様々な機能を備えています。

サーバーや、プロジェクトの作成機能なども含めて全てセットになっており、

```
revel new myapp
revel run myapp
```

などとするとすぐひな形が作られ、動きます。

ちなみにJava、Scala界隈で最近人気のPlay Frameworkを参考にして作られており、機能も大体同じみたいです。

#Go言語とは
Google製の比較的最近できたプログラム言語です。

↓本家
http://golang.org/


- 非常にシンプルな言語で覚えやすく
- コンパイルも早く
- C言語並みの速度を持ち
- 同期処理が書きやすい

などの特徴があります。
速さと開発のしやすさの両立を目指してできた言語みたいですね。

色々とくせはありますが、確かにシンプルで覚えやすい言語な気はします。
まだ勉強したてですが。

ただ、開発にはEclipseのプラグインなどもありますが、まだまだ整備はされていない印象は受けます。

#Go言語のインストール
Macにインストールしました。

```
brew update
brew install go
brew install mercurial
↑go言語のライブラリで mercurialというのを使っているらしいのでいれる
```

vi .bash_profile
でエディタを開き

```
export GOROOT=`go env GOROOT`
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

を記載してパスを通す。
保存して再読み込み。

```
source .bash_profile
```

#revelのインストール

```
go get github.com/robfig/revel
↑revel本体のインストール
go get github.com/robfig/revel/revel
↑revelコマンドラインツールのインストール？
```

#revelのサンプルアプリ実行
設定したGOPATH(~/go)に、revelのサンプルアプリがダウンロードされているはずなので、
実行してみます。

```
cd $GOPATH/src
revel run github.com/robfig/revel/samples/booking
```

これで
http://localhost:9000/
にアクセスして
「revel framework booking demo」
などと表示されればOK。

#revelのアプリ新規作成
どうにも、アプリのソースは
$GOPATH/src
配下にしなければいけないらしいです。

ソースがかぶってしまわないように、適切なディレクトリを切る必要があります。
とりあえずこんな感じで作成して起動してみます。

```
cd $GOPATH/src
revel new github.com/myname/test/myapp
revel run github.com/myname/test/myapp
```

http://localhost:9000/
にアクセスして
「It Works」
などと表示されればOK。