Skip to content

Repository files navigation

ecosystem - Rust 生态学习与实践

项目概述

ecosystem 是一个 Rust 生态系统学习与实践项目,通过丰富的示例代码展示 Rust 主流库和框架的使用方法。项目涵盖了异步编程(tokio)、Web 开发(axum)、序列化(serde)、错误处理(thiserror/anyhow)、日志追踪(tracing/OpenTelemetry)、并发测试(loom)等核心主题,是 Rust 生态系统的综合学习资源。

主要技术栈

  • 语言: Rust (Edition 2024)

  • 核心依赖:

    • anyhow / thiserror - 错误处理
    • serde / serde_json / serde_with - 序列化框架
    • chrono - 时间处理
    • tracing / tracing-subscriber / tracing-appender - 日志追踪
    • opentelemetry / tracing-opentelemetry - 分布式追踪
  • 示例依赖:

    • 异步编程: tokio, futures, tokio-util
    • Web 框架: axum, http
    • 数据库: sqlx (PostgreSQL)
    • 序列化扩展: serde_with, strum, derive_more, derive_builder
    • 加密: chacha20poly1305, base64, blake3
    • 并发: dashmap, loom
    • 工具: bytes, nanoid, dotenvy, console-subscriber

项目结构

src/
└── lib.rs              # 库入口(空)

examples/               # 示例代码
├── tokio1.rs           # tokio 运行时基础
├── tokio2.rs           # 异步/同步通道通信
├── bytes.rs            # bytes 缓冲区操作
├── serde.rs            # serde 手动实现 Serialize/Deserialize
├── serde1.rs           # serde 高级用法(加密、Base64、serde_with)
├── axum_serde.rs       # axum + serde Web 服务
├── axum_tracing.rs     # axum + tracing + OpenTelemetry 分布式追踪
├── enum.rs             # strum 枚举工具库
├── more.rs             # derive_more 派生宏
├── builder.rs          # derive_builder 构建者模式
├── err.rs              # thiserror/anyhow 错误处理
├── shortener.rs        # URL 短链接服务(完整 Web 应用)
├── minginx.rs          # 简易反向代理
└── chat.rs             # 多人聊天服务器

tests/
└── loom.rs             # loom 并发测试

logs/                   # 日志输出目录
test.rest               # HTTP 测试文件

示例详解

异步编程

tokio1 - 运行时基础

演示 current_thread 运行时的创建和任务调度:

cargo run --example tokio1

核心要点:

  • 使用 Builder::new_current_thread() 创建单线程运行时
  • rt.spawn() 提交异步任务
  • 异步 I/O(文件读取)与 CPU 密集型任务的并行执行

tokio2 - 异步/同步通道通信

演示 tokio 异步任务与同步线程之间的消息传递:

cargo run --example tokio2

核心要点:

  • mpsc::channel 创建异步通道
  • 异步端使用 tx.send().await 发送消息
  • 同步端使用 rx.blocking_recv() 接收消息
  • 适用于异步生产者 + 同步消费者的场景

序列化

serde - 手动实现

手动实现 SerializeDeserialize trait,深入理解 serde 工作原理:

cargo run --example serde

核心要点:

  • Serialize: 使用 serialize_struct 逐字段序列化
  • Deserialize: 实现 Visitor trait,支持 visit_seqvisit_map
  • visit_seq 中字段顺序必须与声明一致

serde1 - 高级用法

展示 serde 的高级功能,包括自定义序列化、加密、Base64 编码等:

cargo run --example serde1

核心要点:

  • #[serde(rename_all = "camelCase")] - 字段重命名
  • #[serde(rename = "privateAge")] - 单个字段重命名
  • #[serde(skip_serializing_if = "Vec::is_empty")] - 条件跳过
  • #[serde(tag = "type", content = "details")] - 枚举内部标记
  • 自定义 serialize_with / deserialize_with - Base64 编解码
  • serde_withDisplayFromStr - 自动通过 Display/FromStr 转换
  • ChaCha20Poly1305 加密序列化

Web 开发

axum_serde - REST API

使用 axum 构建支持 JSON 序列化的 REST API:

cargo run --example axum_serde

核心要点:

  • Router 路由定义
  • State 共享状态管理
  • Json 请求/响应处理
  • #[instrument] 自动追踪
  • patch 部分更新模式

axum_tracing - 分布式追踪

集成 OpenTelemetry 实现分布式追踪和多层日志:

# 先启动 Jaeger(分布式追踪后端)
docker run -d -p16686:16686 -p4317:4317 -e COLLECTOR_OTLP_ENABLED=true jaegertracing/all-in-one:latest

cargo run --example axum_tracing

