Posted at
Go3Day 7

概観からGoのWebFrameworkを選ぶ(2016/02)から1年半・・・

More than 1 year has passed since last update.


結論 is Revel

Go WebFrameworkでググると一番上に出ちゃいますね、結局続きかけてな記事でお恥ずかしい・・・

概観からGoのWebFrameworkを選ぶ(2016/02)

この記事から2年弱。結局今どういう状況かと、どう変化したかを書きます。


そもそも

小さなwebサービスの開発をGoで書きました。エンジニア3名くらい、週末や空いた時間を使って気軽にやっていました。みんなバックグラウンドが違うしハーフコミットだったので、好きに書いてました。


結論 is Revel is 特に問題ない

良かった点は

- RailsっぽいアーキテクチャとGoの厳しいルールが程よい

- サンプルがわかりやすい

- アップデートが頻繁

正直、そんなパフォーマンス要求されるサイトでもなかったので、ただ書きやすくて誰でもすぐコード書けそうな状況を作れれば良かったので、WebFrameworkの前提知識がメンバー内でそれなりにあって余裕があるならフルスタックなフレームワークで良かったと思います。

それでも紆余曲折はありました。


  • gorm か gorp?

  • structの使い方に悩む

  • パッケージ管理でinstallでよくビルド失敗 gom -> glide -> dep

  • go version管理でデプロイ失敗


- goの環境作るの面倒問題

etc...etc...

見てわかると思うんですが、正直Goじゃなくてそれを取り巻く

開発環境・ツール・インフラに実はツラミがありました。


開発環境

最初

- goenv

- gom

- go ver1.5.3

- revel ver0.15.0



- vagrant

- gvm

- dep

- go ver1.7

- revel ver0.18.0

です。revelが先日の2017-10-30に最新版が出て、As of Revel 0.15.0, Go 1.6+ is required になり、revel自体をパッケージ管理してないと、 go getするたびに最新版が入ってくる(tag/branch/commit指定とかできない)ので、goのバージョンあげないといけないんですよね・・・

revelのパッケージ管理もdepが推奨されるようになっているので、こちらも対応が必要でした。

「Macですぐ環境つくれたほうがいいし、goenvでローカルを汚さないようにしとけばええやろ!」とか甘いこと考えてたんですが、GO言語の1.6.3より前のバージョンを使っている人は MacOS Sierraにアップグレードしないほうがいい話とかあってですね。「そもそもMacでGo書くな」という啓示がありまして、諦めてVagrantで環境を用意しました。

Ansibleで最初デプロイとかをしていたので、これを作ることは容易でした。

revelのバージョンが上がったり、goのバージョンが変わったりで結構面倒なので、その度に別のVMを立てて検証してました。


デプロイ

Revel Deployment

- Build the app locally and copy it to the server.

- On the server, pull the updated code, build it, and run it.
- Use Heroku to manage deployment.

というのが書かれています。うちはさくらのVPSでサーバ管理しているので、特にいい手段もなく最初はAnsibleでデプロイしてました。

よくビルドで(特にgomで)コケていたので、面倒だったので、CircleCIに変更しました。

ただCircleCIでgoの環境作ってビルドすると結構重かったので、ビルド用のサーバ用意してそこでビルド、生成されたバイナリを本番にscpするというので解決してました。冗長だけどいいのです、1バイナリデプロイ(笑)です。

AWSだとBOXFUSEというサービスが、唯一サポートしているようです。

日本じゃあまり聞かないサービスですね。


それで今だとどうなのか?

201602

Framework
Star
リポジトリ見ての印象

Revel
6,337
サンプル・モージュール・クーロンもプロモページもあっていい感じ

beego
6,234
Sinatraを参考にしているのでさくっとAPI作るのには良さそう、Auto API documentsが気になる

Gin
5,425
すごく早いらしい、martiniの40倍早いらしい

martini
8,178
一番人気、名前もいいね。唯一日本語ドキュメントがある

goji
2,947
シンプル(小並感)

echo
2,976
Ginよりさらに早い。まだ若い感じする

201712

Framework
Star
リポジトリ見ての印象

Revel
9,137(+2,800)
あんま伸びてないけど、最近もアップデートしたしちゃんとGoの最新機能を使っている印象

beego
13,198(+6,964)
説明ページも動画あったりリッチ、APIサーバを作るには良さげ

Gin
13,361(+7,936)
一番伸びたな、やっぱ一番早いからかな。

martini
9,795(+1,617)
あの頃の大人気martiniがあんま伸びてない、2014年から更新されてないしな・・・

goji
3,344(+397)
これも更新ない

echo
8,831(+5,855)
v3.2.5まで来ているw、issueとプルリクたくさん上がっている。レビューしきれてなさそう

iris
8,361(new)
良さある、ベンチ早い

ということで、そこまでRevel伸びてないし、star数と更新頻度で見ればRevel/beego/Ginのどれかな気がしますね。webアプリケーション作るならRevel、APIサーバ作るならGin、はじめてGo触る人が多ければbeegoがいいかも。

いまだにWebでなんのフレームワーク使ってGoを触るかがもやもやしているので、この辺いい知見がある方がいればシェアいただければ幸いです。 :pray: