Nginx\Tomcat\Jetty\Netty

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 底层模型 完全相同

  1. Selector 轮询(IO 多路复用)
  2. Accept 线程 → 接收连接
  3. Worker 线程组 → 处理读写
  4. 请求进入线程池 → 分配一个 servlet 线程
  5. 业务执行完毕 → 归还线程

重点:

只要是运行 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:调用 → 注册回调 → 线程离开 → 结果回来再通知

  1. 响应式 Repository(数据库异步非阻塞)

不能用 JDBC / MyBatis(阻塞) 必须用 R2DBC / ReactiveMongo 等异步驱动

响应式 HTTP 调用(WebClient)

不能用 RestTemplate(阻塞) 必须用 WebClient(异步非阻塞)

相关推荐
ss27311 分钟前
食谱推荐系统功能测试如何写?
java·数据库·spring boot·功能测试
AI人工智能+电脑小能手30 分钟前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
try2find1 小时前
打印ascii码报错问题
java·linux·前端
014-code1 小时前
CompletableFuture 实战模板(超时、组合、异常链处理)
java·数据库
Nicander1 小时前
多数据源下@transcation事务踩坑
java·后端
それども2 小时前
DELETE 和 TRUNCATE TABLE区别
java·数据库·mysql
sjsjsbbsbsn2 小时前
大模型核心知识总结
java·人工智能·后端
白晨并不是很能熬夜3 小时前
【PRC】第 2 篇:Netty 通信层 — NIO 模型 + 自定义协议 + 心跳
java·开发语言·后端·面试·rpc·php·nio
斯普润布特4 小时前
物联网-Spring+Netty 框架整合
java·物联网·netty
简简单单就是我_hehe4 小时前
后端链路追踪局部采集和全量采集配置说明
java·开发语言