Nginx: 高性能 HTTP 服务器 / 代理**大门,**接收请求、转发、负载均衡、静态资源、高并发
- 纯异步非阻塞 + 多进程
- 1 个 master + 多个 worker
- 一个线程能扛几万并发,整体能抗~10WQps
- 只负责:接收请求 → 转发 → 返回结果
Tomcat: Java Web 容器**,**运行 Spring Boot、Java Web、Servlet、接口服务。
- 支持 BIO / NIO / APR
- 默认 NIO(异步非阻塞)
- 专门执行 Servlet / Spring MVC 业务逻辑
- 既要处理网络,又要跑业务代码
- 扛 几百~几千并发(受业务影响)
- 和jetty都是:一个请求绑定一个工作线程(servlet thread)
Jetty: 轻量级 Java Web 容器**,**微服务、嵌入式、云原生、小内存环境
- 架构比 Tomcat 简单
- 默认 NIO 异步非阻塞
- 嵌入式友好(Spring Boot 默认可切换)
Netty: 网络通信编程框架**,**自己写网关、MQ、游戏服务器、RPC、自定义协议
- 基于 Java NIO 封装的高性能网络框架
- 主从 Reactor 多线程模型
- 只处理网络连接、读写、编解码
- 不提供 Web 容器功能(不能直接跑 Spring MVC)
- RPC 框架(Dubbo、gRPC 都用 Netty)
Tomcat NIO 和 Jetty NIO 底层模型 完全相同:
- Selector 轮询(IO 多路复用)
- Accept 线程 → 接收连接
- Worker 线程组 → 处理读写
- 请求进入线程池 → 分配一个 servlet 线程
- 业务执行完毕 → 归还线程
重点:
只要是运行 Spring MVC(同步 Servlet) 不管 Tomcat 还是 Jetty,都会:一个请求占一个线程!
所以:线程模型一样 → 最大并发由线程池大小决定 → 性能接近
内存占用(Jetty 完胜)
- Jetty 内核极小,Jar 只有几百 KB
- 启动内存:Jetty 20~40M
- Tomcat 启动:80~150M+
Netty + Spring WebFlux 五大黄金应用场景
高并发网关 / API 网关(最适合!)
场景: 接入层、网关、路由、鉴权、限流、日志、请求转发 每秒几千~几万 QPS 大部分时间在等待下游服务响应(IO 密集型)
长连接、高在线量服务(IM、推送、聊天室)
场景:
- WebSocket 长连接
- 在线人数 1 万、10 万、100 万
- 消息推送、实时通知、IM 即时通讯
为什么适合?
- Tomcat 一个连接占一个线程,1 万连接 = 1 万线程,直接炸
- Netty 只需 4~8 个线程就能扛 10 万 + 长连接
- WebFlux 完美支持 WebSocket 响应式模型
IO 密集型微服务(大量调用第三方 / DB/HTTP)
场景:
- 服务内部大量远程调用
- 调用第三方接口(HTTP、Dubbo、gRPC)
- 频繁读写数据库、Redis、MQ
- CPU 空闲,线程全在等待
为什么适合?
- Spring MVC(同步):一个请求占一个线程,等待时线程闲置
- WebFlux:等待时线程立刻去处理别的请求
- 同样机器配置,并发能力提升 3~10 倍
4. 高并发、低延迟的核心接口
场景:
- 秒杀、商品列表、订单查询、用户中心
- 要求低延迟、高并发
- 流量波动大(平时低,峰值高)
为什么适合?
- Netty 性能极高
- 异步非阻塞,无线程阻塞浪费
- 抗尖峰能力极强
5. 流式数据、实时数据处理
场景:
- 服务端推送(SSE)
- 日志流、数据流
- 分批返回大量数据
WebFlux 天然支持 Flux 流式返回
Netty 采用三层架构:
- 主 Reactor(Boss 线程) :只负责接收客户端连接
- 从 Reactor(Worker 线程) :只负责读写数据、编解码
- 业务线程池 :只负责执行业务逻辑
Spring MVC+ tomcat NIO :网络层用 NIO 多路复用, 非阻塞、高效接收连接,业务层(Worker / Tomcat 线程池) ,处理 Spring MVC 业务,同步、阻塞、一个请求一个线程
Netty WebFlux :网络层异步非阻塞(Netty), 业务层异步非阻塞(响应式编程)= 真正的全链路异步非阻塞!
**响应式编程=**基于数据流 + 通知回调
Reactive Streams 规范(响应式流) 是一套为 JVM/JavaScript 平台 设计的 异步流处理标准 ,核心解决 非阻塞 + 背压(Backpressure) 问题,是 Spring WebFlux、Project Reactor、RxJava 等框架的底层基石。
数据流(Mono / Flux):Mono:0 或 1 个数据(单个结果),Flux:0 ~ N 个数据(列表 / 流)
异步回调(订阅才执行)
链式操作(流水线)
Mono<User> userMono = reactiveUserDao.getUserById(1L);
WebFlux:调用 → 注册回调 → 线程离开 → 结果回来再通知
- 响应式 Repository(数据库异步非阻塞)
不能用 JDBC / MyBatis(阻塞) 必须用 R2DBC / ReactiveMongo 等异步驱动
响应式 HTTP 调用(WebClient)
不能用 RestTemplate(阻塞) 必须用 WebClient(异步非阻塞)