- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 引言 — 生态系统胜于语言
- cargo 与 crates.io — 生态系统的基石
- 基础 crate — serde 与 tokio
- 并行与数据 — rayon 与 polars
- 网络与 Web — reqwest、hyper、axum
- 数据库与 CLI — sqlx、diesel、clap
- 图形与应用 — Bevy、wgpu、Tauri
- 知名项目 — Rust 留在世界上的印记
- 亲自动手试试
- 结语
- 参考资料
引言 — 生态系统胜于语言
谈到 Rust,我们通常最先想到的是所有权、借用检查器、内存安全这些语言特性。但决定一门语言在实务中是否好用的,并不只是语法本身。是否已经有库能把需要的事情做好,把它拿来用有多容易——生态系统的成熟度才是关键。
在这一点上,Rust 在过去几年里经历了戏剧性的成长。自 2015 年 1.0 发布以来,crates.io 上已经积累了数十万个 crate,其中一些已经成为各自领域事实上的标准。本文是一张地图,带你巡览这些代表性的 crate 与知名项目。文章聚焦于每个 crate「是为了什么而存在的」,希望能帮助你在用 Rust 开始做点什么时,找到该往哪儿看的感觉。
cargo 与 crates.io — 生态系统的基石
在谈论各个 crate 之前,得先说说让这一切成为可能的基石。Rust 生态系统之所以能快速成熟,从一开始就拥有一套设计精良的工具链,功不可没。
cargo 是 Rust 官方的构建工具兼包管理器。创建项目(cargo new)、构建(cargo build)、测试(cargo test)、运行(cargo run)、依赖管理,全部通过一套一致的命令来处理。相比其他语言里构建工具、包管理器、格式化工具、测试运行器各自为政的局面,这种统一的体验大大降低了入门门槛。
crates.io 是公开的 crate 注册中心。只需在 Cargo.toml 里写上 crate 的名字和版本,cargo 就会自动下载并构建它。再加上语义化版本和锁文件(Cargo.lock)的配合,可复现的构建从一开始就有了保障。
[dependencies]
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
仅凭这一行简单的声明,库本身及其全部下游依赖就会一并被拉取进来。下面要介绍的所有 crate,归根到底都建立在这两个工具之上。
基础 crate — serde 与 tokio
打开几乎任何一个 Rust 项目,都能看到两个几乎必然出现的 crate。称它们为撑起整个生态系统地基的支柱,毫不为过。
serde 是一个序列化/反序列化框架。只需给结构体加上一个派生宏,就能与 JSON、YAML、TOML、MessagePack 等大量格式相互转换。它的核心设计是把「数据模型」和「格式」分离开来,让同一个类型可以在多种格式之间自由处理。
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct Config {
name: String,
port: u16,
}
// 这个类型现在可以自由地在 JSON、YAML、TOML 等格式之间转换
let cfg: Config = serde_json::from_str(r#"{"name":"web","port":8080}"#)?;
tokio 是 Rust 的异步运行时。Rust 语言本身保留了 async/await 语法,但真正负责调度和执行这些任务的运行时,则交给库来实现。tokio 就是这个运行时事实上的标准,提供异步任务调度器、非阻塞 I/O、定时器、通道等能力。下面会看到的网络、Web、数据库相关 crate 中,相当一部分都构建在 tokio 之上运行。
#[tokio::main]
async fn main() {
let handle = tokio::spawn(async {
// 一个并发执行的异步任务
"done"
});
println!("{}", handle.await.unwrap());
}
并行与数据 — rayon 与 polars
Rust 的强项之一是「无畏并发(fearless concurrency)」。因为类型系统会在编译期就挡住数据竞争,写并行代码时可以放心得多。最能体现这一优势的 crate 就是 rayon。
rayon 是一个数据并行(data parallelism)库。令人惊讶的是它用起来有多简单——只需把顺序迭代器(iter)换成并行迭代器(par_iter),集合处理就会自动分散到多个核心上。
use rayon::prelude::*;
// iter() -> par_iter():只差一个词,就变成并行处理
let sum: u64 = (0..1_000_000)
.into_par_iter()
.filter(|n| n % 3 == 0)
.map(|n| n as u64)
.sum();
在内部,工作窃取(work-stealing)调度器会把负载均匀地分摊到各个核心上。并行化的正确性由 Rust 的类型系统来保证,你只需要专注于性能,不必担心数据竞争。
polars 是一个高性能的数据帧(dataframe)库,占据着与 Python 里 pandas 相当的位置。它把基于 Apache Arrow 的列式存储、惰性执行(lazy evaluation)与查询优化结合在一起,在大规模数据上速度非常快。既可以直接在 Rust 中使用,其 Python 绑定也被广泛采用,在数据分析领域的存在感正在不断扩大。
网络与 Web — reqwest、hyper、axum
Web 在任何语言里都是一大领域,而在 Rust 中,这一层被组织得相当清晰。
hyper 是一个底层的 HTTP 库。它是对 HTTP/1 和 HTTP/2 的准确、快速实现,同时支持客户端和服务端。直接使用它偏底层,但下面的上层 crate 都建立在 hyper 之上。
reqwest 是包装了 hyper 的易用 HTTP 客户端。它用简洁的 API 处理 JSON 请求/响应、cookie、重定向、TLS。「调用其他服务的 API」这种日常任务,它往往是第一个想到的 crate。
let body: serde_json::Value = reqwest::get("https://api.example.com/status")
.await?
.json()
.await?;
axum 是 tokio 团队打造的 Web 框架。它构建在 hyper 与 tower(中间件抽象)之上,用类型安全的「提取器(extractor)」方式来表达路由与请求解析。它的一大特色是不依赖宏,而是用普通的函数和类型来编写处理器(handler)。
use axum::{routing::get, Router};
async fn hello() -> &'static str {
"Hello, world!"
}
let app = Router::new().route("/", get(hello));
数据库与 CLI — sqlx、diesel、clap
一个应用程序通常都需要数据库和命令行界面。Rust 在这两方面都有成熟的选择。
数据库访问大体上有两条路线。sqlx 是一个异步 SQL 工具包,有趣的是它会在编译期把 SQL 查询和实际的数据库 schema 做对照检查——也就是说,错误的列名或类型不匹配会在构建阶段就被抓出来。相比之下,diesel 是一个完整的 ORM 兼查询构建器,用 Rust 代码以类型安全的方式组装查询。想直接写 SQL 但又要有校验时适合 sqlx,想要 ORM 风格的抽象时适合 diesel。
clap(Command Line Argument Parser)是命令行参数解析事实上的标准。给结构体加上派生宏,就能从参数定义自动生成解析器、帮助文本乃至子命令。
use clap::Parser;
#[derive(Parser)]
struct Cli {
/// 待处理的输入文件
path: String,
/// 是否输出详细信息
#[arg(short, long)]
verbose: bool,
}
let cli = Cli::parse(); // --help 也是自动生成的
图形与应用 — Bevy、wgpu、Tauri
作为一门系统级语言,Rust 在图形与应用程序领域也孕育出了不少有趣的项目。
wgpu 是一个跨平台图形 API。它以浏览器标准 WebGPU 为基础,在其背后再对接到 Vulkan、Metal、DirectX 12 等各平台的原生图形后端。它的优势在于可移植性——一套代码就能驱动多个平台的 GPU。
Bevy 是一个用 Rust 编写的游戏引擎。它的特色是把 ECS(Entity Component System)架构放在最前面,数据导向的设计与 Rust 的并行性配合得很好。它是开源的,开发也很活跃,不仅用于游戏,也被用于仿真和交互式应用程序。
Tauri 是一个用来构建桌面(以及移动端)应用的框架。它和 Electron 目的相似,但做法不同。Electron 会把整个 Chrome 浏览器打包进每一个应用里,而 Tauri 则使用操作系统自带的系统 WebView,把后端交给 Rust。结果是二进制体积和内存占用都小得多。前端用熟悉的 Web 技术编写,繁重的逻辑与系统访问则由 Rust 承担。
知名项目 — Rust 留在世界上的印记
如果说 crate 是零件,那么用这些零件造出的成品,同样能很好地体现 Rust 的地位。来看几个广为人知的项目。
- ripgrep(rg): 用 Rust 编写的超高速代码搜索工具。它结合正则表达式引擎、并行遍历和对
.gitignore的识别,在大规模代码库上跑出惊人的速度。许多开发者日常用它替代 grep,VS Code 的搜索功能内部也使用了 ripgrep。 - Deno: Node.js 创始人打造的 JavaScript/TypeScript 运行时。核心用 Rust 编写,内部嵌入了 V8 引擎。它主打默认安全(权限模型)、原生支持 TypeScript 等特点。
- Firecracker: AWS 打造的轻量级虚拟化技术(microVM)。它用 Rust 编写,被用作无服务器(AWS Lambda)和容器服务的隔离基础。作为一款几十毫秒内就能启动的轻量级 VM,它同时追求安全隔离与快速启动。
- Linux 内核对 Rust 的支持: 从 2022 年的 Linux 6.1 开始,在内核中使用 Rust 的基础设施被合并了进去。这是 Rust 进入被 C 语言统治了数十年的领域的标志性事件,主要是为了在新驱动等场景中获得内存安全性的尝试。
除此之外,Rust 还被用在 Firefox 的多个组件、打包工具、Web 服务器、区块链、嵌入式等众多领域。这些用例的共同点是,Rust 在「性能与安全性同等重要」的场合尤其强大。
亲自动手试试
至此浏览过的这些 crate 与项目,归根到底都立足于 Rust 这门语言本身。一旦熟悉了所有权、trait、枚举这些概念,就更容易理解这个生态系统为何会长成这个样子。如果想亲自用代码实验 Rust 的核心概念,可以在本站的 Rust 学习实验室里动手试试。另外,Rust 也是 WebAssembly 阵营的主力语言之一,正如 wgpu 以 WebGPU 为基础,Web 同样是 Rust 的重要舞台。如果好奇 WebAssembly 是如何运作的,可以在 WebAssembly 原理中查看它的结构。
结语
Rust 的力量并不止于语言本身。在 cargo 与 crates.io 这套精心打造的基石之上,层层叠叠地立着 serde、tokio 这样的基础 crate,rayon、polars 这样的数据与并行工具,由 reqwest、hyper、axum 串起的 Web 层,sqlx、diesel、clap 这样的应用组件,以及 Bevy、wgpu、Tauri 这样的图形与应用框架。
用这些零件,ripgrep、Deno、Firecracker 这样的实际工具被打造了出来,Rust 最终甚至踏进了 Linux 内核。贯穿这一切的共同点是:在需要「既快又安全」的代码的地方,Rust 尤其闪光。
当你要开始一件新事物时,希望这张地图能成为指路的路标,告诉你该先看哪里。你需要的 crate 大多已经存在,一行 cargo 命令就能把它收入囊中。
参考资料
- crates.io — Rust 包注册中心: https://crates.io/
- The Cargo Book: https://doc.rust-lang.org/cargo/
- serde 官方网站: https://serde.rs/
- Tokio 官方网站: https://tokio.rs/
- Rayon GitHub: https://github.com/rayon-rs/rayon
- Polars 官方网站: https://pola.rs/
- axum GitHub: https://github.com/tokio-rs/axum
- Bevy 官方网站: https://bevyengine.org/
- Tauri 官方网站: https://tauri.app/
- wgpu 官方网站: https://wgpu.rs/
- ripgrep GitHub: https://github.com/BurntSushi/ripgrep
- 本站的 Rust 学习实验室: /tools/rust-learning-lab
- 本站的 WebAssembly 原理: /tools/wasm-principles