📌
Rust 主要 Web フレームワーク比較
概要
- Rust を Web サービスのバックエンドとして使用するうえで、Web Framework の比較をしてみる。
- 以下リポジトリに Rust の Web Framework を比較しているので参考にしつつ調査する。
- 今回は比較的に人気である axum / actix-web / Rocket に絞る
axum
- 非常に型安全でありながら使いやすい設計を持つ、非同期 Rust の Web。
- Tokio 非同期ランタイムに基づいて構築されており、非同期 Rust のエコシステムと密接に統合されている。
- 型安全なルーティング、リクエストの検証、依存関係の注入など、モダンな Web 開発のための機能を提供している。
use axum::{
routing::get,
Router,
};
use std::net::SocketAddr;
async fn hello_world() -> &'static str {
"Hello, world!"
}
#[tokio::main]
async fn main() {
// ルーターの構築
let app = Router::new().route("/", get(hello_world));
// アドレスの設定
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
println!("Listening on {}", addr);
// サーバーの起動
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
pros
- 非常に型安全であり、エラーはコンパイル時にキャッチされやすい。
- Tokio との統合により、非常に高いパフォーマンスと並行性を実現。
- 比較的新しいため、モダンな Rust の機能を積極的に取り入れている。
cons
- バージョン 1 未満なので破壊的変更が入る可能性あり
actix-web
- 高性能を重視した Web フレームワークで、Actor モデルに基づいた設計を採用している。
- 高いカスタマイズ性と拡張性を持ち、小規模なマイクロサービスから大規模なアプリケーションまで幅広い用途に対応している。
use actix_web::{web, App, HttpResponse, HttpServer, Responder};
async fn hello() -> impl Responder {
HttpResponse::Ok().body("Hello, world!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
// アドレスの設定
HttpServer::new(|| {
App::new()
.route("/", web::get().to(hello))
})
.bind("127.0.0.1:3000")?
.run()
.await
}
pros
- 非常に柔軟で拡張性が高く、多くのミドルウェアやプラグインが利用可能。
- 広範囲なドキュメントとコミュニティのサポートがある。
cons
- Actor モデル難しい
Rocket
- Rocket は使いやすさと安全性を重視した Web フレームワークで、Rust の型安全性を最大限に活用している。
- 宣言的なルーティングと便利なマクロを利用して、簡潔で理解しやすいコードを書くことができる。
#[macro_use] extern crate rocket;
#[get("/")]
fn hello() -> &'static str {
"Hello, world!"
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![hello])
}
pros
- 型安全性と使いやすさに重点を置いており、Rust の初心者でも扱いやすい設計になっている。
cons
- Rocket の構造は比較的厳格で、特定のパターンに従う必要があるため高度なカスタマイズを求める場合には適さない。
- 基本は Stable Rust で動作するが、Nightly が必要な場合もある。
結論
axum が良さげなので axum 使ってみようかな
Discussion