2023 年值得關(guān)注的六個(gè) Rust Web開(kāi)發(fā)框架
在 2023 年,在開(kāi)始開(kāi)發(fā) API 和 Web 應(yīng)用程序之前,哪個(gè) Rust Web 框架最適合研究?在這里,我們將看看一些目前使用或看起來(lái)很有前途的最流行的框架。
Web 框架 (WF) 或 Web 應(yīng)用程序框架 (WAF) 是一種軟件框架,旨在支持 Web 應(yīng)用程序的開(kāi)發(fā),包括 Web 服務(wù)、Web 資源、微服務(wù)和 Web API。Web 框架提供了一種在網(wǎng)上構(gòu)建和部署 Web 應(yīng)用程序的標(biāo)準(zhǔn)方法。Web 框架旨在自動(dòng)化與 Web 開(kāi)發(fā)中執(zhí)行的常見(jiàn)活動(dòng)相關(guān)的開(kāi)銷。
例如,許多 Web 框架提供用于數(shù)據(jù)庫(kù)訪問(wèn)、模板框架(HTML、JSON 等)和會(huì)話管理的庫(kù),并且它們經(jīng)常促進(jìn)代碼重用。雖然它們通常針對(duì)動(dòng)態(tài)網(wǎng)站的開(kāi)發(fā),但它們也適用于靜態(tài)網(wǎng)站。
Rust 是一種編程語(yǔ)言,為 Web 開(kāi)發(fā)提供了巨大的潛力。它快速、安全,并為構(gòu)建 Web 應(yīng)用程序提供了許多完美的功能。以下是一些最佳框架及其開(kāi)發(fā)需要考慮的功能。
Hyper
Hyper 仍在開(kāi)發(fā)中,可能會(huì)在 2023 年穩(wěn)定發(fā)布。但是 Hyper 看起來(lái)像是一個(gè)有前途的框架,可以在 2023 年探索,然后再?zèng)Q定在 Rust 中構(gòu)建一個(gè) Web 應(yīng)用程序。
Hyper 計(jì)劃在 2023 年 1 月底發(fā)布穩(wěn)定的 1.0 版本。如果您想了解有關(guān)遷移到穩(wěn)定版 1.0 的更多信息,請(qǐng)關(guān)注這里
hyper 是一個(gè)用 Rust 編寫的快速 HTTP 實(shí)現(xiàn)。Hyper 可以用作:
- 用于與 Web 服務(wù)通信的客戶端。
- 用于構(gòu)建這些 Web 服務(wù)的服務(wù)器。
- 極快的響應(yīng)速度
- 具有高并發(fā)性和非阻塞套接字。
- 支持 HTTP/1 和 HTTP/2。
use std::{convert::Infallible, net::SocketAddr, error::Error};
use http_body_util::Full;
use hyper::{Request, Response, body::Bytes, service::service_fn};
use hyper::server::conn::http1;
use tokio::net::TcpListener;
async fn hello(
_: Request<hyper::body::Incoming>,
) -> Result<Response<Full<Bytes>>, Infallible> {
Ok(Response::new(Full::new(Bytes::from("Hello World!"))))
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
let listener = TcpListener::bind(addr).await?;
loop {
let (stream, _) = listener.accept().await?;
tokio::task::spawn(async move {
if let Err(err) = http1::Builder::new()
.serve_connection(stream, service_fn(hello))
.await
{
println!("Error serving connection: {:?}", err);
}
});
}
}
任何使用 rust API 框架的開(kāi)發(fā)人員都需要了解 Hyper。它具有許多功能,并且易于使用。文檔也是一流的,是新開(kāi)發(fā)人員的最佳的學(xué)習(xí)資源。
Actix-web
Actix Web 是一個(gè)強(qiáng)大、實(shí)用且速度極快的 Rust Web 框架。Actix Web 基于 Rust Actor Model。它是一個(gè)用 Rust 編寫的高性能 Web 框架,具有一組用于構(gòu)建 Web 應(yīng)用程序的強(qiáng)大功能。Actix Web 是類型安全的,功能豐富,可擴(kuò)展和極快的。
它的活動(dòng)網(wǎng)絡(luò)
- 支持多路復(fù)用
- 異步 I/O
- 網(wǎng)絡(luò)套接字
- 中間件支持
以下是編寫響應(yīng) Hello World 的網(wǎng)頁(yè)的方法:
use actix_web::{get, web, App, HttpRequest, HttpServer, Responder};
#[get("/")]
async fn index(\_req: HttpRequest) -> impl Responder {
"Hello from the index page."
}
async fn hello(path: web::Path<String>) -> impl Responder {
format!("Hello World {}!", &path)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(index)
.route("/{name}", web::get().to(hello))
})
.bind(("127.0.0.1", 8080))?
.run()
.await
}
運(yùn)行 cargo run 就可以啟動(dòng)服務(wù)器,然后在瀏覽器中查看效果。
Rocket
Rocket 是 Rust 的一個(gè) Web 框架,它讓編寫 Web 應(yīng)用程序變得非常簡(jiǎn)單和快速,并且它不會(huì)犧牲靈活性和類型安全,它無(wú)樣板、且擴(kuò)展易于使用。
Rocket 的哲學(xué)是讓您以最少的配置啟動(dòng)和運(yùn)行。它與 Rust 生態(tài)系統(tǒng)緊密集成,集成現(xiàn)有的庫(kù)和工具非常容易。
下面是在 url 部署的頁(yè)面示例,該頁(yè)面采用 JSON 有效負(fù)載并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中。
以下是網(wǎng)頁(yè)實(shí)現(xiàn)的示例:PUT /:id
#[derive(Serialize, Deserialize)]
struct Message<'r> {
contents: &'r str,
}
#[put("/<id>", data = "<msg>")]
fn update(db: &Db, id: Id, msg: Json<Message<'_>>) -> Value {
if db.contains_key(&id) {
db.insert(id, msg.contents);
json!({ "status": "ok" })
} else {
json!({ "status": "error" })
}
}
Rocket 支持模板,擁有專題手冊(cè),支持異步流開(kāi)箱即用。
Tide
Tide 是一個(gè)基于 Rust 構(gòu)建的最小且實(shí)用的 Web 應(yīng)用程序框架。Tide 是為快速 Web 開(kāi)發(fā)而構(gòu)建的。Tide 帶有一組強(qiáng)大的內(nèi)置功能,可以輕松構(gòu)建異步 Web 應(yīng)用程序和 API。Tide 基于 rust actix Web 框架。
Tide 是功能豐富的 Web 框架。Tide 正在積極開(kāi)發(fā)中,并擁有廣泛的社區(qū)資源,可讓您快速啟動(dòng)和運(yùn)行
Tide 框架具有以下功能,可幫助快速構(gòu)建應(yīng)用程序
- 異步/等待支持
- 類型安全路由
- 請(qǐng)求守衛(wèi)
- 模板支持
- 會(huì)話管理
- 網(wǎng)絡(luò)套接字支持
- 讓我們看一下使用 HTTP POST 謂詞實(shí)現(xiàn)端點(diǎn)的示例
use tide::Request;
use tide::prelude::*;
#[derive(Debug, Deserialize)]
struct Animal {
name: String,
legs: u16,
}
#[async_std::main]
async fn main() -> tide::Result<()> {
let mut app = tide::new();
app.at("/orders/shoes").post(order_shoes);
app.listen("127.0.0.1:8080").await?;
Ok(())
}
async fn order_shoes(mut req: Request<()>) -> tide::Result {
let Animal { name, legs } = req.body_json().await?;
Ok(format!("Hello, {}! I've put in an order for {} shoes", name, legs).into())
}
現(xiàn)在,您可以使用 curl 訪問(wèn)具有 api /orders/shoes
curl localhost:8080/orders/shoes -d '{ "name": "Pankaj", "legs": 9 }'
這將響應(yīng)預(yù)期的消息 Hello, Pankaj! I've put in an order for 9 shoes
Warp
Warp 是一個(gè)超級(jí)簡(jiǎn)單、可組合的 Web 服務(wù)器框架,基于 Rust 構(gòu)建,用于提高速度。Warp 突出的構(gòu)建塊是 Filter,它可以組合和組合以表達(dá)對(duì)請(qǐng)求的豐富需求。
得益于其過(guò)濾系統(tǒng),warp 提供開(kāi)箱即用的功能:
- 路徑路由和參數(shù)提取
- 標(biāo)頭要求和提取
- 查詢字符串反序列化
- JSON 和表單正文
- 多部分表單數(shù)據(jù)
- 靜態(tài)文件和目錄
- 網(wǎng)絡(luò)套接字
- 訪問(wèn)日志記錄
- Gzip、Deflate 和 Brotli 壓縮
- 服務(wù)器發(fā)送的事件 (SSE)
由于它建立在 hyper 和 Tokio - 一個(gè)異步 Rust 運(yùn)行時(shí)之上,因此您可以自動(dòng)獲得:
- HTTP/1 和 HTTP/2 支持
- 異步功能
- 最快的 HTTP 實(shí)現(xiàn)之一
- 經(jīng)過(guò)測(cè)試和正確
下面是一個(gè)使用 Warp 的簡(jiǎn)單 Hello, world 示例:
//main.rs
use warp::Filter;
#[tokio::main]
async fn main() {
// GET /hello/warp => 200 OK with body "Hello, warp!"
let hello = warp::path!("hello" / String)
.map(|name| format!("Hello, {}!", name));
warp::serve(hello)
.run(([127, 0, 0, 1], 3030))
.await;
}
Axum
Axum Web 框架旨在高效,快速和輕量級(jí)。Axum 的靈感來(lái)自 Erlang 編程語(yǔ)言,為開(kāi)發(fā)人員提供了高效的并發(fā)性,非常適合開(kāi)發(fā)實(shí)時(shí) Web 應(yīng)用程序、微服務(wù)和低延遲系統(tǒng)。Axum 是一個(gè)專注于人體工程學(xué)和模塊化的 Web 應(yīng)用程序框架。
要使用 Axum,您需要 Rust 版本 v1.6 或更高版本
Axum 的功能包括:
- 使用無(wú)宏 API 將請(qǐng)求路由到處理程序。
- 使用提取程序以聲明方式分析請(qǐng)求。
- 簡(jiǎn)單且可預(yù)測(cè)的錯(cuò)誤處理模型。
- 使用最少的樣板生成響應(yīng)。
- 充分利用中間件、服務(wù)和 tower-http。
- 支持 WebSocket 和其他協(xié)議
- 異步 I/O
use actix_web::{web, App, Responder};
fn index() -> impl Responder {
"Hello, world!"
}
fn main() {
App::new().route("/", web::get().to(index)).run();
}
上面列出的框架只是 2023 年值得關(guān)注的一些 rust Web 應(yīng)用程序框架。它們都具有不同的設(shè)計(jì)能力。你嘗試測(cè)試它們并根據(jù)您的要求使用它們。