Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
make HTTP server with Axum, Rust
Search
ライガー
August 04, 2023
Technology
150
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
make HTTP server with Axum, Rust
ライガー
August 04, 2023
More Decks by ライガー
See All by ライガー
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
520
Programming Viewing with Reserved Keywords
raiga0310
0
130
Echo_itself_by__.pdf
raiga0310
0
66
愛知県なんもないよね~www
raiga0310
0
61
クソコード鑑賞会
raiga0310
0
180
Other Decks in Technology
See All in Technology
Snowflakeのコスト最適化を支えるアーキテクチャ設計
ktatsuya
1
1.5k
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
140
事業課題から技術的負債に向き合う
sansantech
PRO
1
530
Tab5をRubyで動くパソコンにする
kishima
2
360
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
280
ペアプロの価値はコードを書くことだけじゃない
codmoninc
PRO
0
210
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
0
350
なぜJMBC(Japan MCP Business Community)? MCPってどう活用できるの?
cdataj
0
110
Reactの設計論
uhyo
17
8.9k
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
130
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
4
540
2026-09-10 【Snowflake World Tour Tokyo 2026】dbt Core と Snowflake で実現する多層的なデータガバナンス / Multi-Layered Data Governance Powered by dbt Core and Snowflake
civitaspo
0
360
Featured
See All Featured
A Soul's Torment
seathinner
7
3.6k
Into the Great Unknown - MozCon
thekraken
41
2.7k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
The Language of Interfaces
destraynor
162
27k
Crafting Experiences
bethany
1
330
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
330
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
850
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
450
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Transcript
AxumでHTTPサーバ作った 限界LT #int(pi) Speaker: JapaneSe Obaka Notation
Table of Contents • 事故紹介 • 前提 • つくったもの •
api-shower: the origin • ここがんばったポイント ◦ 状態共有ありのハンドラの実装 ◦ SSE用のAPIの実装 • 話のオチ
自己紹介 • ライガー(JapaneSe Obaka Notation) • 𝕏: @ahoxa1rx • Github:
raiga0310 • ぽーとふぉりお: https://raiga0310.github.io • B3 • Like: Rust TS • フロントは苦手意識
前提 • 誤解を招く表現を使っているかもしれない(正しく理解しているとは言えないので) • ❌何もしらない人向け ❌上級者向け 🔴初心者→中級者向け くらいのテンション • 7月中旬くらいのほぼ最新のバージョン使ってる
最新版は知らん
つくったもの • https://github.com/raiga0310/api-shower • https://github.com/raiga0310/front-shower • 寮に住んでる兄がシャワーの空きが知りたいとぼやいていたのでなんとなくで作っ た • (dyn
要件)
動作画面 • シンプルなデザイン() • フィルタ機能付き • おいそこ表の空欄表示してるなとか言うな
構成 • バックエンド ◦ Rust + Axum: APIサーバ ◦ PostgreSQL:
DB • フロントエンド ◦ JS + Svelte ▪ pnpm + Vite • インフラ ◦ Nginx: ルーティング管理 ゆくゆくはHTTPS対応とか見越して ◦ Docker: バックエンドをまとめるやつ • DevOps(?) ◦ Github Actions: 正直ぐちゃぐちゃなので直したい (チェックに10分はごみ) ◦ Codecov: おまえなに
構成その2 レポジトリパターンみたいなやつ MVCっぽくもなってる(フロントは別で)
APIエンドポイント的な話 GET /{...filter}/showerroomsで特定の区画の施設の空き状況がわかるよ PATCH /{...filter}/showerroomsで特定の区画の空き状況を更新するよ 他にも実装してるけど使う側に取ってはこのくらいで十分かなって(あとはコード読んで)
通信の流れ
api-shower: the origin もともとTodoアプリの実装から発想を得ているのでアーキテクチャやら設計はかなりシ ンプル レポジトリパターンみたいなやつ 少しバージョンは古いので要注意 大体の機能はそのまま使えるはず https://github.com/AkifumiSato/learn-rust-with-web-application
ここ頑張ったポイント: 型引数ありの状態共有ハンドラ 記事読んで(ダイマ) https://qiita.com/raiga0310/items/889b4cb6e3226d2f1358
ふわっと説明 Axumのミドルウェアへの追加をする DBとのやり取りのためのデータへのアクセスを許可するためのwith_state() (旧バー ジョンはレイヤー追加だった) ハンドラの引数の順番は決まっているので気をつけよう
ここ頑張ったポイント: SSE用のAPIの実装 記事読んで(大胆な天丼は乙女の特権) https://qiita.com/raiga0310/items/f3793dbb29c7bd069b8c
ふわっと説明 DB更新をもとにユーザーに変更が通知されなければならない クライアントからの定期リロード → 通信の無駄が多い WebSocketなどの双方向通信プロトコル → 実装面倒(プロトコル変わるし) あと単方向 でいい
⇒Server Sents Eventを使いました(tokioは神) 付記: actix-webだとExperimental(actix-web-lab)にSSEハンドラが実装されてる
具体的なコード: ルーティング
具体的なコード: ハンドラ(GET)
具体的なコード: DB更新
具体的なコード:SSE struct Event
具体的なコード: SSE 更新+通知部分
苦痛に耐えられぬとき、読むとよい • https://docs.rs/axum/0.6.19/axum/ • https://github.com/tokio-rs/axum/tree/v0.6.x • https://developer.mozilla.org/ja/docs/Web/HTTP • https://developer.mozilla.org/ja/docs/Web/API/Server-sent_events/Using_serv er-sent_events
• https://developer.mozilla.org/ja/docs/Web/API/Server-sent_events https://www.pixiv.net/artworks/78785573
話のオチ てっきり各階に複数個シャワールームあるんじゃないかとか勝手に思って設計した →「寮で男子5室女子3室だぞ」 やるならちゃんと、要件を聞こうね!!(京都への旅費をふんだくりました)
説明パート‐API • Application Interface Programmingの略 • ソフトウェアとユーザー以外のなにかのつなぐ仲介者 • フロントとバック(DB)をつなぐのもAPIだし •
WebAPIというと、HTTP通信やらのデータのやり取りがおおい多分 • HTTP/1.1 GET /hello とかなんとか書かれてるやつ(は?) • ブラウザの窓のURLもAPIを叩いている(GET)
説明パート‐HTTP • OSI参照モデルの一番上での通信 を担当 • HyperTextTranferProtocol • HTTP ( Hypertext
Transfer Protocol )は、分散型の協 調 的なハイパーテキスト情報システム用の, ステートレスな アプリケーションレベルのプロトコルである (RFC 7231(訳)) • Web系API大体これ使ってる (ド偏見) • 最近は新しいバージョンとかもあるらしいけど、旧タイプの 人間なので1.1を使います
説明パート‐HTTP リクエスト・レスポンスについて • インターネット通信にはリクエストとレスポン スがある(要求と返信) • それぞれヘッダがありメタ情報が格納されて いる(メタ情報:データに付随する情報) • ブラウザでは開発者モード(firefoxだと
Ctrl+Shift+I)のnetworkタブで確認可能
HTTPメソッド HTTP通信における振る舞いの事 GET/POST/PATCH/PUT/DELETE/...大体ひつようなものは揃っている 別に全部GETでもできることはできると思うけど、ちゃんと特化仕様になってるからしたい こととHTTPメソッドは統一しような
説明パート‐*エンド*系について 日本人的にはエンドって終わりだけのイメージがある なぜかプログラミングの文脈ではよく端点くらいの解釈で扱われる用語 例: フロントエンド、バックエンド: いわずもがな、データの流れの端点(終わりがフロント、 始まりがバック) APIエンドポイント : これ僕よくわかってない(おい)
叩く場所がこれなんだと思う
CRUD データの扱いに対する作成、取得、更新、削除(Create/Read/Update/Delete)の頭文字 を取ったもの シンプルなデータの扱いであればこの管理を定義するのが楽 HTTPメソッドではある程度表現できる 操作 HTTPメソッド Create POST Read
GET Update PUT、PATCH Delete DELETE
説明パート-MVCパターン やることを分離したときのパターンの一つ。 データを保持するModel データやレスポンスの情報を表示するView リクエストに対する適切な処理をするController の3つで構成される。伝統的な分離モデル
説明パート‐xDD Driven Developmentの略DDD(Domein-DD)、TDD(Test‐DD)とか、何を基準に開発す るのかということ 僕の好みはTDDとCDD(Compile‐DD)
説明パート-CI/CD 継続的インテグレーション・継続的デプロイ ソフトウェアの品質の維持やデプロイ・ローンチの自動化のやつ できるとだいぶ楽 GithubはこのCI/CDをActionsとかで提供しているPRにかませると助かることが多い
二人の環境差異をなくす Docker 任意のマシンで動かせるように実行環境自体を一つのコンテナとして提供するサービス DockerのあるOSであればDockerで動くものはなんでも動かせる 複数のサービスをComposeなどでまとめて動かせる(大規模だとkubernetes(k8s)とか を使う) (人はDockerがインストールできないのが唯一の欠点 )
VSCode拡張機能 ThunderClient HTTP通信を試したいときに便利 insomniaとかみたくPCにインストー ルしないので楽
Rustパート‐Cargoとかそこら辺 • Cargo 色々やってくれる テスト、フォーマット、ビルド、実行、ドキュメント作成、クレート の公開 • Clippy したほうがいいことを提示してくれる •
sqlx RustにおけるDBマイグレーションをサポート
Rustパート:構造体、メソッド ひとまとめにしたいデータをまとめるためのもの それぞれの変数はメンバとか言われてる(OOの文脈) メソッドは`impl Hoge`の中に
Rustパート-ジェネリクス 複数の型を受け入れるようにするための仕組み 便利なデータ構造体とかをいろんな型で使えるよう にしたいとか(再利用性) `<T>`で記す
Rustパート-トレイト 違う型や構造体へ共通の振る舞いを提供した いときの機能 このトレイトのお陰で、「特定のメソッドをもつ」 型という曖昧な引数を関数に取ることができる
Rustパート‐トレイトを満たす引数 処理中に一定の動作が任意の型に必 要な場合、それをトレイトに抽出して書 くとコードがシンプルになる
Rustパート-Result エラーの処理を扱う(エラーハンドリング) I/Oとかの失敗するやつに囲っておくと 、Ok(T)とかErr (成功時、失敗時)が返る こまったらunwrap()しとこうね・・・・・・(<ーこいつは火炙りにかけたほうがいい)
クレート、モジュール Rustのライブラリ系の名称 色々書き方はあるが、性質が似ているものとか、そこで扱う便利な関数群をまとめておく
Rustパート‐tokio Rustのサードパーティ()の非同期ランタイムを提供するクレート もう非同期ならぜんぶこいつでいいだろ いろんなI/O使うクレートはtokio依存なことが多い 便利だからね
Rustパート-Axum RustにおけるWebバックエンドフレームワーク (感想)機能ごとにまとめるのが楽なイメージ、Actix-webは理論上散らかしてもいいのが ちょっと不安要素かなって ルーターにレイヤーを重ねることで認証や状態共有などのミドルウェアのサポートとかが できる
説明パート‐実装 ハンドラ handleが扱うみたいな意味があるので、handlerはよくプログラムにおいて総合的な処 理部分という認識で扱われる 記事とかでも~~するハンドラみたいな言い方する意識高い系はおおい(は?)