往期回顧
- Rust 實戰二 | 開發簡易版命令行工具 grep
- Rust 實戰一 | 用 RustRover 開發猜數字游戲
- Rust 安裝與版本更新
代碼開源地址:https://github.com/0604hx/rust-journey
🚀 Web 框架
名稱 | 性能(QPS) | WebSocket / SSE | GitHub ? | 最新版本發布日期 | 備注說明 |
---|---|---|---|---|---|
Actix Web | 極高(wrk 單線程 QPS > 100k) | ? 內建支持 | ~23.5k | 2025?07?01 | 超高性能,適合高并發場景,actor 架構。 |
Axum | 很高(QPS > 200k,Tower 架構) | ? via 插件 / 自定義支持 | ~22.5k | 2025?06?10 | 類型安全,異步友好,生態活躍。 |
Warp | 較高(QPS > 200k) | ? warp_ws 插件 | ~9.9k | 2024?12?12 | 聲明式路由,組合靈活。 |
Poem | 較高(接近 Warp 性能) | ? 內建支持(含 SSE) | ~4.1k | 2025-07-28 | 支持 OpenAPI、GraphQL 等,功能豐富。 |
Salvo | 中等(社區基準 QPS 偏低) | ? 內建支持 | ~3.8k | 2025?07?19 | 中文文檔豐富,易上手,適合中小項目。 |
Rocket | 偏低(QPS < 160k,默認同步) | ? via tokio / 插件 | ~25.3k | 2024?05?24 | 簡潔語法,適合原型開發和教學。 |
Tide | 中低(QPS ~127k,高并發性能下降明顯) | ? via tide-websockets 插件 | ~5.1k | 約 2021?01(v0.16) | async-std 驅動,輕量框架,適合入門學習。 |
Hyper | 極高 | ? 原生無 | ~15.4k | 2025?06?28 | 低級 HTTP 庫,不是完整框架 |
📝 說明:
- 數據截至 2025-07
- 性能數據 來自社區 wrk 基準測試及 Rust Web Framework Benchmarks 等;
- WebSocket / SSE 支持 體現了原生或插件支持情況;
- GitHub 收藏數 為近似值,僅供參考;
- 最新版本發布日期 體現維護活躍度,Tide 暫無 1.0 穩定版。
Tokio
上述框架,好幾個都是基于 tokio ,接下來我們了解下這個牛逼的庫👍
在 Rust 的異步編程領域,Tokio 是一個核心基礎設施,被眾多 Web 框架(如 Axum、Actix、Warp 等)廣泛采用。它是 Rust 生態中最流行的異步運行時,提供了高性能的異步任務調度、I/O 操作和網絡編程能力。
Tokio 是什么?
Tokio 是 Rust 的異步運行時庫,相當于異步程序的操作系統
,主要提供以下功能:
- 任務調度器:高效管理數百萬個異步任務
- 非阻塞 I/O:文件、網絡等操作的異步實現
- 工具庫:包括定時器、信號處理、同步原語等
- 網絡協議:內置 TCP、UDP、Unix Domain Socket 支持
為什么需要 Tokio?
Rust 的異步編程基于 Future 模型,需要運行時來驅動 Future 的執行。Tokio 提供了這個運行時環境,讓開發者可以:
- 編寫高效的異步代碼,避免阻塞線程
- 處理海量并發連接(C10M 問題)
- 利用 Rust 的所有權系統保證異步代碼的安全性
核心組件
1. 異步任務執行器(Executor)
use tokio::task;#[tokio::main] // 啟動 Tokio 運行時
async fn main() {// 創建異步任務let handle = task::spawn(async {println!("異步任務正在執行");42});// 等待任務完成let result = handle.await.unwrap();println!("任務結果: {}", result);
}
Tokio 在 Web 框架中的應用
許多 Rust Web 框架選擇 Tokio 作為底層運行時,因為:
- 高性能:Tokio 的任務調度器和 I/O 系統經過高度優化
- 生態豐富:大量異步庫(如數據庫驅動、HTTP 客戶端)基于 Tokio 開發
- 穩定性:作為 Rust 異步生態的基石,Tokio 經過了嚴格測試和改進
🌏 HTTP 服務開發
salvo/國貨之光
之所以放在第一位,純粹是因為她是國產的 Web 框架,必須支持下😄
#![allow(unused_braces)]use std::time::{SystemTime, UNIX_EPOCH};
use salvo::{handler, Listener, Router, Server};
use salvo::prelude::TcpListener;#[handler]
async fn time()->String { format!("now is {}", SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()) }#[tokio::main]
async fn main() {let acceptor = TcpListener::new("0.0.0.0:8080").bind().await;let router = Router::new().get(time);println!("salvo web running on port 8080 ...");Server::new(acceptor).serve(router).await;
}
Actix Web/高性能
use std::time::{SystemTime, UNIX_EPOCH};
use actix_web::{get, App, HttpServer};#[get("/")]
async fn time()->String { format!("[actix-web] now is {}", SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()) }#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| App::new().service(time)).bind(("127.0.0.1", 8082))?.run().await
}
Axum/高性能新生代
use std::time::{SystemTime, UNIX_EPOCH};
use axum::Router;
use axum::routing::get;async fn time()->String { format!("[axum] now is {}", SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()) }#[tokio::main]
async fn main() {let app = Router::new().route("/", get(time));let listener = tokio::net::TcpListener::bind("0.0.0.0:8081").await.unwrap();println!("axum web running on port 8081 ...");axum::serve(listener, app).await.unwrap();
}
Rocket/簡單易用
use std::time::{SystemTime, UNIX_EPOCH};#[macro_use] extern crate rocket;#[get("/")]
async fn time()->String { format!("[rocket] now is {}", SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()) }#[launch]
fn rocket() -> _ {rocket::build().mount("/", routes![time])
}
實際運行對比
綜合來看,個人覺得 axum
確實很優秀👍。
??cargo 多二進制(multi-bin)結構
在項目的 src/bin
目錄下放多個 Rust 文件,每個文件都可以有自己的 main 函數,cargo 會把它們當作獨立的二進制程序編譯。
示例結構:
my-project/
├── Cargo.toml
└── src/├── main.rs ← 默認的 main└── bin/├── task1.rs ← 一個 main 函數└── task2.rs ← 另一個 main 函數
編譯和運行:
cargo run --bin task1
cargo run --bin task2
為什么需要
我在rust-journey項目中,子模塊j03_web
是本文相關的代碼,希望在該模塊內演示多個 Web 框架的基礎使用,于是就想有多個 main
入口程序。