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(异步非阻塞)

相关推荐
于先生吖2 小时前
基于 SpringBoot 架构,高性能 JAVA 动漫短剧系统源码
java·开发语言·spring boot
斌味代码2 小时前
SpringBoot 3 实战:虚拟线程、全局异常处理与 JWT 鉴权完整方案
java·spring boot·后端
电商API&Tina2 小时前
跨境电商如何接入1688官方寻源通接口?附接入流程
java·数据库·python·sql·oracle·json·php
Mr_Xuhhh2 小时前
深入理解Java Map与Set:从二叉搜索树到哈希表,全面解析搜索数据结构
java·数据结构·散列表
于先生吖2 小时前
支持二开与商用,JAVA 漫剧付费观看系统完整源码
java·开发语言
曹牧2 小时前
Java: 从oracle表中获取一组kv序列
java·开发语言·oracle
Lyyaoo.2 小时前
【Java基础面经】Java 注解的底层原理
java·开发语言·python
妙蛙种子3112 小时前
【Java设计模式 | 创建者模式】 抽象工厂模式
java·开发语言·后端·设计模式·抽象工厂模式
雄哥0073 小时前
spring 升级记录
java·后端·spring·spring升级