GoのWebアプリケーションフレームワーク

2017年7月5日(水)
吉元 裕人[監修]上田 拓也
連載3回目となる今回は、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://echo.labstack.com/

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)

神に近づくx/net/context(guregu)

フルスタックWAF

前述のように、フルスタックなWAFは、Goではあまり主流でありません。しかし「ソースホットデプロイによるブラウザデバッグ」や「プロジェクトスケルトン作成」など、豊富な開発サポート機能によって手軽にWebサービスを作れる点は、特に初学者にとっては、学んだり作ったりするモチベーションに繋がると思います。そこで、フルスタックWAFについても2つご紹介します。

Beego

https://beego.me/

https://github.com/astaxie/beego

国内での採用事例はあまりありませんが、海外(主に中華圏)では次に紹介するのRevelと同様に人気のあるフルスタックなWAFです。残念なことに、公式の日本語ドキュメントはあまり頻繁にアップデートはされていないので、本格的に使用するためには英語版のドキュメントを読んだり、ソースを追ったりする必要があります。

Revel(レヴェル)

https://revel.github.io/

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

リスト1: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コマンドが正しくインストールされたかどうかは、以下のコマンドで確認できます。

リスト2:Revelコマンドのインストール確認

$ revel version

その結果、以下のように表示されれば、コマンドラインツールがインストールされています。

リスト3:Revelのバージョンが表示されればOK

~
~ 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」と設定してあるものとします。

リスト4:プロジェクトの作成

$ cd $GOPATH
$ revel new myapp

これで、「myapp」という名前のプロジェクトのスケルトンを作ってくれます。

リスト5:プロジェクトのスケルトンが作られた

~
~ revel! http://revel.github.io
~
Your application is ready:
   /usr/local/go/src/myapp

You can run it with:
   revel run myapp

上記の標準出力が行われて、スケルトンが作成されました。こういったフォルダ群が作成されます。

リスト6:作成されたファイルとフォルダ

/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を起動してみましょう。

リスト7:Revelを起動!

$ revel run myapp

すると、デフォルトポートの9000番ポートを待ち受けるWebサーバが立ち上がります。Webブラウザのアドレスバーに「http://localhost:9000/」と入力して、実際にアクセスしてみましょう。

It works!

It works!

このように「It works!」と画面に出てきたら成功です。

簡単に動くようになりましたね! 次回からは、このプロジェクトをベースに、GoとRevelを使ったWebアプリケーションの作り方を学んでいきましょう。

パーソルキャリア株式会社

鹿児島県生まれ。2015年に株式会社インテリジェンス(現パーソルキャリア株式会社)に入社。

サーバサイドエンジニア兼インフラエンジニアとして、転職サービス『MIIDAS』で日々Goでの開発を行っている。

趣味はホビー系アニメ鑑賞と音楽制作。最近は欅坂46の米谷奈々未さんに熱を上げている。

著者
[監修]上田 拓也

@tenntenn
メルカリ・ソウゾウ所属。サーバサイドエンジニアとして日々Goを書いている。 GoConference主催者。golang.tokyo、Goビギナーズ、GCPUG運営スタッフ。海外カンファレンスでも多数登壇経験あり。大学時代にGoに出会い、それ以来のめり込む。 社内外で自ら勉強会を開催し、Goの普及に取り組んでいる。マスコットのGopherの絵を描くのも好き。

連載バックナンバー

開発言語
第3回

GoのWebアプリケーションフレームワーク

2017/7/5
連載3回目となる今回は、Go言語の代表的なWebアプリケーションフレームワークを紹介する。
開発言語技術解説
第2回

Goの基本的な文法を学ぼう

2016/11/29
2つの簡単なプログラムの作成を通じて、Go言語の特徴的な文法を学んでいく。
開発言語技術解説
第1回

Go言語はじめの一歩

2016/11/17
さまざまな分野で事例が増えつつあるGo言語、まずは簡単なサンプルブログラムを書いてみる。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています