Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
How do you design Web API in Golang?
Search
itosho
May 28, 2018
Programming
770
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
How do you design Web API in Golang?
Gopher道場#1 LT大会での発表資料です。
itosho
May 28, 2018
More Decks by itosho
See All by itosho
【2025年版】インターネットサービスの育て方 / How to Grow and Scale Internet Services 2025
itosho
0
250
Windsurf Rulesでどう自分のクローンをつくるか / How can I make a clone of myself in Windsurf Rules
itosho
0
140
Text EditorとしてのWindsurf / Windsurf as a Text Editor
itosho
0
360
【2024年版】インターネットサービスの育て方 / How to Grow and Scale Internet Services
itosho
0
120
打線組という個人サービスを Goで開発している話 / Indie Service Development by Go
itosho
1
210
Components Reconsidered
itosho
1
2.4k
打線組を支える技術 / The Technology Behind Dasengumi
itosho
0
75
組織をスケールさせるためのTech Vision / Connehito Tech Vision for Growing Our Team
itosho
2
710
生きのびるためのインディー開発 / Indie Development to Survive
itosho
0
68
Other Decks in Programming
See All in Programming
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
170
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
210
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
320
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
880
What's New in Android 2026
veronikapj
0
260
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.2k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
180
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
340
Cloudflare is Agents
chimame
0
160
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
160
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.3k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
400
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
360
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Claude Code のすすめ
schroneko
67
230k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Navigating Weather and Climate Data
rabernat
0
470
The Spectacular Lies of Maps
axbom
PRO
1
900
My Coaching Mixtape
mlcsv
0
210
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
Transcript
How do you design Web API in Golang? Gopher Dojo#1,
MAY 28 2018 Sho Ito Connehito Inc. @itosho
自己紹介 How do you design Web API in Golang? •
伊藤 翔, @itosho ◦ 所属: コネヒト株式会社 / Supership株式会社 • 普段はバックエンドエンジニア ◦ よく書く言語: PHP / Ruby • 個人でいくつかサービスつくっています ◦ https://itosho.github.io/ • 野球とアイドルが好きです⚾
Gopher道場で学べてよかったこと How do you design Web API in Golang? •
CLIツールの基礎 • Goにおけるユニットテストの考え方 • 実践的なgoroutineの知識 • contextパッケージの使い方 • Goっぽい書き方 / Goの学び方
控えめに言って最高! ありがとうございました! 感想
もっと知りたい! 欲張りですいません! でも…
今日話すこと How do you design Web API in Golang? •
GoにおけるWeb API開発で3大よく分かっていないこと ◦ 雰囲気で現状はこうしてるという話をします • 懇親会等でみなさんの知見や意見を聞きたい ◦ スライド公開するのでソーシャル上でも意見もらえると嬉しいです
前提 How do you design Web API in Golang? •
インディー開発 • 規模は小さい ◦ エンドポイント数:17 ◦ テーブル数:10 ◦ 単一リソースに対するCRUD処理がほとんど • インフラはVPS • データベースはMySQL
その1: ORMライブラリ
選択肢 How do you design Web API in Golang? •
GORM • genmai • 標準パッケージ(database/sql) ◦ 他にも色々あるけど触ったことがあるのは上記3つ
現状 How do you design Web API in Golang? •
GORMを使っている ◦ 初心者に database/sql はちょっと気が重い ◦ Rails上がりなのでとっつきやすい ◦ ドキュメントが充実している(情報もgenmaiより多い)
ここがよく分からない 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?
その2: パッケージ構成
現状 How do you design Web API in Golang? MVCライクな構成
server: →Railsで言うコントローラ model: →構造体定義, 1テーブル1ファイル database: →db接続(後述) / スキーマ管理 assets: →静的ファイルを格納 main.go: →ルーティングとHTTPハンドラ定義 ※go-json-restを利用
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) // 省略 }
ここがよく分からない How do you design Web API in Golang? •
database接続変数がグローバル変数なのはしょうがない? • 今後server / modelパッケージが肥大化していった時はどうすれば? ◦ ググるとDDDライクな例をよくみるけど…? ▪ 自分のサービスだと若干オーバースペックに感じる
その3: インフラ環境
現状 How do you design Web API in Golang? Nginx
MySQL Golang Supervisor client • nginxを前段に置いている • Supervisorを利用して、デーモン化している • 静的ファイルは http.FileServer を利用して配信 • デプロイはバイナリをアップロードするだけ static files
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) }
ここがよく分からない 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含めて色々解決する説
みなさんの意見を聞かせてください! まとめ
ご清聴ありがとうございました