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

封面

往期回顾

  • Rust 实战二 | 开发简易版命令行工具 grep
  • 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.pswp.cn/pingmian/91067.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

墨者:SQL过滤字符后手工注入漏洞测试(第1题)

1. 墨者学院&#xff1a;SQL过滤字符后手工注入漏洞测试(第1题)&#x1f680; 2. 漏洞背景与测试思路&#x1f50d; 在Web安全测试中&#xff0c;当遇到对输入字符有过滤的SQL注入漏洞时&#xff0c;我们需要使用特殊技巧绕过过滤机制。本次测试的目标URL存在字符过滤&#xff…

深入解析 Vue 3 中 v-model 与表单元素的绑定机制

v-model 是 Vue 中最强大的指令之一&#xff0c;它简化了表单数据双向绑定的实现。本文将系统梳理各种 HTML 表单元素与 v-model 的绑定关系&#xff0c;特别是那些容易引起困惑的类型。一、v-model 的本质v-model 是一个语法糖&#xff0c;它实际上是 :value 和 input 的组合&…

【赵渝强老师】MySQL中的数据库对象

MySQL数据库中包含各自数据库对象&#xff0c;常见的数据库对象有&#xff1a;表、索引、视图、事件、存储过程和存储函数等等。 视频讲解如下 【赵渝强老师】MySQL中的数据库对象一、 创建与管理表 表是一种非常重要的数据库对象&#xff0c;MySQL数据库的数据都是存储在表中…

Angular面试题目和答案大全

基础概念篇1. 什么是Angular&#xff1f;它与AngularJS有什么区别&#xff1f;答案&#xff1a; Angular是由Google开发的基于TypeScript的开源Web应用框架&#xff0c;用于构建单页应用程序&#xff08;SPA&#xff09;。Angular vs AngularJS对比&#xff1a;特性AngularJSAn…

CSS 语音参考

CSS 语音参考 概述 CSS&#xff08;层叠样式表&#xff09;是用于描述HTML或XML文档样式的样式表语言。它为网页元素提供了一种统一的方式来定义字体、颜色、布局和其他视觉属性。CSS语音参考旨在为开发者提供一个详尽的指南&#xff0c;以便他们能够更有效地使用CSS来增强网页…

C# WPF 实现读取文件夹中的PDF并显示其页数

文章目录技术选型第一步&#xff1a;创建项目并安装依赖库第二步&#xff1a;定义数据模型 (Model)第三步&#xff1a;创建视图模型 (ViewModel)第四步&#xff1a;设计用户界面 (View)总结与解释后记关于转换器的错误工作中需要整理一些PDF格式文件&#xff0c;程序员的存在就…

设计模式(五)创建型:原型模式详解

设计模式&#xff08;五&#xff09;创建型&#xff1a;原型模式详解原型模式&#xff08;Prototype Pattern&#xff09;是 GoF 23 种设计模式中的创建型模式之一&#xff0c;其核心价值在于通过复制现有对象来创建新对象&#xff0c;而不是通过 new 关键字调用构造函数。它特…

K8S 八 数据存储-高级存储PV PVC 生命周期;配置存储ConfigMap Secret

