GO言語のWAFを大雑把に比較してみた【Gin、Goa、net/http、gorrila/mux、Echo】

こんにちは、

 

最近Go言語でWebサーバを書く機会がありフレームワークをいろいろ試してみていたので触ってみた所感を共有したいと思います。

 

Webサーバとは言ってもフルスタックなWAFではなく、軽量なREST API向けのフレームワークを求めている方向けです。

 

結論から言うとEchoを採用しました。選定理由は、

 

  • 記述すべきコードが最も少なくなりそう
  • ミドルウェアやルーティングの挙動が求めている仕様

だったからです。

 

速度や性能ではなく、個人的なコードの書きやすさやなんとなくいい感じの挙動を元に比較します。

 

それでは順を追って比較していきます。

 

Gin

 

golangで軽量で早いWAFとして有名なGinです。

 

日本語の情報も多くドキュメントやミドルウェアも整理されており、大抵のことは簡単に実現できます。

 

ただし、今回気になったのは下記の点

 

  • ルーティング部分にhttprouterを採用しているがこれの挙動がいまいち

 

そもそもGinが他のフレームワークに比べて早いとされているのはrouting部分に正規表現を利用しておらず軽量なライブラリを採用しているから・・・・らしいのですが、この挙動がイマイチです。

 

例えば下記のようなURLを独立してルーティングすることができません。

 

GET /users/:ID

GET /users/:ID/friends

 

これだとREST APIの実装を行うのに困ります。まあルーティング部分を差し替えれば使えないこともないですが、なんとなくださいのでボツ。

 

上記の問題はhttprouterのissueに上がってたのにずっとメンテされていないのイマイチですし、それに依存し続けるのもどうなのって感じなので・・・。

 

それ以外の点ではすごくコード書きやすいライブラリだなと思いますが今回は不採用。

 

Goa

 

独自のDSLAPIのデザインを記述すると、SwaggerのAPI定義とテンプレートコードを自動生成してくれる神ツール。

 

yamlでswagger書くより数段使いやすいよおおおおおと感動の声を上げましたが、現在v2への移行中&ドキュメント少なくいろいろ機能を実現しようとしてうまく行かなかったためボツ。

 

あと自動生成されるよくわからんコードがたくさんあるってのも個人的にどうなのって気がしたので・・・。でも面白いので一度触ってみることは大変オススメです。

 

net/http

 

とここまで検討して来て、もうライブラリいらないんじゃね?男は硬派にnet/httpじゃ!、と公式のライブラリを利用してみました。

 

  • 認証やCORSなどのミドルウェアをきれいに設定する方法がなくて自分でコード書いて整備する必要がある
  • ルーティングが貧弱

 

前者に関してはまあ書けばいいのですが、そういうコード書きたくないからフレームワークの検討をしているわけで・・・。

 

また後者については他のライブラリを導入して実装するのが定番のようです。

 

gorrila/mux

 

net/httpと組み合わせて使うルーティング向けのライブラリ。使い勝手はよくてかなり定番のツールのようでしたが、結局その他の部分はフレームワーク相当のコードをnet/httpに追加しなければきれいにならないという点は共通だったのでボツ。

 

Echo

 

最後に試したのがこちら、非常にシンプルなフレームワークです。

 

APIはGinに似ています。しかし、EchoではGinで気になったルーティングの問題が存在しません

 

その他に目立って困る部分もなかったので採用することにしました。

 

最後に

 

ざっと触ってみた所感だと完全な定番WAFというのは存在しなさそう。今回は一番無駄なくコードをかけそうだったのでEchoを採用しました。

 

 

でも、開発しながらデプロイ環境を選定する弾になって、GCPのGAEを利用することになり、

 

シンプルなREST APIだけ書くならGAEにnet/httpで書くのが一番ラクだったのではないか・・・と思ったのはここだけの話

 

次回はGAEについてはまった点まとめようと思います。