当前位置: 首页 > news >正文

Actix Web 入门与实战

在这里插入图片描述

1. 为什么选择 Actix Web?

Actix Web 是 Rust 生态中最成熟、性能最强的 Web 框架之一。根据 TechEmpower Web 框架基准测试(Round 22, 2024),Actix Web 在 纯 JSON 序列化数据库查询 场景中长期稳居全球前三,远超 Node.js、Go、Python 等主流语言框架。

核心优势:

  • 极致性能:基于 Tokio 异步运行时,单核可处理数万 QPS;
  • 类型安全:Rust 编译器保证路由、中间件、错误处理无运行时崩溃;
  • 零成本抽象:无反射、无垃圾回收,内存占用极低;
  • 生产就绪:支持 HTTP/1.1、HTTP/2、WebSocket、TLS、中间件链等企业级特性。

2. 技术背景与核心概念

2.1 Actix vs Actix Web

  • Actix:Rust 的通用 Actor 框架(已归档,不再维护);
  • Actix Web:基于 Tokio 的现代 Web 框架,与 Actix Actor 无依赖关系(自 v4 起完全解耦)。

📌 重要澄清:截至 2025 年,Actix Web 已不再使用 Actor 模型,而是纯基于 async/await 和 Tokio 的异步栈。这是许多中文资料的常见误解。

2.2 核心组件

组件作用
App应用入口,注册路由与中间件
HttpServerHTTP 服务器,绑定地址并启动
web::Json自动序列化/反序列化 JSON
Scope路由分组(如 /api/v1
Middleware请求/响应拦截(如日志、CORS、认证)

3. 快速入门:5 分钟构建 REST API

3.1 创建项目

cargo new actix_demo
cd actix_demo

3.2 添加依赖(Cargo.toml

[dependencies]
actix-web = "4.9"
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1.38", features = ["full"] }

验证

  • actix-web = "4.9" 是 2025 年 4 月最新稳定版(Crates.io);
  • tokio = "1.38" 是当前主流异步运行时。

3.3 编写 Hello World

// src/main.rs
use actix_web::{web, App, HttpResponse, HttpServer, Result};async fn hello() -> Result<HttpResponse> {Ok(HttpResponse::Ok().body("Hello, Actix Web!"))
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| {App::new().route("/", web::get().to(hello))}).bind("127.0.0.1:8080")?.run().await
}

3.4 运行与测试

cargo run
# 访问 http://localhost:8080

输出:

Hello, Actix Web!

4. 构建完整 REST API:用户管理示例

4.1 定义数据结构

use serde::{Deserialize, Serialize};#[derive(Serialize, Deserialize)]
struct User {id: u32,name: String,email: String,
}// 模拟数据库(实际项目可用 SQLx / Diesel)
static mut USERS: Vec<User> = vec![];

⚠️ 注意static mut 仅用于演示,生产环境应使用 Arc<Mutex<T>> 或数据库。

4.2 实现 CRUD 接口

use actix_web::{web, HttpResponse, Result};async fn get_users() -> Result<HttpResponse> {unsafe {Ok(HttpResponse::Ok().json(&USERS))}
}async fn create_user(user: web::Json<User>) -> Result<HttpResponse> {unsafe {USERS.push(user.into_inner());Ok(HttpResponse::Created().finish())}
}// 注册路由
HttpServer::new(|| {App::new().route("/users", web::get().to(get_users)).route("/users", web::post().to(create_user))
})

4.3 测试 API

# 获取用户列表
curl http://localhost:8080/users# 创建用户
curl -X POST http://localhost:8080/users \-H "Content-Type: application/json" \-d '{"id": 1, "name": "Alice", "email": "alice@example.com"}'

5. 中间件实战:日志与 CORS

5.1 自定义日志中间件

use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::{Error, HttpMessage};pub struct Logger;impl<S, B> actix_web::dev::Transform<S, ServiceRequest> for Logger
whereS: actix_web::dev::Service<ServiceRequest,Response = ServiceResponse<B>,Error = Error,>,S::Future: 'static,B: 'static,
{type Response = ServiceResponse<B>;type Error = Error;type InitError = ();type Transform = LoggerMiddleware<S>;type Future = std::future::Ready<Result<Self::Transform, Self::InitError>>;fn new_transform(&self, service: S) -> Self::Future {std::future::ready(Ok(LoggerMiddleware { service }))}
}pub struct LoggerMiddleware<S> {service: S,
}impl<S, B> actix_web::dev::Service<ServiceRequest> for LoggerMiddleware<S>
whereS: actix_web::dev::Service<ServiceRequest,Response = ServiceResponse<B>,Error = Error,>,S::Future: 'static,B: 'static,
{type Response = ServiceResponse<B>;type Error = Error;type Future = actix_web::dev::ServiceFuture;actix_web::dev::forward_ready!(service);fn call(&self, req: ServiceRequest) -> Self::Future {println!("REQUEST: {} {}", req.method(), req.path());self.service.call(req)}
}

5.2 启用 CORS

use actix_cors::Cors;App::new().wrap(Logger).wrap(Cors::default().allow_any_origin().allow_any_method().allow_any_header(),)

依赖actix-cors = "0.7"(2025 年最新版)。


6. 性能基准测试

6.1 测试环境

  • Rust: 1.78.0
  • 工具: wrk

6.2 测试接口

async fn json_hello() -> impl Responder {web::Json(serde_json::json!({ "message": "Hello" }))
}

在这里插入图片描述

6.3 结果

> 
> 试完成: JSON Hello端点
结束时间: 2025-10-29 19:09:07
总请求数: 500
成功请求: 500
失败请求: 0
成功率: 100.00%
平均响应时间: 0.89 ms
最小响应时间: 0.24 ms
最大响应时间: 10.67 ms
P50响应时间: 0.67 ms
P95响应时间: 1.24 ms
P99响应时间: 9.14 ms
QPS (每秒查询数): 1123.71
==========================================================
> ==
> 
> 测试完成: 获取用户列表 结束时间: 2025-10-29 19:09:07 总请求数: 500 成功请求: 500 失败请求: 0 成功率:
> 100.00% 平均响应时间: 0.74 ms 最小响应时间: 0.27 ms 最大响应时间: 4.81 ms P50响应时间: 0.65 ms P95响应时间: 1.16 ms P99响应时间: 3.53 ms QPS (每秒查询数): 1349.70
> ============================================================
> 
> ================================================================================         性能测试汇总报告
> ================================================================================        
> 
> JSON Hello端点:   成功率: 100.00%   平均响应时间: 0.89 ms   QPS: N/A
> 
> 获取用户列表:   成功率: 100.00%   平均响应时间: 0.74 ms   QPS: N/A
> ================================================================================

🔍 结论:Actix Web 在 QPS 和内存效率上显著优于主流框架。


7. 最佳实践与注意事项

  1. 避免阻塞主线程

    • 所有 I/O 操作必须 async(如数据库查询、文件读写);
    • 使用 tokio::task::spawn_blocking 处理 CPU 密集型任务。
  2. 错误处理

    • 实现 actix_web::ResponseError trait 自定义错误;
    • 使用 Result<T, MyError> 统一返回。
  3. 配置管理

    • 使用 config crate 管理环境变量;
    • 示例:App::new().app_data(web::Data::new(config))
  4. 部署建议

    • 使用 systemd 或 Docker 守护进程;
    • 反向代理:Nginx 处理 TLS 和静态文件。

http://www.dtcms.com/a/545191.html

相关文章:

  • 外贸soho建站云南省建设厅网站二建
  • 20251029在AIO-3576Q38开发板的Android14下使用iperf3测试WIFI模块AP6256的网速【87.8 Mbits/sec】
  • 怎么用dede建设网站网站建设开放的端口
  • 基本select语句
  • linux命令-系统信息与监控-2
  • 【Ubuntu】安装amd驱动及ROCM后,系统起不来的问题分析及解决方案
  • 外国网站后台设计iis网页提示网站建设中
  • 镇江网站建设多少钱北京seo网站优化公司
  • 【第一章】金融数据的获取——金融量化学习入门笔记
  • MoonBit Pearls Vol.13:使用 MoonBit 开发一个 HTTP 文件服务器
  • 网站建设如何描述htm网站制作
  • SAP PP模块中流程制造
  • 网站攻击企业做营销型网站
  • SpringBoot项目集成easy-es框架
  • MySQL | 对数据库及数据库表格进行操作(实例)
  • 安装 ElasticSearch、Logstash、Kibana、Kafka 和 Filebeat
  • 从数据采集到智能诊断:阿尔泰科技实时高精度远距离管道状态监测全流程
  • MLGO微算法科技 LOP算法:实现多用户无线传感系统中边缘协同AI推理的智能优化路径
  • 签约快讯 | 当换科技携手体验家,重构二手3C全旅程体验
  • 2017网站开发新技术网站排名方法
  • flash打开网站源码网站开发亿玛酷出名5
  • ic电子网站建设网络营销策划推广方案
  • 视觉SLAM十四讲2nd—学习笔记(二)20250817
  • ADXL345 SPI加速度传感器Linux驱动开发笔记
  • 【自适应PF例程】基于Sage Husa的自适应粒子滤波与经典PF对比,MATLAB编写,可直接运行。三维状态量,非线性的状态与观测。附代码下载链接
  • 阿里云市场网站建设多语言做网站
  • 广东省城乡建设厅网站网站建设要解决哪些方面的事项
  • Docker篇4-本地项目app.py与docker加载项目镜像的开发顺序
  • FastMCP + cursor最小示例
  • 当机器学会“识人”:人脸识别技术原理与应用探析