目录数据存储 Volume8.1 基本存储8.1.1 EmptyDir8.1.2 HostPath 挂载目录8.1.3 NFSnfs的服务8.2 高级存储8.2.1 PV和PVC8.2.2 PV 持久化卷申请8.2.3 PVC 资源申请PVC的配置参数8.2.4 生命周期配置存储8.3.1 ConfigMap8.3.2 Secret数据存储 Volume Kubernetes的Volume支持多种类…

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现轮船检测识别(C#代码UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现轮船检测识别&#xff08;C#代码UI界面版&#xff09;工业相机使用YoloV8模型实现轮船检测识别工业相机通过YoloV8模型实现轮船检测识别的技术背景在相机SDK中获取图像转换图像的代码分析工业相机图像转换Bitmap图像格…

自习室预约小程序的设计与实现

自习室预约小程序的设计与实现现代学习环境对高效、便捷的预约系统需求日益增长。自习室预约小程序结合前沿技术栈&#xff0c;提供流畅的用户体验和强大的后台管理功能&#xff0c;满足学生、职场人士等群体的自习需求。技术架构与核心功能Vue.js 构建动态前端界面 采用 Vue.j…

Docker 实战大纲

文章目录Docker 实战 – Mysql &#xff08;敬请期待……&#xff09;

从一个“诡异“的C++程序理解状态机、防抖与系统交互

引言 在编程世界中&#xff0c;有时一个看似简单的代码片段可能隐藏着令人惊讶的复杂性。本文将从一个"故意设计"的C程序出发&#xff0c;深入探讨其背后涉及的状态机模式、防抖机制以及操作系统与控制台的交互原理。通过这个案例&#xff0c;我们不仅能理解这些核心…

NAS-Bench-101: Towards Reproducible Neural Architecture Search

概述这篇题为"NAS-Bench-101: Towards Reproducible Neural Architecture Search"的论文由Chris Ying等人合作完成&#xff0c;旨在解决神经网络架构搜索(NAS)领域面临的重大挑战&#xff1a;计算资源需求高和实验难以复现的问题。论文提出了NAS-Bench-101&#xff0…

SpringBoot整合Fastexcel/EasyExcel导出Excel导出多个图片

整个工具的代码都在Gitee或者Github地址内 gitee&#xff1a;solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb、xxl-job、powerjob还有用Docker compose部署各类中间组件。如果大家有…

网络原理--HTTPHTTPS

目录 一、HTTP 1.1 HTTP是什么 1.2 HTTP协议的工作过程 1.3 HTTP协议格式 1.3.1 抓包工具的使用 1.3.2 抓包结果 1.4 HTTP请求 1.4.1 URL 1.4.2 认识“方法” (method) 1.4.3 认识请求“报头”(header) 1.4.4 认识请求“正文”(body) 1.5 HTTP 响应详解 1.5.1 HTTP…

『 C++ 入门到放弃 』- 哈希表

一、哈希的概念 哈希&#xff0c;也称「 散列 」是一种用来进行高效查找的数据结构&#xff0c;查找的时间复杂度平均为O(1)&#xff0c;其本质就是依赖哈希函数这个算法来将 key 和该 key 存储位置建立一个映射关系。 而因为是有着映射关系&#xff0c;所以哈希的事件复杂度为…

零售收银系统开源代码全解析:连锁门店一体化解决方案(含POS+进销存+商城)

过去10年&#xff0c;收银系统技术经历了从单机版到云服务、从单纯结算到全渠道整合的快速演进。面对连锁多门店、AI称重、智能分账、跨店库存同步等新需求&#xff0c;很多企业的现有传统saas系统已显乏力。本文将梳理收银系统关键技术指标&#xff0c;助您在系统升级时做出明…

能源高效利用如何实现?楼宇自控系统智能化监管建筑设备

随着全球能源危机日益严峻和“双碳”目标的持续推进&#xff0c;建筑领域作为能耗大户&#xff08;约占社会总能耗的40%&#xff09;&#xff0c;其节能潜力备受关注。楼宇自控系统&#xff08;Building Automation System&#xff0c;简称BAS&#xff09;作为建筑智能化的核心…

校园二手交易小程序的设计与实现

文章目录前言详细视频演示具体实现截图后端框架SpringBoot微信小程序持久层框架MyBaits成功系统案例&#xff1a;参考代码数据库源码获取前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续…

Redis(二):Redis高级特性和应用(慢查询、Pipeline、事务)

Redis的慢查询 许多存储系统&#xff08;例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间&#xff0c;当超过预设阀值,就将这条命令的相关信息&#xff08;例如:发生时间&#xff0c;耗时&…