技术底座

技术底座

介绍各层技术的选型依据,以及它们如何配合完成一次请求

0
运行时 GC 暂停
100%
编译期类型安全
∞
无畏并发

🧱 Rust 语言层

🔧 Axum 框架

  • 类型安全路由:路径参数和查询参数在编译期校验,写错一个字母直接编译失败,而不是 404
  • Tower 中间件生态:日志、限流、超时、认证、CORS 等中间件开箱即用,标准化可组合
  • Extractor 模式:从请求中提取数据的类型安全抽象,任何错误都在编译期暴露
  • 与 Tokio 深度集成:天然异步,零额外适配成本,直接享受 Tokio 生态红利

💡 为什么不用 Actix?

  • Axum 由 Tokio 团队官方维护,与 Tokio 运行时深度绑定,生态一致性更好
  • Tower 中间件生态成熟且标准化,可复用性优于 Actix 的自研中间件体系
  • 类型安全优于宏 —— Axum 在编译期发现问题,Actix 的宏魔法在运行时才暴露
  • 社区趋势:Axum 增长迅速,已成为 Rust Web 生态的事实标准

⚡ Tokio 异步运行时

  • 事件驱动模型:非阻塞 I/O,单线程可处理数万并发连接,线程数不再成为瓶颈
  • 工作窃取调度器:多核 CPU 利用率最大化,空闲核心自动从忙碌核心"窃取"任务
  • 异步生态统一:整个 Rust 异步生态围绕 Tokio 构建 —— 数据库驱动、HTTP 客户端、gRPC 全部原生支持
  • 精细的资源控制:可配置线程数、任务预算、超时策略,对资源的使用了如指掌

💻 异步代码示例

use axum::{Router, routing::get}; use sqlx::PgPool; async fn get_articles( pool: axum::extract::State<PgPool> ) -> axum::Json<Vec<Article>> { let rows = sqlx::query_as!(Article, "SELECT * FROM articles ORDER BY id" ).fetch_all(&*pool).await.unwrap(); axum::Json(rows) }

编译期校验 SQL + 类型安全路由 + 异步非阻塞,三合一

🗄 数据层 —— PostgreSQL + SQLx + Redis

🌍 全链路类型安全

从数据库 schema 到前端类型定义,整个链路中任何类型不匹配都在编译期暴露,而非运行时才发现

DB Schema → SQLx 宏展开 → Rust 结构体 → Serde 序列化 → JSON API → 前端 TypeScript

任何一环的类型变更,都会在编译时触发错误 —— 而不是在用户浏览器中报出 500

DESIGN PATTERNS

代码架构与设计模式

除了技术栈选型,代码组织也采用统一的设计模式

Service 层模式

业务逻辑全部封装在 Service 层函数中,路由 Handler 只做参数解析和响应序列化。同一份 Service 代码被 HTTP 接口和 CLI 子命令共享调用,不重复实现。

数据访问不单开一层

没有额外抽象一层 Repository——SQLx 查询直接写在 Service 函数里,编译期就校验 SQL,中间再包一层接口反而丢掉这个校验能力。数据访问逻辑不暴露给路由层,但也不为了"分层"而分层。

Extractor 模式

Axum 的类型安全请求提取器在编译期校验路由参数——路径参数、查询字符串、请求体 JSON 的类型不匹配在编译阶段就能发现,不会到运行时才报 400。

中间件管道

Tower 中间件体系统一处理认证、日志、限流、CORS 等横切关注点。每个中间件职责单一,组合起来形成完整的请求处理管道,新增能力只需插入一层中间件而不需改动现有业务逻辑。

错误处理策略

Rust 的 Result 枚举 + 自定义错误类型(thiserror)+ 统一的错误响应格式。每种错误都有明确的 HTTP 状态码和可读的中文错误消息,前端不需要猜测"500 Internal Server Error"背后是什么问题。

配置驱动

站点配置、栏目配置、模型配置分层管理——基础配置 + 环境特定覆盖 + 环境变量注入。每个实例一份配置文件夹,所有运行时参数集中一处,运维不需要在代码里翻找硬编码值。

FOR RUST DEVELOPERS

核心代码,未来会开源

现阶段 rsSites 仍在开发中,核心代码计划在成熟后开源——如果你对 Rust 写一个真正上生产的系统级 Web 应用感兴趣,欢迎关注后续动态

⚡ 异步架构与并发性能

📦 资源占用与部署成本

  • 低内存:无 GC 机制,内存占用低且平稳,适合在资源有限的服务器上部署
  • 单二进制:一个可执行文件包含所有功能,无运行时依赖,无动态链接库地狱
  • 启动极快:毫秒级启动,冷启动延迟几乎为零
  • 更简单的容器化:FROM scratch 即可构建极小体积的 Docker 镜像

📊 有 GC vs 无 GC

  • 有 GC(Java/Go/Node.js):垃圾回收器定期扫描堆内存,暂停所有业务线程,导致周期性延迟抖动
  • 无 GC(Rust):所有权系统在编译期精确计算每个值的生命周期,效果等价于手动管理内存,但由编译器保证不会遗漏或重复释放
  • 结果:内存占用可预测、延迟分布集中、无回收停顿

🖥️ 管理后台技术栈

前后端彻底分离,后台是独立构建部署的 SPA,跟后端版本迭代解耦

🚀 从数据库到前端,类型安全贯穿始终

在 rsSites 中,类型约束贯穿数据库到前端,类型不匹配会在编译期被发现。