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

相关推荐
Dicky-_-zhang13 分钟前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨13 分钟前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
fake_ss19825 分钟前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
茉莉玫瑰花茶42 分钟前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁1 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
No8g攻城狮2 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
xiaoerbuyu12332 小时前
开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件
java·开发语言
C+++Python2 小时前
C++ 进阶学习完整指南
java·c++·学习
zhangjw343 小时前
第11篇:Java Map集合详解,HashMap底层原理、哈希冲突、JDK1.8优化、遍历方式彻底吃透
java·开发语言·哈希算法