Golang でのウェブ開発を考えてみる

  • 758
    いいね
  • 12
    コメント
この記事は最終更新日から1年以上が経過しています。

仕事で Golang を使ってウェブアプリを作ることになりそうなので、どんな構成がいいのか考えてみる。あくまで前提ありきの選択なので、何でもかんでも適用できるわけではない。

JS や静的ファイル部分は今のところ考慮していない。単によく知らないので。

突っ込み大歓迎です。これいいよ!とか教えてください

前提

  • 多機能なフレームワークよりシンプルなフレームワークに色々組み合わせる方法をとりたい。
  • 開発者は数名程度。Golang に精通している開発者が 1 名いる。残りはこれから。
    • 開発者は Django での開発経験が豊富な人が多い
  • 全員ウェブ開発経験はそれなりに積んでいる。
  • HTML と JSON 両方のパターンが存在するのでテンプレートエンジンは重要。
    • JSON API を返すだけではない
  • ORM は出来れば使っていきたい
  • AWS を想定
  • OS は Ubuntu 14.04 を想定

ライブラリ選定

Golang でのウェブアプリ作成を考えた場合、何がいいのかまず色々触ってみながら考える。

フレームワーク

全部入りなら Revel あたりか。何でもかんでも欲しいわけでは無いので小さい感じで考えていく。Martini か Gin だが、とりあえず Gin を選択。

ただ Gin は開発がそんなに活発な感じはしないので、ちょっと不安。活発さを取るなら Martini の方がいい。

Martini の次の世代の negroni ただあまりに低機能すぎる感じはする。

zenazn/goji · GitHub

コメント欄で goji というのを教えて貰った。"Goji is not magic" とてもよさそうだ。

これを触ってみることにする。

graceful shutdown/restart

コメント欄にて graceful restart をどうやるのかという話をいただいた。

goji には graceful というパッケージがあって、shutdown はちゃんとやってくれる模様。

graceful - GoDoc

なので、graceful restart はあきらめて、shutdown 後の start でいいかなと言うのが現状。何か追加することで簡単に graceful restart が出来るならそれでもいい。

この辺は supervisor がやるので気にはほとんどしていない。

と思ったら、graceful restart サポートしているライブラリを発見。

facebookgo/grace

これを使えば graceful restart 気軽にできそう。

リローダー

コード変更したらコンパイルして再起動してくれるツール。

https://github.com/pilu/fresh

Build and restart your Go web app with Fresh · by Andrea Franz

テンプレートエンジン

flosch/pongo2

JSON オンリーではないので、テンプレートエンジンが必要。今回は開発者のほとんどが Django に慣れ親しんでいる事もあり pongo2 を選択。他のテンプレートエンジンは検討していない。

Django 1.7 準拠なのは嬉しい。filters と tags は今後に期待。

pongo2 playground

ウェブで pongo2 が試せる。

ORM

GORMgorp 正直どちらがいいかを比較するのは後回しにして、身近に使っている人がいる GORM を使うことにした。

i18n

色々調べたが、いまいちぴんと来るものが無かったのでおそらく自作した方がいいのかもしれない。正直 i18n 周りはまったくわからないので、自分では判断出来ない。

fromYukki/pongo2trans

Pongo2 がらみでこんなのはあった。

設定ファイル

go-yaml/yaml at v1

YAML か HCL かの二択。YAML は使い慣れているというだけでよさそう。

hashicorp/hcl

HCL は HashiCorp が出した JSON 完全互換の設定ファイル。これも魅力的。

YAML は使っているとき不満がいくつかあったので、まずは HCL を使うことにする。ini でも YAML でもいいがバリデーション重要ってことで。

TOML

toml-lang/toml

コメント欄にて TOML というのを教えて貰った。 ini+ という感じ。ini 形式が好きな人は TOML は良い選択肢だと思う。ただ、設定ファイルは絶対バリデーションと連動していた方がいいので TOML より HCL という感じ。

Nginx + Golang

Benchmarking Nginx with Go

鵜呑みにするわけでは無いが普通に proxy_pass した方が効率良かったりするっぽい?

Nginx + Lua でごにょごにょやるというのも可能なのでまぁシンプルな方が嬉しい

セッション

普通に Golang のライブラリを使うか、 Nginx + Lua で管理してしまうかどちらか。まずは Golang で閉じる。余裕があれば Nginx + Lua に書き換える。

セッション情報自体は Redis に格納することにする。LB を使う可能性が高いので共有しないとしんどいので。

色々隠蔽してくれるのがあるようなので、まずはこれで問題なさそう。

RDB

MySQL か Postgres なのだが、チャレンジとして Postgres を使う。詳しい人が一人いるというのも採用の理由。

lib/pq

ドライバー部分で、特に問題になる感じはなさそうだ。

KVS

今回はセッションには Redis は使うがそれ以外はまだ未確定。キャッシュに Redis 使うかも程度。

Redis

garyburd/redigo

開発が活発でスターが多いということで選んだ。とおもったら redistore が使っていた。

テスト

"net/http/httptest" を使うだけでいいのか、それ以外がいいのか今はわからないので保留。

ただテストは欲しいので何かしら調べる必要がある。

assertgo/assert

エラー管理

Sentry を使いたいのでミドル部分で Sentry 対応必須か

Gin は Contrib で対応している模様 https://github.com/gin-gonic/contrib/blob/master/sentry/recovery.go

AWS 周り

Python でいう boto みたいな動作を期待。画像を S3 に上げるなどはあるはずなので。

goamz/goamz

ライセンスが LGPLv3 なのに注意。ただこれが安定してよさそう。

Elasticsearch

検索系は欲しくなるはずなので

mattbaird/elastigo

スターが多いので選んだ。

コマンドライン

運用や開発用の便利コマンドを作りたくなるはずなので。

codegangsta/cli

1 バイナリデプロイ

テンプレートや CSS や JS なども含めた 1 バイナリデプロイを実現したい。

go-bindata をうまく使うことになりそう。

参考

JSON 操作

XHR などで送られてくる JSON データを操作する場合、楽したい。きっちり定義するのでは無くてゆるふわな感じで使いたい時。

bitly/go-simplejson

いくつかあるようだが bitly が作っている go-simplejson が良さそうだ。

ChimeraCoder/gojson

参考

Goで簡単にJSON形式を扱うパッケージ: go-simplejson - Qiita

課金

WebPay: 開発者向けクレジットカード決済サービス を使用する予定。ただ WebPay 専用の Golang は用意されていない。

難しくは無いので時前で作ることになりそう。

参考

Golang: WebPay に決済リクエストを行う - Sarabande.jp

Golang と関係ない部分

デプロイ

Ansible を使う。サーバ環境は AWS の EC2 を使用する。

デプロイ通知

Ansible と Slack との連動をする

プロビジョニング

Ansible を使う。

AWS 環境構築

とりあえず手動の予定、がんばって Ansible 使うかも?程度。

プロセス管理

Supervisor/supervisor を使う。

Ubuntu 14.04 であれば apt-get で入るものを使えば良い。これに Golang のプロセスをぶら下げる。

サーバ監視

DatadogMackerel を検討中。ホスト数は一桁なので、そんなに多くないので DataDog でいいかな?と思ったりしている。

パフォーマンス監視

New Relic を使いたいが費用が厳しいので手が出ない可能性が高い。

自動ビルド

CircleCI を使う。

リポジトリ

GitHub Private を使用する

参考

ライブラリ