Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How do you design Web API in Golang?

How do you design Web API in Golang?

Gopher道場#1 LT大会での発表資料です。

itosho

May 28, 2018
Tweet

More Decks by itosho

Other Decks in Programming

Transcript

  1. How do you design Web API in Golang? Gopher Dojo#1,

    MAY 28 2018 Sho Ito Connehito Inc. @itosho
  2. 自己紹介 How do you design Web API in Golang? •

    伊藤 翔, @itosho ◦ 所属: コネヒト株式会社 / Supership株式会社 • 普段はバックエンドエンジニア ◦ よく書く言語: PHP / Ruby • 個人でいくつかサービスつくっています ◦ https://itosho.github.io/ • 野球とアイドルが好きです⚾
  3. Gopher道場で学べてよかったこと How do you design Web API in Golang? •

    CLIツールの基礎 • Goにおけるユニットテストの考え方 • 実践的なgoroutineの知識 • contextパッケージの使い方 • Goっぽい書き方 / Goの学び方
  4. 今日話すこと How do you design Web API in Golang? •

    GoにおけるWeb API開発で3大よく分かっていないこと ◦ 雰囲気で現状はこうしてるという話をします • 懇親会等でみなさんの知見や意見を聞きたい ◦ スライド公開するのでソーシャル上でも意見もらえると嬉しいです
  5. 前提 How do you design Web API in Golang? •

    インディー開発 • 規模は小さい ◦ エンドポイント数:17 ◦ テーブル数:10 ◦ 単一リソースに対するCRUD処理がほとんど • インフラはVPS • データベースはMySQL
  6. 選択肢 How do you design Web API in Golang? •

    GORM • genmai • 標準パッケージ(database/sql) ◦ 他にも色々あるけど触ったことがあるのは上記3つ
  7. 現状 How do you design Web API in Golang? •

    GORMを使っている ◦ 初心者に database/sql はちょっと気が重い ◦ Rails上がりなのでとっつきやすい ◦ ドキュメントが充実している(情報もgenmaiより多い)
  8. ここがよく分からない How do you design Web API in Golang? •

    うまく言語化出来てないけど、あんまりGoっぽくない ◦ 既にスキーマ管理は別でやってる • 複雑なことをすると辛そう • datetime型の扱いが面倒 ◦ 参考: 「Golangのgormで、カスタマイズしたtime.Timeに差し変える」 ▪ https://qiita.com/roothybrid7/items/52623bedb45ff0c26a8a • genmaiのほうがバランスいいかも? ◦ ただ、genmaiはタグの使い方が他と違うような気がする • 最終的には database/sql or GAE/Datastore?
  9. 現状 How do you design Web API in Golang? MVCライクな構成

    server: →Railsで言うコントローラ model: →構造体定義, 1テーブル1ファイル database: →db接続(後述) / スキーマ管理 assets: →静的ファイルを格納 main.go: →ルーティングとHTTPハンドラ定義 ※go-json-restを利用
  10. database/database.go How do you design Web API in Golang? var

    DB *gorm.DB // main.goでInitDBを呼び出す // database.DB.First(&user, id).Error のような形で利用 func InitDB() { var err error user := os.Getenv("MYSQL_USER") pass := os.Getenv("MYSQL_PASSWORD") parameter := "charset=utf8&parseTime=True&loc=Asia%2FTokyo" DB, err = gorm.Open("mysql", user+":"+pass+"@/hoge?"+parameter) // 省略 }
  11. ここがよく分からない How do you design Web API in Golang? •

    database接続変数がグローバル変数なのはしょうがない? • 今後server / modelパッケージが肥大化していった時はどうすれば? ◦ ググるとDDDライクな例をよくみるけど…? ▪ 自分のサービスだと若干オーバースペックに感じる
  12. 現状 How do you design Web API in Golang? Nginx

    MySQL Golang Supervisor client • nginxを前段に置いている • Supervisorを利用して、デーモン化している • 静的ファイルは http.FileServer を利用して配信 • デプロイはバイナリをアップロードするだけ static files
  13. main.go How do you design Web API in Golang? func

    main() { // 省略 l, err := net.Listen("tcp", ":8080") if err != nil { return } http.Handle("/v1/", http.StripPrefix("/v1", api.MakeHandler())) http.Handle("/assets/", http.StripPrefix("/assets", http.FileServer(http.Dir("./assets")))) fcgi.Serve(l, nil) }
  14. ここがよく分からない How do you design Web API in Golang? •

    静的ファイルの配信方法 ◦ ぶっちゃけS3を利用したほうが楽そう • デーモン化はSupervisorを利用する以外に便利な方法があるのか? • nginx + goのベストプラクティス ◦ 参考: 「Nginx with Goのパフォーマンスを検証した」 ▪ http://tsuyoshi-nakamura.hatenablog.com/entry/2016/12/25/182946 • GAEにすればORM含めて色々解決する説