从 ☕️Java Spring Boot → 🦀Rust Axum 体验的真实感受

本人从事 Java 开发10余年,主要在 Web 后端开发领域,从早期的 Struct 到后来的Spring Boot 框架。

今年开始学习 Rust ,现全面转向基于 **Axum**框架的 Web 开发。在学习过程中,越来越感受到技术发展的魅力,仿佛迈进新天地一个新的世界。

为什么从 SpringbootAxum 让我感觉更强大、更顺畅?下面就此展开发享下个人的真实体验:

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,返回值就是响应。

简洁到让人惊讶!

相关推荐
掘金者阿豪2 小时前
Codex 开放 1M 上下文后,我折腾了一圈才发现:新版根本不是网上教的那样配置
后端
爱勇宝2 小时前
《道德经》第 10 章:真正成熟的人,能成事但不控制一切
前端·后端·程序员
六边形6662 小时前
独立开发不知道做什么?使用 TRAE Work 抓取差评痛点,快速跑通产品立项流
前端·后端·面试
高频因子挖掘机2 小时前
量化交易系统的数据层和策略层如何解耦?从紧耦合泥潭到优雅分层架构
后端·github
临江仙4552 小时前
同一个 AI Agent 如何同时服务 Web、微信和 QQ:PureChat 的渠道架构实践
前端·人工智能·后端
我的AI队友2 小时前
DeepSeek Harness 接钉钉通知,踩了两个坑:签名不匹配 + 纯对话刷屏
后端·deepseek
程序员鱼皮2 小时前
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
前端·后端·ai编程
步行cgn2 小时前
Spring Cache 详解:Spring 框架的缓存抽象
后端