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

Rust 实战三 | HTTP 服务开发及 Web 框架推荐

封面

往期回顾

  • Rust 实战一 | 用 RustRover 开发猜数字游戏
  • Rust 安装与版本更新

代码开源地址:https://github.com/0604hx/rust-journey


🚀 Web 框架

名称性能(QPS)WebSocket / SSEGitHub ⭐最新版本发布日期备注说明
Actix Web极高(wrk 单线程 QPS > 100k)✅ 内建支持~23.5k2025‑07‑01超高性能,适合高并发场景,actor 架构。
Axum很高(QPS > 200k,Tower 架构)✅ via 插件 / 自定义支持~22.5k2025‑06‑10类型安全,异步友好,生态活跃。
Warp较高(QPS > 200k)✅ warp_ws 插件~9.9k2024‑12‑12声明式路由,组合灵活。
Poem较高(接近 Warp 性能)✅ 内建支持(含 SSE)~4.1k2025-07-28支持 OpenAPI、GraphQL 等,功能丰富。
Salvo中等(社区基准 QPS 偏低)✅ 内建支持~3.8k2025‑07‑19中文文档丰富,易上手,适合中小项目。
Rocket偏低(QPS < 160k,默认同步)✅ via tokio / 插件~25.3k2024‑05‑24简洁语法,适合原型开发和教学。
Tide中低(QPS ~127k,高并发性能下降明显)✅ via tide-websockets 插件~5.1k约 2021‑01(v0.16)async-std 驱动,轻量框架,适合入门学习。
Hyper极高❌ 原生无~15.4k2025‑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 的异步运行时库,相当于异步程序的操作系统,主要提供以下功能:

  1. 任务调度器:高效管理数百万个异步任务
  2. 非阻塞 I/O:文件、网络等操作的异步实现
  3. 工具库:包括定时器、信号处理、同步原语等
  4. 网络协议:内置 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 作为底层运行时,因为:

  1. 高性能:Tokio 的任务调度器和 I/O 系统经过高度优化
  2. 生态丰富:大量异步库(如数据库驱动、HTTP 客户端)基于 Tokio 开发
  3. 稳定性:作为 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 入口程序。

实践

http://www.lryc.cn/news/603395.html

相关文章:

  • leaflet中绘制轨迹线的大量轨迹点,解决大量 marker 绑定 tooltip 同时显示导致的性能问题
  • HTTP 与 HTTPS 的区别
  • div 封装日历
  • C++学习之继承
  • scrapy框架新浪新闻
  • linux中简易云盘系统项目实战:基于 TCP协议的 Socket 通信、json数据交换、MD5文件区别与多用户文件管理实现
  • uniapp 微信小程序 列表点击分享 不同的信息
  • YOLO--目标检测基础
  • 计算机视觉-图像基础处理
  • TailWindCss安装使用教程
  • eudev是什么东西,有什么作用
  • 1768. 交替合并字符串
  • 无线网络优化实践
  • [学习记录]URP流程解析(2)--初始化阶段
  • 虚拟机网络修复
  • 充电宝自燃隐患引发关注:如何确保充电宝安全?
  • 门控激活函数:GLU/GTU/Swish/HSwish/Mish/SwiGLU
  • 机器学习sklearn:泰坦尼克幸存预测(决策树、网格搜索找最佳参数)
  • 【深度学习新浪潮】什么是世界模型?
  • fastApi中的ocr
  • 译 | 介绍PyTabKit:一个试图超越 Scikit-Learn的新机器学习库
  • 如何查询并访问路由器的默认网关(IP地址)?
  • 主应用严格模式下,子应用组件el-date-picker点击无效
  • 【Dify】-进阶14- 用 Dify 搭建法律文档解析助手
  • Vue.js 指令系统完全指南:深入理解 v- 指令
  • 智能图书馆管理系统开发实战系列(一):项目架构设计与技术选型
  • Ubuntu上开通Samba网络共享
  • Ambari 3.0.0 全网首发支持 Ubuntu 22!
  • Kafka——消费者组重平衡全流程解析
  • cpolar 内网穿透 ubuntu 使用石