⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Fight/Rust-goujiankekaoqiegaoxiaoruanjiannenglideyuyan/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

Java 程序员开始看 Rust 这件事

最近这两年——身边写 Java 的同学开始陆续被问到一个问题:

“你下个项目用 Java 还是 Rust?“

放在 5 年前这个问题完全不存在——Java 是后端的默认答案。但现在情况变了:

  • 字节、百度、蚂蚁的某些核心组件已经开始用 Rust 替换 C++ 模块;
  • TiDB 的 TiKV 存储层(https://github.com/tikv/tikv)是 Rust——给 PingCAP 的商业化落地做了很强背书;
  • Cloudflare 的 Pingora(https://github.com/cloudflare/pingora)替换了内部一大片 nginx——Rust + 异步 IO 把延迟稳到 P999 不抖;
  • 桌面应用领域——Tauri(https://tauri.app/)用 Rust 替代 Electron——包体积砍 90%;
  • WebAssembly / 嵌入式 / IoT 这些领域——Rust 是默认选择。

Java 程序员要不要跟?——这篇文章把 Java 和 Rust 7 个维度的真实差距讲清楚——让你看完能拿这张决策矩阵给自己项目做选型。

Rust 三大卖点解决了 Java 的什么真痛

Rust 官网(https://www.rust-lang.org/zh-CN/)把自己定位成「赋予每个人构建可靠且高效软件能力的语言」——主推三件事:高性能、可靠性、生产力。

但这三个词单独看是营销话术——研发同学要看的是它到底解决了 Java 的什么真痛点:

卖点 1:没 GC——治好 Java 的”Full GC 抖动焦虑”

写 Java 的同学这个痛太懂了——JVM 服务跑久了 Full GC 一抖:

  • 正常请求 P99 是 5ms——一次 Full GC 全体阻塞 500ms;
  • 大堆内存 G1 / ZGC 调到极致也只能压到几十 ms——不是真的”无 STW”;
  • 金融交易、实时音视频、高频路径——这点抖动直接成事故。

Rust 把内存管理移到编译期——所有权、借用检查器把生命周期算清楚——运行时根本不需要 GC——延迟 P999 全程在一个量级。

卖点 2:编译期消除一大类 NPE / 数据竞争

Java 的痛——线上事故 80% 来自 NullPointerException + 并发 race condition:

  • user.getProfile().getName() 中间一个 null 直接 NPE;
  • 多线程下 HashMap 被并发改、ConcurrentModificationException;
  • volatile / synchronized 用错——线程间数据可见性问题难复现。

Rust 这些坑全部编译期 catch——Option<T> 强制你处理 None 分支、所有权机制让数据竞争编译都过不了。代价是「编译器经常拒绝你提交」——初学者会被骂哭——但越过这个坎之后,线上事故大类减少。

卖点 3:工具链一次性给齐——比 Java 生态更省事

Java 生态——Maven / Gradle / Checkstyle / SonarQube / 一堆 IDE 插件凑出来的开发体验——新人配环境 3 天起步。

Rust 用 cargo + rustfmt + clippy + rust-analyzer 开箱就有——装一个 toolchain,全套就齐。

use ferris_says::say;
use std::io::{stdout, BufWriter};

fn main() {
let stdout = stdout();
let message = String::from("Hello fellow Rustaceans!");
let width = message.chars().count();

let mut writer = BufWriter::new(stdout.lock());
say(&message, width, &mut writer).unwrap();
}

这是个 Rust Hello World——cargo run 就跑起来了。注意 BufWriter::new(stdout.lock()) 这一行——lock() 本身是运行时拿锁(和 Java synchronized 同类),但拿到的”锁守卫(lock guard)”由类型系统约束——它的生命周期、可变访问范围都在编译期被检查,避免了”释放锁后继续误用资源”这类 Java 容易踩的坑。

Java 容易出现”运行时才崩”、Rust 把这一类错误尽量”挪到编译期暴露”——这是核心区别。

不想本地装环境,https://play.rust-lang.org/ 在线就能跑。

Java vs Rust:7 个维度的真实差距

直接上对比表——先看一眼整体,再拆每一行的”实际意味着什么”:

维度 Java Rust 差距是怎么来的
内存管理 JVM GC 自动管理 所有权 + 借用检查器,无 GC Rust 把”什么时候释放”算到编译期
运行时性能 JIT 优化后接近 C,但有 GC 抖动 几乎零运行时开销 没 GC = 延迟更稳
空指针 / 数据竞争 运行时才报 NPE / race 编译期消除一大类 Option / 所有权两大杀器
生态成熟度 Spring 全家桶、企业级一统 系统级 / 嵌入式 / 编译器主场 Java 早入场 30 年
学习曲线 1 周写真实业务 1-3 个月跨过编译器关 所有权概念是分水岭
编译时间 秒级(增量更快) 大型项目 5-30 分钟 Rust 静态分析多得多
包体积 / 启动速度 100MB JAR + 几秒启动 单文件 5-20MB + 毫秒级启动 Rust 没运行时 = 哪都能塞

下面把每一行最容易被忽略的细节讲清楚:

内存管理:Java 的 G1 / ZGC 现在已经做到 STW 亚毫秒级,日常业务完全够用。Rust 的所有权是另一种思路——编译时就把”什么时候释放”算清楚——运行时不需要”扫描堆”这个动作。代价是写的时候编译器经常拒绝你——要花时间理解 & / &mut / 'a 这套生命周期记号。

运行时性能:日常 Web 服务两者吞吐差不多——JIT 优化后的 Java 性能接近 C。差距在长尾延迟——P999 那一段,Java 偶尔抖一下(GC 触发或 JIT 编译),Rust 基本没抖动。金融交易、实时音视频、高频路径会在意这个;普通后端 API 不在意。

空指针 / 数据竞争:这条是 Rust 真正的杀手锏——Java 程序员最怕的两类线上事故,Rust 编译期就解决。例如:

// Rust 强制你处理 Option 的 None 情况
fn get_name(user: Option<&User>) -> String {
match user {
Some(u) => u.name.clone(),
None => "未知用户".to_string(),
}
}

// 数据竞争编译都过不了:两个线程同时可变借用同一个变量
use std::thread;

let mut counter = 0;
thread::scope(|s| {
s.spawn(|| { counter += 1; });
s.spawn(|| { counter += 1; });
// ❌ 编译报错:cannot borrow `counter` as mutable more than once at a time
// 想跨线程共享可变状态?必须显式套 Arc<Mutex<T>>
});

写过半年 Rust 之后回头看 Java——会觉得 Java 那些 Optional、@Nullable 全是”凑合”的方案——根本不是语言层面的强制。

生态成熟度:Spring Boot / MyBatis / Druid / Sentinel——Java 后端的全家桶没人撼动得了。Rust 的 Web 框架(axum / actix-web)很优秀但生态深度差 Java 一个量级。Web 后端选 Java 是默认正确——Rust 的主场在系统级 / 嵌入式 / WASM。

axum 仓库:https://github.com/tokio-rs/axum | actix-web 官网:https://actix.rs

学习曲线:这是劝退点。Java 程序员第一次撞 Rust 编译器——borrow of moved value / lifetime mismatch / cannot borrow as mutable 会让你怀疑人生 1-2 周。但越过这个坎之后——编译期 catch 的 bug 越多,线上越省心。

编译时间:Rust 一个中型项目(20 万行)冷编译 10 分钟很常见——比 Java 慢一个量级。增量编译会好很多——但 CI 流水线里仍然是个真实成本。

包体积 / 启动速度:Rust 编译产物没有运行时依赖——一个静态二进制丢哪都能跑——5-20MB 单文件 + 毫秒级启动。Java 的 JAR 经常 100MB+、JVM 冷启动几秒——这就是为什么 K8s 里 Java 容器启动慢、Rust 容器秒起。云原生场景下Rust 的冷启动优势很大。

选型决策矩阵:你这个项目该选 Java 还是 Rust

把上面 7 个维度落到具体场景——直接给一张表你照着抄:

项目类型 选谁 理由
微服务后端 / RPC API Java Spring Boot 生态最成熟、上手最快、招人快
管理后台 / CRUD 业务 Java 业务变更快、Rust 在这种场景得不偿失
高频交易系统 Rust 长尾延迟稳定,无 GC 抖动
数据库 / 中间件内核 Rust 如 TiKV、RisingWave、DataFusion
云原生网关 / 反向代理 Rust Cloudflare Pingora 已替换内部 nginx
桌面应用 Rust + Tauri 替代 Electron,包体积砍 90%
嵌入式 / IoT 固件 Rust 没 GC、没 runtime、跨架构编译稳
WebAssembly 模块 Rust 编译目标天生支持,包最小
K8s Operator / 云原生 controller Go 生态全是 Go,Rust 反而拖累团队
Web 业务 SaaS Java yudao-cloud / 若依这种生态都在 Java

底层判断标准:「这个项目的瓶颈是 CPU + 延迟,还是研发速度 + 业务变更?」——前者选 Rust、后者选 Java。

yudao-cloud 仓库:https://github.com/YunaiV/yudao-cloud

Java 程序员入门 Rust 的真实成本

如果你已经下定决心入坑 Rust——先认清成本:

第 1 周:跟编译器斗智斗勇

borrow checker 会经常拒绝你的”看起来很合理”的代码。这个时候不要怪 Rust,怪你 Java 留下的”反正 GC 兜底”的肌肉记忆——比如:

  • 想多次借用同一个变量——Rust 会拒绝;
  • 想跨线程共享 mutable 引用——Arc<Mutex<T>> 是必经之路;
  • 想 null —— Rust 没有 null,全是 Option<T>。

第 1 个月:能写跑通的服务,但代码丑

能写出 Web 服务但满屏 clone() / Arc / unwrap()——这是新手必经阶段,先求能跑。

这个阶段的代码 review 给老 Rust 选手会被骂——但你能跑就行。

第 3 个月:开始理解所有权和生命周期

能写出 idiomatic 的代码——这时候才能体会到”编译过 = 大概率没 bug”的爽——这是 Java 党永远没体会过的爽。

学习路径推荐:

  1. https://doc.rust-lang.org/book/ 通读一遍(俗称 “the book”);
  2. https://github.com/rust-lang/rustlings 做完所有题;
  3. 跟一个开源项目读 1000 行源码——比如 tokio(https://github.com/tokio-rs/tokio)或 reqwest(https://github.com/seanmonstar/reqwest)——3 个月就能从”会写 Java 的”进化到”会写 Rust 的”。

AI Coding 时代,Rust 的入门成本被砍掉一大半

上面那条”3 个月入门”的判断——是 2024 年之前的标准答案。2025 年之后已经变了——AI Coding 工具(Cursor / Claude Code / Codex)让 Rust 入门成本直接砍半。

为什么?因为 Rust 最劝退的两个东西——借用检查器报错 + 生命周期标记——都是 AI 最擅长解释的领域:

  • borrow checker 报错 —— cannot borrow as mutable / borrow of moved value 这种错误,过去你得翻书 1 小时才搞懂;现在 Cursor / Claude Code 直接把错误粘进去问”为什么报错 + 怎么改”——AI 会给你一份比官方文档还详细的解释 + 修法;
  • 生命周期标记 'a —— <'a, 'b> 这种符号过去看着头大,现在 AI 一句话就能讲清”这两个引用要活得一样长”——理解成本极速下降;
  • 写 idiomatic Rust —— 你写一段 Java 风格的 Rust,让 AI 帮你”改成 idiomatic 风格”——3 个月才能体会到的”什么叫地道 Rust”,AI 直接给你示范;
  • 跟 tokio / async 打交道 —— 异步 Rust 是另一个劝退点,AI 能直接帮你写 tokio::spawn / select! / tokio::time::sleep 等组合,省掉手动翻 tokio 文档的时间。

实战体感:我自己用 Claude Code 写过一段简单的 Rust gRPC server——第一次写 Rust 项目 居然 1 个晚上就跑通了——同样的事 2024 年估计要折腾一周。AI Coding 没有让 Rust 变简单,是让”理解 Rust 概念”的速度变快了。

如果你 2026 年才决定开始学 Rust——直接把 Cursor / Claude Code 当老师用——比硬翻 the book 高效一档。

我的判断

回到开头那个问题——“下个项目选 Java 还是 Rust?”

我的真实判断是:80% 的研发场景都是 Java——业务为王,性能足够就好;剩下 20% 是 Rust 的主场——长尾延迟敏感、嵌入式、桌面端、WASM、系统组件。

Java 党要不要转 Rust? 我的建议:

  • 不要全栈转——Java 的就业市场和生态给你的护城河放下不可惜;
  • 学一门”二语言”——花 3 个月通读 the book + 写一个开源小项目——Rust 思维会反向影响你写 Java 的方式(更注重所有权、更少 null、更少共享可变状态);
  • 遇到合适的项目再用——比如自家项目的某个高性能组件、某个嵌入式 demo、某个 CLI 工具——先小成本试。

选语言不是站队——是选「这个团队、这个项目、这个时间窗口」最合适的那个。Java 写得快、Rust 跑得稳——你想要的是哪一个?

文章目录
  1. 1. Java 程序员开始看 Rust 这件事
  2. 2. Rust 三大卖点解决了 Java 的什么真痛
    1. 2.0.1. 卖点 1:没 GC——治好 Java 的”Full GC 抖动焦虑”
    2. 2.0.2. 卖点 2:编译期消除一大类 NPE / 数据竞争
    3. 2.0.3. 卖点 3:工具链一次性给齐——比 Java 生态更省事
  • 3. Java vs Rust:7 个维度的真实差距
  • 4. 选型决策矩阵:你这个项目该选 Java 还是 Rust
  • 5. Java 程序员入门 Rust 的真实成本
    1. 5.0.1. 第 1 周:跟编译器斗智斗勇
    2. 5.0.2. 第 1 个月:能写跑通的服务,但代码丑
    3. 5.0.3. 第 3 个月:开始理解所有权和生命周期
  • 6. AI Coding 时代,Rust 的入门成本被砍掉一大半
  • 7. 我的判断