核心要点:

  • 控制台日志(tracing-subscriber
  • 文件滚动日志(tracing-appender
  • OpenTelemetry 导出(tracing-opentelemetry
  • #[instrument] 自动创建 span
  • Jaeger UI 查看追踪(http://localhost:16686)

shortener - URL 短链接服务

完整的 URL 短链接 Web 应用,使用 PostgreSQL 存储:

# 设置数据库连接
export DATABASE_URL="postgres://user:pass@localhost:5432/shortener"

cargo run --example shortener

API 使用:

# 创建短链接
curl -X POST http://localhost:8080/ \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'

# 访问短链接(自动重定向)
curl -v http://localhost:8080/<id>

核心要点:

  • sqlx 异步 PostgreSQL 操作
  • nanoid 生成短 ID
  • dotenvy 环境变量管理
  • FromRow 数据库行映射
  • ON CONFLICT 处理 URL 去重
  • axum 提取器顺序(FromRequestParts 在前,FromRequest 在后)

minginx - 简易反向代理

实现基本的 TCP 反向代理:

cargo run --example minginx

核心要点:

  • TCP 连接的双向数据转发
  • tokio::io::copy 零拷贝数据传输
  • tokio::try_join! 并发执行双向转发
  • Arc 共享配置

chat - 多人聊天服务器

基于 TCP 的多人聊天室:

# 启动服务器
cargo run --example chat

# 使用 telnet 连接
telnet localhost 8080

核心要点:

  • DashMap 并发安全的连接管理
  • Framed + LinesCodec 行协议编解码
  • mpsc 通道实现消息广播
  • 连接生命周期管理(加入/离开通知)

枚举与派生宏

enum - strum 枚举工具

使用 strum 库增强枚举功能:

cargo run --example enum

核心要点:

  • EnumString - 字符串转枚举
  • EnumIter - 遍历所有变体
  • EnumCount - 变体计数
  • EnumIs - 类型判断(is_b()
  • IntoStaticStr - 转为静态字符串
  • VariantNames - 获取变体名称列表
  • Display - 自定义显示格式
  • #[strum(serialize = ..., to_string = ...)] - 自定义序列化和显示

more - derive_more

使用 derive_more 自动生成常用 trait 实现:

cargo run --example more

核心要点:

  • From - 自动类型转换
  • Add - 加法运算
  • Into - 反向转换
  • Display - 格式化显示
  • #[display("int: {_0}")] - 自定义 Display 格式

builder - 构建者模式

使用 derive_builder 实现构建者模式:

cargo run --example builder

核心要点:

  • #[builder(setter(into))] - 自动类型转换
  • #[builder(setter(skip))] - 跳过字段
  • #[builder(default)] - 默认值
  • #[builder(setter(custom))] - 自定义 setter
  • #[builder(setter(each(name = "skill", into)))] - 集合逐项添加
  • 自定义 build() 方法(计算派生字段)

错误处理

err - thiserror/anyhow

演示 Rust 错误处理的最佳实践:

cargo run --example err

核心要点:

  • thiserror 定义错误枚举
  • #[from] 自动实现 From trait
  • #[error("...")] 自定义错误消息
  • Box<BigError> 大错误放堆上,减小错误大小
  • anyhow::Context 添加上下文信息
  • 各错误类型的大小比较

其他

bytes - 缓冲区操作

演示 bytes crate 的缓冲区操作:

cargo run --example bytes

核心要点:

  • BytesMut 可变缓冲区
  • BufMut trait 写入数据
  • split() / freeze() / split_to() 切片操作

loom - 并发测试

使用 loom 进行并发正确性测试:

cargo test --test loom

核心要点:

  • loom::model 模拟并发执行
  • 检测原子操作的正确性
  • fetch_add vs load + store 的竞态条件

构建与运行

构建项目

cargo build          # 调试构建
cargo build --release  # 发布构建

运行示例

# 运行指定示例
cargo run --example <name>

# 例如
cargo run --example tokio1
cargo run --example serde1
cargo run --example axum_serde

运行测试

cargo test           # 运行测试
cargo nextest run    # 使用 nextest 运行测试

开发规范

代码风格

  • 使用 cargo fmt 格式化代码
  • 使用 cargo clippy 进行代码检查,所有警告视为错误 (-D warnings)

Pre-commit Hooks

项目配置了以下 pre-commit 检查:

  1. 通用检查: 文件编码、大小写冲突、合并冲突、YAML 格式、行尾空格
  2. Python 格式: black 代码格式化
  3. Rust 检查:
    • cargo fmt -- --check - 代码格式检查
    • cargo deny check -d - 依赖安全检查
    • typos - 拼写检查
    • cargo check --all - 编译检查
    • cargo clippy --all-targets --all-features --tests --benches -- -D warnings - 代码质量检查
    • cargo nextest run --all-features --no-tests pass - 单元测试

提交规范

项目使用 Conventional Commits 规范:

  • feat: - 新功能
  • fix: - Bug 修复
  • doc: - 文档更新
  • perf: - 性能优化
  • refactor: - 代码重构
  • style: - 代码风格
  • test: - 测试相关
  • chore: - 其他杂项

使用 git-cliff 自动生成 CHANGELOG。

依赖安全

使用 cargo-deny 进行依赖检查,配置文件 deny.toml

  • 安全漏洞: deny
  • 维护状态: warn
  • 许可证白名单: MIT, Apache-2.0, Apache-2.0 WITH LLVM-exception, MPL-2.0, BSD-2-Clause, BSD-3-Clause, ISC, CC0-1.0, Unicode-3.0

相关链接

About

Rust 生态系统学习

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages