actix-web开发环境搭建
actix web的开发环境搭建
1. 本章目标
- 引入actix相关依赖
- 创建一个入门示例
- 理解原理
2. 核心概念
概念 | 含义 | 示例 |
---|---|---|
async/await | 异步函数机制 | async fn run() |
Future | 表示一个异步计算 | impl Future<Output=T> |
tokio runtime | 异步运行时调度器 | #[tokio::main] |
理解重点:Rust 的异步模型基于“协作式调度”,不是抢占式线程。
3. 代码实践
目录结构
.
├── Cargo.lock
├── Cargo.toml
├── doc
└── src└── main.rs # 应用程序入口
引入依赖
在cargo.toml文件下引入actix-web相关的依赖
[dependencies]
actix-web = "4.11.0"
tokio = { version = "1.47.1",features = ["macros", "rt-multi-thread"]}
- actix-web是一个高性能的异步web框架
- tokio提供异步运行时
rt-multi-thread
启用多线程执行器macros
启用相关的过程宏(如#[tokio::main]
)
代码实现
创建应用程序的入口
use actix_web::{web, App, HttpResponse, HttpServer, Responder};async fn hello()->impl Responder {HttpResponse::Ok().finish()
}#[tokio::main]
async fn main()->std::io::Result<()> {HttpServer::new(||App::new().route("/hello", web::get().to(hello))).bind("127.0.0.1:8000")?.run().await
}
代码分析
main函数
#[tokio::main]
async fn main()->std::io::Result<()>
在Rust中,只有异步函数可以调用异步函数,因此需要给函数添加
async
代表它是异步,而main函数比较特殊(不能将main设置为异步),所以只能用过程宏了
由于H
ttpServer::new(/*...*/).bind(/*...*/)
返回成功Ok(())
,或者返回Err(std::io::Error)
代表失败,因此main函数需要返回值Result<()>
,这里错误类型的声明可以省略,就使用默认(std::io::Error
)
HttpServer
HttpServer::new(||{...}).bind()?.run().await
- 通过
HttpServer::new()
创建一个HttpServer
实例,这个方法接受一个闭包作为输入,需要注意的是: 这个闭包必须返回一个App
(|| -> App
)- 可以调用
bind
方法配置这个HttpServer
实例的Ip和端口- 调用
run
方法返回一个Server
future,此时服务器还没真正启动(不能监听和处理请求)await
会等待Server
的完成,而Server
不会完成,但通过Ctrl-C
等强制退出(服务器停止)
App
App::new().route("/hello", /*Router*/)
- App::new函数创建一个新的App实例
- 调用route方法,它接受两个参数,第一个是定义了请求的路径,第二个接受一个Route实例,不能直接使用函数
- 通过
web::get().to(hello)
获取一个Route
,接受一个异步函数,这个函数的返回值是impl Responder
的,HttpResponder
实现了Responder trait
,因此可以将返回值定义为HttpResponder