Golang フレームワーク比較


| フレームワーク | ライセンス | アップデート頻度 | 学習しやすさ | 情報の多さ | 事例の多さ | star数  | ドキュメント生成機能 |
|:---------|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
| [Beego](https://beego.me/) ([GitHub](https://github.com/astaxie/beego)) | Apache-2.0 | ○ | ○ | ○ | × | 21906 | ○ |
| [Gin](https://gin-gonic.com) ([GitHub](https://github.com/gin-gonic/gin)) | MIT | ○ | ○ | ○ | ○ | 31238 | × |
| [Martini](https://github.com/go-martini/martini) ([GitHub](https://github.com/go-martini/martini)) | MIT | △ | ○ | △ | △ | 10688 | × |
| [Revel](http://revel.github.io/) ([GitHub](https://github.com/revel/revel)) | MIT | ○ | ○ | ○ | × | 10708 | × |
| [Echo](https://echo.labstack.com/) ([GitHub](https://github.com/labstack/echo)) | MIT | ○ | ○ | ○ | ○ |11322 | × |
| [Goa](https://goa.design/) ([GitHub](https://github.com/goadesign/goa)) | MIT | ○ | ○ | ○ | △ | 3537 | ○ |
| [Go kit](https://gokit.io/) ([GitHub](https://github.com/go-kit/kit)) | MIT | ○ | × | × | × | 14795 | × |
| [micro](https://micro.mu/) ([GitHub](https://github.com/micro/micro)) | Apache-2.0 | ○ | △ | × | × | 6741 | × |

アップデート頻度判断基準→githubのコミットログが直近にあるかどうか
学習のしやすさの判断基準→[学習のしやすさ調査](https://qiita.com/yumin/items/5de33b068ead564ebcbf#%E5%AD%A6%E7%BF%92%E3%81%AE%E3%81%97%E3%82%84%E3%81%99%E3%81%95%E8%AA%BF%E6%9F%BB%E5%88%A4%E6%96%AD%E5%9F%BA%E6%BA%96)
情報の多さの判断基準→ドキュメント充実かどうか、Qiitaなど記事を検索結果の多さ

## 学習のしやすさ調査：判断基準
- コードがぱっと見分かりやすいかどうか
- 公式ドキュメントが日本語対応か
- 公式ドキュメントが充実しているか
- 情報が多いかどうか

## 比較表

| framework | 分かりやすさ | 公式ドキュメント日本語対応 |公式ドキュメントが充実しているか | 情報の多さ |
|:-----------|------------:|:------------:|:------------:|:------------:|
| Beego(9) | △ | × | ○ | ○ |
| Gin(8) | △ | ○ | △ | ○ |
| Martini(8) | △ | ○ | △ | △ |
| Revel(8) | △ | × | △ | ○ |
| Echo(10) | ○ | × | ○ | ○ |
| goa(8) | △ | × | △ | ○ |
| goKit(5) | △ | × | × | × |
| goMicro(6) | △ | × | △ | × |

## 結果
1. Echo
1. Beego
1. Martini, Gin, Revel, goa
1. goMicro
1. goKit


## 特徴、気付いたこと
### Beego
フルスタックなWebアプリケーションフレームワーク。ORマッパーまでサポート。RubyのSinatraを元に設計されている。
### Gin
比較的軽量なフルスタックWebアプリケーションフレームワーク。マティーニと類似のAPIを提供している。
### Martini
モジュール形式のWebアプリケーションサービスフレームワーク。
### Revel
JavaのPlay Frameworkを参考に設計されたフルスタックフレームワーク。
### Echo
RESTAPI向けのため、RESTの原則に沿った形で設計されたAPIを持っている。Ginを超える程の高速処理。
### Goa
デザインコード(goa API Design Language) のファイルを作成するだけで、マイクロサービスのコアとなるファイルを生成してくれる。
### Go kit
独自のloadbalancerパッケージが担う、DNSやconsulなど様々なプラグインを追加可能。tracingパッケージを用いて、どの経由のリクエストで出力されたログなのか追いやすいみたい。
### micro
マイクロサービスのツールキットとして、各サーバ/サービスツールをそれぞれ分割して別々にパッケージされたもの。中核となるgo-micro、Webサービスを展開するためのgo-web、モニタリングツールのmonitor-web、サービスをトレースするためのtrace-web など、マイクロサービスを構築および運用するためのパッケージが揃っている。


## 速度比較
### 参考1
[Go Web Frameworks 比較 - Qiita](https://qiita.com/najeira/items/bdc988c4e93b3b5ccf2f)
[GitHub - najeira/go-frameworks-benchmark: benchmark for golang web frameworks](https://github.com/najeira/go-frameworks-benchmark)
<img width="548" alt="１.png" src="https://qiita-image-store.s3.amazonaws.com/0/190518/76b4fa8e-00c4-98e1-4de7-ae86ef3164b9.png">
<img width="539" alt="２.png" src="https://qiita-image-store.s3.amazonaws.com/0/190518/2db0bc13-6f06-ecb2-fc39-ce01134bc9e7.png">


### 参考2
[GitHub - julienschmidt/go-http-routing-benchmark: Go HTTP request router and web framework benchmark](https://github.com/julienschmidt/go-http-routing-benchmark)

### 参考3
[GitHub - smallnest/go-web-framework-benchmark: Go web framework benchmark](https://github.com/smallnest/go-web-framework-benchmark)
![３.png](https://qiita-image-store.s3.amazonaws.com/0/190518/8012e87a-1d00-08bd-c7db-72b62bf4e520.png)


### 参考4
[Round 14 results - TechEmpower Framework Benchmarks](https://www.techempower.com/benchmarks/)
[GitHub - TechEmpower/FrameworkBenchmarks: Source code for the framework benchmarking project](https://github.com/TechEmpower/FrameworkBenchmarks)

## 事例
### Gin
[GoでJWT認証するAPI Gatewayを作成する - Tech Blog - Recruit Lifestyle Engineer](http://engineer.recruit-lifestyle.co.jp/techblog/2015-12-02-go-api-gateway/)
[フレクトのクラウドblog(New): Go言語でトランザクション制御のラッパー関数を作った話](http://blog.flect.co.jp/cloud/2016/06/go-5c8f.html)
[GoでAPIサーバーの開発からデプロイまで - Qiita](https://qiita.com/oshiro/items/65d108e533a36c87a6da)

### Martini
[GAE/Go 事例紹介](http://goslides.knightso.co.jp/2015/gaego_case_opentransit.slide)

### Echo
~~[VoicyがGoLangとEchoを採択した理由。 - Voicy Tech Blog]~~
[APIにGolangを導入しました - Cluex Developersブログ](http://cluex-developers.hateblo.jp/entry/2017/04/28/230959)
[mofur x golang （前篇） (フェンリル | デベロッパーズブログ)](https://blog.fenrir-inc.com/jp/2016/07/mofur_golang_first_part.html)
[かけだし Gopher におくる Golang 製 Web Framework echo の logging について | Goodpatch Blog](http://goodpatch.com/blog/happy-logging/)

### goa
[アイスタイルにおけるgoa導入事例 / case studies of goa in istyle inc // Speaker Deck](https://speakerdeck.com/ginshari/case-studies-of-goa-in-istyle-inc)
[goaを導入した話 // Speaker Deck](https://speakerdeck.com/kyokomi/goawodao-ru-sitahua)

### フレームワークを使わない
[初めてGolangで大規模Microservicesを作り得た教訓](https://www.slideshare.net/yuichi1004/golangtokyo-6-in-japanese)
`教訓1 フレームワークに拘らない`
[GoでとあるAPIサーバを実装し直した話 - Mercari Engineering Blog](http://tech.mercari.com/entry/2016/12/19/180000)
最初は Revel で書かれていた → フレームワークを使わずに書き直した

## GitHub スター数の推移
<img width="852" alt="４.png" src="https://qiita-image-store.s3.amazonaws.com/0/190518/39e19d85-72a1-b891-b3a7-a8d79abcfa28.png">


## 参考
[Go言語おすすめフレームワークまとめ | IT/Web系の起業家・フリーランスに贈る、すべらない起業論](https://itpropartners.com/blog/9445/)

[継続的なAPI開発に。Goのマイクロサービスまとめ | NTT Communications Developer Portal](https://developer.ntt.com/ja/blog/1cb011ee-1293-492a-8a91-8cc7ec8e63f1)

[go言語でのマイクロサービスフレームワークの雑な比較メモ - Qiita](https://qiita.com/y_matsuwitter/items/2134a0f7ae97f9efd012)

[マイクロサービスのフレームワークまとめ \[不定期更新\](2017/02/25更新) - Qiita](https://qiita.com/hat22/items/3c9ad74d89166b7a72db#go)

[実例に学ぶGoのアーキテクチャ - 「開発スピード優先」でGMOペパボが採用したのはMVC]
(https://employment.en-japan.com/engineerhub/entry/2019/06/20/103000)

## その他
[Gunosy - 高速な広告配信サーバの作り方のコツ]
(https://www.slideshare.net/SatoshiSatoshi1/ss-63362495)
[ぐるなびにおけるGo言語の活用]
(https://developers.gnavi.co.jp/entry/golang-batch-tool-server)