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
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
420
Programming Viewing with Reserved Keywords
raiga0310
0
120
Echo_itself_by__.pdf
raiga0310
0
63
愛知県なんもないよね~www
raiga0310
0
58
クソコード鑑賞会
raiga0310
0
170
Other Decks in Technology
See All in Technology
toio・myCobotでフィジカルAIっぽいことを行うための検討(とりあえず調査) / フィジカルAI LT(IoTLTによる開催)
you
PRO
0
110
Claude Code並行開発環境の ムダ‧ムラ‧ムリを見直した話
muranakaaa
0
340
運用を犠牲にせずコストを制御し事業成長を支える B2B SaaS ID管理基盤におけるS3 Tableのログストレージ活用
kaminashi
1
110
QAと開発の両側から進める AI活用 -QAプロセスAI支援ツールキットと Inner Loop / Outer Loopの取り組み-
legalontechnologies
PRO
2
380
信頼できるテスティングAIをどう育てるか?
odan611
0
170
ウォーターフォール開発案件のPMとしてAI活用を模索している話
hatahata021
2
220
AIエージェントに財布を渡す日 ― 承認付き"買い物エージェント"を作って実演
yama3133
0
110
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
570
AWS環境のセキュリティ不安を解消した企業事例 ~よくある課題と対策を一挙公開~
asanoharuki
0
250
データ組織の転換期 一足飛びしない段階的戦略
leveragestech
PRO
0
120
AI研修(Day2)【MIXI 26新卒技術研修】
mixi_engineers
PRO
2
1.5k
VPCセキュリティ対応の最新事情
nagisa53
2
350
Featured
See All Featured
Faster Mobile Websites
deanohume
310
32k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
400
Being A Developer After 40
akosma
91
590k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
930
How to build a perfect <img>
jonoalderson
1
5.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Designing Experiences People Love
moore
143
24k
Designing Powerful Visuals for Engaging Learning
tmiket
1
470
Why Our Code Smells
bkeepers
PRO
340
58k
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はよくプログラムにおいて総合的な処 理部分という認識で扱われる 記事とかでも~~するハンドラみたいな言い方する意識高い系はおおい(は?)