梳理 Spring Boot Web 开发的几个概念

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)。

文档基于项目实践整理,便于后续选型与排错时查阅。

相关推荐
用户8876654266312 小时前
Linux 终端入门:新手必须掌握的常用命令和基本思路
前端·操作系统
Gopher_HBo12 小时前
接入层LVS
后端
404号扳手12 小时前
Java 基础知识(六)
java·后端
用户1257585243612 小时前
Vue3 后台框架的网络请求怎么设计?看 XYGo Admin 三套 Axios 实例与拦截器方案
前端
前端市界12 小时前
LotDB Vue 阿里云 ECS 部署实战记录
后端
卷无止境12 小时前
SimPy 进程通信:让仿真世界里的"对话"变得优雅
后端
ZengLiangYi12 小时前
多格式文件解析:JSONL / SQLite / Event Stream
前端·javascript·后端
前端市界12 小时前
使用 `acme.sh` + 阿里云 DNS API 申请 Let’s Encrypt 通配符证书,并配置 Nginx 自动续期
后端
卷无止境12 小时前
SimPy Events 深度解析:仿真世界的时间引擎
后端
Oo_行者_oO12 小时前
Spring Cloud 实现文件服务预览与静态资源映射
后端·spring