Web 技术栈概念梳理
本文档梳理 Spring Boot Web 开发中常涉及的几组概念:Servlet / WebFlux、Tomcat / Netty、HttpServletResponse / ServerHttpResponse,以及 spring-boot-starter-web / spring-boot-starter-webflux。
1. Servlet 与 WebFlux
Servlet
- 定义:Java EE 标准里的 Web API,采用「一个请求一个线程」的同步、阻塞模型。
- 技术栈 :
spring-boot-starter-web→ 内嵌 Tomcat + Spring MVC。 - 特点 :每个请求占用一个线程直到处理结束;请求/响应类型为
HttpServletRequest/HttpServletResponse;代码为同步写法。
WebFlux
- 定义:Spring 的响应式 Web 框架,基于 Reactor(Netty),用少量线程通过事件驱动处理大量并发。
- 技术栈 :
spring-boot-starter-webflux→ 内嵌 Netty + Spring WebFlux。 - 特点 :非阻塞 IO;返回
Mono/Flux;请求/响应类型为ServerHttpRequest/ServerHttpResponse。
如何判断当前环境
| 判断依据 | Servlet(MVC) | WebFlux |
|---|---|---|
| 依赖 | 有 spring-boot-starter-web |
仅有/主要用 spring-boot-starter-webflux |
| 启动日志 | Tomcat started on port(s) |
Netty started on port(s) |
| 可注入的类型 | HttpServletRequest / HttpServletResponse |
ServerHttpRequest / ServerHttpResponse |
能否切换
可以,但属于「换一套 Web 栈」:需改依赖(去掉一种 starter、保留另一种),并相应改写 Controller、Filter、异常处理等(同步 ↔ 响应式),不是改一个配置即可。
2. Tomcat 与 Netty
Tomcat
- 定位 :Servlet 容器(Web 容器 / 应用服务器)。
- 职责:接收 HTTP 请求,按 Servlet 规范交给应用(如 Spring MVC),再写回响应。
- 模型:同步、阻塞,一个请求占用一个工作线程。
- 常见用法:运行 Spring MVC、JSP、传统 Java Web 应用。
Netty
- 定位 :网络应用框架(不是 Servlet 容器)。
- 职责:基于 NIO 的非阻塞网络通信(TCP/UDP/HTTP 等),负责连接管理、编解码、事件驱动等。
- 模型:少量线程 + 事件循环,适合高并发、长连接。
- 在 Spring 中的角色 :作为 Spring WebFlux 的默认 HTTP 服务器,提供 HTTP 能力。
对比小结
| 维度 | Tomcat | Netty |
|---|---|---|
| 角色 | Servlet 容器 | 网络 IO 框架 |
| 规范 | 实现 Servlet 规范 | 不实现 Servlet |
| 模型 | 同步、阻塞 | 异步、非阻塞 |
| Spring | starter-web 内嵌 |
starter-webflux 使用 |
Tomcat是针对http层的。
Netty是一个网络组件,tcp,udp,http都可以。
Netty是基于Java NIO开发的,而Tomcat是Apache下的针对HTTP的服务器项目,前者更像一个中间件框架,后者更像一个工具。
3. HttpServletResponse 与 ServerHttpResponse
HttpServletResponse
- 来源 :
jakarta.servlet.http.HttpServletResponse(Servlet 规范)。 - 使用场景:Spring MVC(Servlet 环境),由 Tomcat 等容器在每次请求时注入。
- 设置响应头 :
response.setHeader(name, value)。
ServerHttpResponse
- 来源 :
org.springframework.http.server.reactive.ServerHttpResponse(Spring WebFlux)。 - 使用场景:Spring WebFlux(Reactive 环境),由 Netty 适配层提供。
- 设置响应头 :
response.getHeaders().add(name, value)。
为何在 Servlet 环境下要改用 HttpServletResponse
- 项目若为 Spring MVC + Tomcat ,容器只会注入 HttpServletResponse ,不会注入 ServerHttpResponse。
- ServerHttpResponse 是接口,在 Servlet 请求中无法被实例化/注入,会导致参数解析失败(如:
No primary or single unique constructor found for interface ServerHttpResponse)。 - 因此:Servlet 环境用 HttpServletResponse;WebFlux 环境用 ServerHttpResponse,二者不能混用。
4. spring-boot-starter-web 与 spring-boot-starter-webflux
spring-boot-starter-web
- 作用:引入「基于 Servlet 的 Web 应用」所需依赖。
- 包含:Spring MVC、内嵌 Tomcat、Jackson、校验等。
- 效果 :应用以同步、阻塞方式处理 HTTP;Controller 使用
HttpServletRequest/HttpServletResponse,返回普通对象或ResponseEntity。
spring-boot-starter-webflux
- 作用:引入「基于 Reactive 的 Web 应用」所需依赖。
- 包含:Spring WebFlux、Reactor Netty(内嵌 Netty)、Reactor 等。
- 效果 :应用以异步、非阻塞方式处理 HTTP;Controller 使用
ServerHttpRequest/ServerHttpResponse,返回Mono/Flux。
对比小结
| 项目 | spring-boot-starter-web | spring-boot-starter-webflux |
|---|---|---|
| Web 框架 | Spring MVC | Spring WebFlux |
| 内嵌服务器 | Tomcat | Netty |
| 请求/响应类型 | HttpServletRequest/Response | ServerHttpRequest/Response |
| Controller 返回 | 普通对象、ResponseEntity | Mono<T>、Flux<T> |
| 编程风格 | 同步、阻塞 | 响应式、非阻塞 |
5. 关系总览
Spring Boot Web 选型
├── spring-boot-starter-web
│ ├── Spring MVC(同步)
│ └── Tomcat(Servlet 容器)
│ └── HttpServletRequest / HttpServletResponse
│
└── spring-boot-starter-webflux
├── Spring WebFlux(响应式)
└── Netty(网络框架,作为 HTTP 服务器)
└── ServerHttpRequest / ServerHttpResponse
- 选 starter-web:MVC + Tomcat + Servlet API。
- 选 starter-webflux:WebFlux + Netty + Reactive API。
- 二者是两套不同的技术栈,不能在同一应用中混用请求/响应类型(如 Servlet 环境下不能注入
ServerHttpResponse)。
文档基于项目实践整理,便于后续选型与排错时查阅。