找回密码
立即注册
搜索
发回帖 发新帖

4744

积分

0

好友

604

主题
发表于 1 小时前 | 查看: 2| 回复: 0

Part 1:引言

大家好,我是小米,31 岁,仍然在一线写 Java。

上周去一家中厂面试,面试官是个典型“见过世面”的老 Java。他一边翻简历,一边笑着问我:

“现在 Go、Rust、Node 这么多,你们为什么还在用 Java?”
“还有,Java WebServer 做 SSL Termination 这么慢,为什么大家还非要在前面加一层 Nginx?”

他语气很随意,但我心里“咯噔”一下——这不是在考语法,也不是在考 API,而是在考你是不是一个真正做过线上系统的人。

所以这篇文章,我不打算用“Java 很成熟”“生态很丰富”这种套话糊你。我给你讲一个故事。

Part 2:先讲个故事,一家越来越大的“火锅店”

我们先把技术世界放一放。假设你在经营一家火锅店。

第一年

  • 店面很小
  • 老板就是你
  • 切菜、煮锅、收钱你全干

这个阶段,用什么语言无所谓,Java、Go、Node 都能活。

第二年

生意好了。

  • 客人多了
  • 开始请服务员
  • 后厨开始分工

你发现一个问题:老板什么都干,反而慢了。 于是你开始“分层”。

  • 前台只负责接待
  • 后厨只负责做菜
  • 收银专门收钱

现在,把这家火锅店映射到一个 Web 系统:

火锅店角色与Web系统职责对应关系

这,就是为什么我们要讲 Reverse Proxy。

Part 3:为什么 2025 年了,还在用 Java?

先回答第一个问题。面试官真正想听什么?他绝不是想听你说:

  • Java 稳定
  • Java 老牌
  • Java 生态好

这些话,他自己都能背。他真正想听的是:

Java 在“复杂系统”里,到底解决了什么问题?

Part 4:Java 的核心优势,从来不是“快”

我经常跟新人说一句话:

Java 的优势,从来不是跑得最快,而是“最不容易跑歪”。

你可以用一句话总结 Java 的定位:

Java 是一个 为“长期运行、多人协作、复杂业务”而生的语言。

1、JVM = 一套工业级地基

JVM 提供的是什么?

  • 内存管理
  • 垃圾回收
  • JIT 编译
  • 安全沙箱

这意味着什么?Java 程序员专注业务,JVM 负责兜底。 在真实的公司里,最怕的从来不是“慢 10ms”,而是:

  • 内存泄漏
  • 随机崩溃
  • 一周后才出现的问题

2、Java 不是一个人写的,是一群人维护的

Java 项目最大的优势,其实是:

  • 强类型
  • 明确的边界
  • 清晰的接口

你离职三年后,别人还能接手。

Part 5:故事回到火锅店,为什么 SSL 不该让 Java 干?

好,重点来了。

1、什么是 SSL Termination?

说句人话:SSL Termination = 解密 HTTPS。 浏览器发来的数据是加密的,服务器要先解密,才能看到内容。

2、你让谁来干这件事?

选项只有两个:

  1. Java WebServer(Tomcat / Spring Boot)
  2. 专门的 Reverse Proxy(Nginx)

Part 6:为什么 Java terminate SSL “慢”?

先给结论:

不是 Java 慢,是 Java“不擅长干这个活”。

SSL 解密,本质是三件事:

  1. CPU 密集型计算(RSA / ECDHE)
  2. 大量短连接
  3. IO + 加密混合操作

而 Java WebServer 的特点是:

Java WebServer线程模型与优化方向

用 Java terminate SSL 的后果?

  • 线程被 SSL 握手占满
  • GC 压力上升
  • 业务响应被拖慢

这就像什么?你让火锅店的大厨去门口安检、刷身份证、收外卖。 不是他不会,是太浪费。

Part 7:Reverse Proxy 的真正价值,不只是“快”

很多人以为:

Nginx 放前面,是为了“性能”。

这只对了一半。

1、Reverse Proxy 更像什么?

更像火锅店的 专业前台 + 门卫 + 调度中心。 它干的事情包括:

  • SSL Termination
  • 连接复用
  • 限流
  • 熔断
  • 灰度
  • 负载均衡

2、对比一下职责划分

Nginx与Java应用职责划分表

这叫“专业的事,交给专业的工具”。

Part 8:一个真实的架构对比

1、不推荐的做法

不推荐架构:Browser通过HTTPS直达Spring Boot终止SSL

问题:

  • Java 承担太多职责
  • 扩展成本高
  • 性能不可控

2、推荐的做法

推荐架构:Nginx终止SSL后通过HTTP代理到Spring Boot

好处:

  • Java 专心写业务
  • SSL 可横向扩展
  • 架构清晰

Part 9:看点代码,Spring Boot 的“正确姿势”

1、Spring Boot 只监听 HTTP

Spring Boot配置监听8080端口

2、Nginx 负责 SSL

Nginx配置SSL终止并反向代理到8080

3、Java 只管业务

Spring Boot OrderController业务代码示例

你会发现:

Java 代码干净得像刚洗过的锅。

Part 10:为什么大厂都这么干?

不是因为他们“迷信 Nginx”,而是因为:

  • SSL 证书要轮换
  • 加密算法要升级
  • 安全策略经常变

这些事,放在 Java 代码里是灾难。

Part 11:面试官真正想要的答案

如果你在面试中被问到这个问题,可以这样总结:

  • Java 依然适合复杂、长期运行的业务系统
  • Java WebServer 不适合承担 SSL Termination 这种网络密集型工作
  • Reverse Proxy 的核心价值是职责分离,而不是单纯的性能
  • 架构的本质,是让每一层做最擅长的事情

Part 12:总结

技术选型,从来不是“谁更快”,而是:谁更适合站在那个位置上。

Java 像一个经验丰富的大厨,Nginx 像一个效率极高的前台。你让他们各司其职,系统自然跑得稳、跑得久、跑得远。




上一篇:Agent框架选型:几个if就能搞定的需求,还要上框架吗?
下一篇:DA1469x 电量计算法解析:电池SoC估算与充电过程详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-5 08:49 , Processed in 0.068309 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表