GoのWebアプリケーションフレームワーク
はじめに
ここまでGoの概要と、具体的なGoの記法についてご紹介しました。
3回目となる今回は、GoのWebアプリケーションフレームワーク(Web Application Framework、以後WAF)の中から代表的なものをいくつかご紹介し、さらにRevelというフルスタックなWAFをピックアップして、実際に動作する環境を作成します。
前回から引き続き、LinuxやMacでの作業を想定して記述していますので、Windowsやその他の環境の方は適宜ご自分の環境に置き換えて実行してください。
また、紹介しているすべてのフレームワークは、GitHubでOSSとして運用されています。最新の活動状況については、各プロジェクトのGitHubリポジトリをご参照ください。
GoのWAF紹介
RubyにおけるRuby on Rails、PythonにおけるDjangoのようなフルスタックなWAFは、Goにおいて主流とは言えない状況です。というのも、GoでフルスタックなWAFを利用することは、「シンプルな言語仕様」や「コンパイル速度への配慮」というGoの設計思想に反していると考える技術者が多いからです。
軽量なWAF
そのため、どちらかと言うと、「ルーティング」「デバッガ」「高機能なWebサーバ」「HTMLテンプレート」など、WAFの機能をその部分ごとにインポートして利用できる、軽量なフレームワークが主流になっています。代表的な2つをご紹介します。
Echo
https://github.com/labstack/echo
Echoは2015年に登場した新しいWAFであり、RESTful APIを作ることに向いています。登場直後から注目を集めており、Let's Encryptによる自動TLSや、Goのnet/httpに実装される以前からHTTP/2に対応しているなど、他のWAFにはない機能が多く、比較的開発も盛んです。
Gin(gin-gonic)
https://gin-gonic.github.io/gin
https://github.com/gin-gonic/gin
Goの初期から存在するWAFのMartiniを参考に、より高速に動作するように実装し、対Martini比で40倍以上の速度を実現したWAFです。ベンチマークツールとその結果は、Ginのプロジェクトページ内に公開されています。
日本での採用事例
EchoやGinのような軽量WAFは、他にもGojiやKamiなど数多く開発され、使われています。日本国内でも、株式会社エウレカではGojiを、株式会社GunosyではKamiの採用事例があるそうです。
Go言語製WAF GinでWebアプリを作ってみる【準備編】(MiyakoKitazato)
フルスタックWAF
前述のように、フルスタックなWAFは、Goではあまり主流でありません。しかし「ソースホットデプロイによるブラウザデバッグ」や「プロジェクトスケルトン作成」など、豊富な開発サポート機能によって手軽にWebサービスを作れる点は、特に初学者にとっては、学んだり作ったりするモチベーションに繋がると思います。そこで、フルスタックWAFについても2つご紹介します。
Beego
https://github.com/astaxie/beego
国内での採用事例はあまりありませんが、海外(主に中華圏)では次に紹介するのRevelと同様に人気のあるフルスタックなWAFです。残念なことに、公式の日本語ドキュメントはあまり頻繁にアップデートはされていないので、本格的に使用するためには英語版のドキュメントを読んだり、ソースを追ったりする必要があります。
Revel(レヴェル)
https://github.com/revel/revel
RailsやPlay Frameworkから影響を受けて作られた、Goの代表的なフルスタックWAFです。他言語でMVCフレームワークを使用されていた場合、親しみやすい作りになっていると思います。
インテリジェンスでの採用事例
私の所属している株式会社インテリジェンスでは、転職サービスMIIDASにおいて、運用スタッフが使用するシステム管理画面をRevelで構築しています(実サービス部分は、GoのWAFを利用せずに実装されたAPIと、HHVM上のFuelPHPで実装しています)。
「GoのフルスタックWAFを試してみたい」という理由で導入したのですが、「変更したファイルを自動的にビルドして実行してくれるホットリロード機能」「Webブラウザでエラー箇所の確認が可能」「ステートレスアーキテクチャである」など、PHPやRubyなど他言語のWAFと近い特徴があり、Goに慣れていない方でも手軽にWebサービスを開発したい、という場合にとても効果的です。
次回以降、Revelを使って実際に簡単なWebサービスを作っていきますので、今回説明したことを体感していただけると思います。
Revelのインストール
では、Revelを用いてWebアプリケーションを作る準備をしましょう。まず開発用のコマンドラインツールをインストールし、スケルトンを作成します(GoやRevelのバージョンによって、記事の内容と異なる場合があります)。
go get
$ go get -u github.com/revel/cmd/revel
ここで、初出のコマンド「go get」が出てきました。Goを使う上で必要になるコマンドなので、この機会に説明します。
「go get」は、環境変数GOPATHで指定したディレクトリに指定したパッケージをインストールするコマンドですが、その際に当該パッケージが依存しているパッケージも合わせてインストールします。「-u」オプションは、パッケージとその依存関係をネットワークを通じてアップデートするオプションです。
GOPATHに複数のディレクトリパスを記述している場合は、最初に記述されているディレクトリにインストールされます。
またGo 1.8からは、GOPATHが設定されていない場合のデフォルト値として「$HOME/go(Windowsでは%USERPROFILE%/go)」を利用するようになっています。以下の説明では、GOPATHにパスを1つだけ設定していることを想定して記述しています。
Goのgetサブコマンドについての解説は、「go help get」で確認できます。その他のサブコマンドについても、同様にhelpで表示することができます。
ビルド前のソースは「$GOPATH/src/」に配置され、ビルド済み実行バイナリは「$GOPATH/bin/」に格納されていますので、GOPATHに指定されている最初のディレクトリに実行パスを設定し、バイナリが実行できるようにすると良いでしょう。
パスが設定されている場合、Revelコマンドが正しくインストールされたかどうかは、以下のコマンドで確認できます。
$ revel version
その結果、以下のように表示されれば、コマンドラインツールがインストールされています。
~ ~ revel! http://revel.github.io ~ Version(s): Revel v0.16.0 (2017-06-06) go1.8.3 darwin/amd64
プロジェクトの作成
Revelのプロジェクトは、GOPATH内に作成しなくてはなりませんので、移動して実行します。下記の例では、GOPATHに「/usr/local/go」と設定してあるものとします。
$ cd $GOPATH $ revel new myapp
これで、「myapp」という名前のプロジェクトのスケルトンを作ってくれます。
~ ~ revel! http://revel.github.io ~ Your application is ready: /usr/local/go/src/myapp You can run it with: revel run myapp
上記の標準出力が行われて、スケルトンが作成されました。こういったフォルダ群が作成されます。
/usr/local/go/src/myapp/ ├── app │ ├── controllers │ │ └── app.go │ ├── init.go │ └── views │ ├── App │ │ └── Index.html │ ├── debug.html │ ├── errors │ │ ├── 404.html │ │ └── 500.html │ ├── flash.html │ ├── footer.html │ └── header.html ├── conf │ ├── app.conf │ └── routes ├── messages │ └── sample.en ├── public │ ├── css │ │ └── bootstrap-3.3.6.min.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── img │ │ └── favicon.png │ └── js │ ├── bootstrap-3.3.6.min.js │ └── jquery-2.2.4.min.js ├── README.md └── tests └── apptest.go
続いて、Revelを起動してみましょう。
$ revel run myapp
すると、デフォルトポートの9000番ポートを待ち受けるWebサーバが立ち上がります。Webブラウザのアドレスバーに「http://localhost:9000/」と入力して、実際にアクセスしてみましょう。
このように「It works!」と画面に出てきたら成功です。
簡単に動くようになりましたね! 次回からは、このプロジェクトをベースに、GoとRevelを使ったWebアプリケーションの作り方を学んでいきましょう。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- expressで開発したWebアプリをeXcaleで動かす
- Kubernetes上のアプリケーション開発を加速させるツール(2) Telepresence
- オフラインマルチ(ウイルス)スキャナ「Malice」「IRMA」を使ってみよう
- NGINX Ingress Controllerの柔軟なアプリケーション制御、具体的なユースケースと設定方法を理解する
- Ubuntuを使ったWebサーバ構築
- Go言語はじめの一歩
- APIを利用したownCloudの活用方法
- Webシステムの構成から、Pandora FMSによる監視設計を検討する
- Keycloakを用いたハードニングの実装方法
- クエリキャッシュとキャッシュの効果