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
英文地址,請注明出處:http://en.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;耗時&…