Skip to content

Actix-web 与 Axum

高性能异步 Web 框架,基于 Actor 模型:

use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
#[get("/")]
async fn hello() -> impl Responder {
HttpResponse::Ok().body("Hello, Actix-web!")
}
#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {
HttpResponse::Ok().body(req_body)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(hello)
.service(echo)
})
.bind("127.0.0.1:8080")?
.run()
.await
}

特点:

  • TechEmpower 基准测试常年前列
  • 类型安全的路由与提取器
  • WebSocket 支持
  • 中间件生态完善

Tokio 团队官方 Web 框架,与 Tower 生态深度整合:

use axum::{routing::{get, post}, Json, Router};
use serde::{Deserialize, Serialize};
#[derive(Deserialize)]
struct CreateUser {
name: String,
email: String,
}
#[derive(Serialize)]
struct User {
id: u64,
name: String,
}
async fn create_user(Json(input): Json<CreateUser>) -> Json<User> {
let user = User { id: 1, name: input.name };
Json(user)
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(|| async { "Hello, Axum!" }))
.route("/users", post(create_user));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}

特点:

  • 提取器(Extractor)模式优雅
  • 与 Tower 中间件无缝集成
  • 由 Tokio 官方维护
  • 学习曲线比 Actix 更平缓
特性Actix-webAxum
性能极高
学习曲线中等较低
生态成熟快速成长
维护方社区Tokio 团队
适合高性能服务通用 Web 服务