本人从事 Java 开发10余年,主要在 Web 后端开发领域,从早期的 Struct 到后来的Spring Boot 框架。
今年开始学习 Rust ,现全面转向基于 **Axum**框架的 Web 开发。在学习过程中,越来越感受到技术发展的魅力,仿佛迈进新天地一个新的世界。
为什么从 Springboot 到 Axum 让我感觉更强大、更顺畅?下面就此展开发享下个人的真实体验:
Axum 整体给人感觉 更简洁、类型安全、更灵活 、更可组合的 Web 框架;而 Spring Boot 则更"大全套、开箱即用"。
1. 一切清晰,没有"隐藏逻辑"
Spring 的逻辑很分散:
- 配置在 application.yml
- Bean 隐式扫描
- AOP 自动织入
- 注解到处都是(@Controller / @Service / @Repository / @Configuration...)
Axum 开发到后来,你会发现:
- 每一条中间件就是一段代码
- 每一个 handler 就是一个 async fn
- 每一个结构体都是显式声明
- 没有运行时注解,没有反射,没有魔法
你看到的就是你得到的。
2. Tower 中间件比 Spring 的 Filter / Interceptor 更通用
Spring 的 Filter / Interceptor 层次多、不统一,还受容器限制。
Spring 里:
- Filter → Servlet 层
- Interceptor → Spring MVC 层
- AOP → 方法层
- HandlerAdvice → 异常层
4 套系统,行为不统一。
Axum:
全都用 Tower Layer 实现。
超级整洁,不会遇到 Spring 那种"拦不到""拦两次""拦顺序不对"的噩梦。
Axum 的中间件更模块化:
中间件就是 tower layer
- 组合并复用更自由
- 没有 servlet container 的历史包袱
css
Router::new()
.route("/api", get(handler))
.layer(auth_layer)
.layer(trace_layer);
每个层可随意插拔。
3. 错误处理极其优雅
Spring 需要:
- @ControllerAdvice
- 自定义 ExceptionHandler
- 处理不同异常类型
Axum → Result + thiserror + IntoResponse
rust
#[derive(thiserror::Error, Debug)]
pub enum AppError {
#[error("db error: {0}")]
Db(String),
#[error("unauthorized")]
Unauthorized,
}
impl IntoResponse for AppError {
fn into_response(self) -> Response {
match self {
AppError::Db(msg) => (StatusCode::INTERNAL_SERVER_ERROR, msg).into_response(),
AppError::Unauthorized => StatusCode::UNAUTHORIZED.into_response(),
}
}
}
Handler:
rust
async fn handler() -> Result<Json<User>, AppError> {
let user = repo.load().await?;
Ok(Json(user))
}
优雅得不能再优雅。
4. Rust中的Serde 的速度和易用性完全吊打 Java中的Jackson
Spring 的 JSON 转换:
- 大量反射
- 需要 ObjectMapper
- 注解魔法很多(@JsonProperty / @JsonIgnore)
Spring 需要:
- Jackson 注解
- Lombok 注解(或者自己写 getter/setter)
Rust:
Serde 是编译期生成序列化代码,没有反射、没有运行时开销。
数据结构天然与Json对接。
rust
#[derive(Serialize, Deserialize)]
struct User {
id: u64,
name: String,
}
没有反射、没有运行期开销,Serde 是编译期生成高效代码。
5. 提取参数(Extractor)机制远比 Spring 灵活
Spring Boot 的参数来源是固定的:@RequestBody、@RequestParam、@PathVariable、@RequestHeader 等。
Axum 的 extractor 是:
- 可组合
- 可扩展
- 可自己实现 FromRequest
- 可同时解析多个来源
例如一个 Handler 同时解析 Path + Query + Json:
javascript
async fn handler(
Path(id): Path<u64>,
Query(filter): Query<Filter>,
Json(payload): Json<CreateUser>,
) { ... }
Spring 要写一堆注解;Axum 清晰而类型安全。
6. 极强的可维护性(无魔法、无反射)
Spring 的运行时行为有大量"魔法":
- 注解驱动
- Bean 注入(DI container)
- 反射扫描
- Classpath 自动配置
Axum:
- 无反射
- 无全局注解扫描
- 一切都是显式的 Rust 代码
调试体验大幅提升。
7. 性能更是碾压级
Rust 本身是零成本抽象,Axum 则基于 hyper + tower。
对比 Spring Boot(JVM + GC):
- 更低延迟
- 更低内存占用
- 更高吞吐
- 无 GC 停顿
- 可部署更轻
生产环境的成本优势巨大。
8. Axum 中的数据模型就是普通 Rust 类型
Spring 用户经常有:
- DTO
- VO
- entity
- POJO
- request object
- response object
Axum 中:
- 你想用什么 struct 就用什么 struct
- 没有 Java 那些"类泛滥"的情况
结构体即数据模型。
Axum 的理念:Everything is a function
Handler 就是一个 async fn,参数就是 extractor,返回值就是响应。
简洁到让人惊讶!