梳理 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 / HttpServletResponseServerHttpRequest / 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 能力。

对比小结

维度TomcatNetty
角色Servlet 容器网络 IO 框架
规范实现 Servlet 规范不实现 Servlet
模型同步、阻塞异步、非阻塞
Springstarter-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-webspring-boot-starter-webflux
Web 框架Spring MVCSpring WebFlux
内嵌服务器TomcatNetty
请求/响应类型HttpServletRequest/ResponseServerHttpRequest/Response
Controller 返回普通对象、ResponseEntityMono<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)。

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

Read more

GitHub Copilot安装使用

GitHub Copilot安装使用

GitHub Copilot 怎么安装使用 一、 安装前准备 1. 拥有一个 GitHub 账号:如果没有,请先在 GitHub 官网 注册。 2. 订阅 GitHub Copilot: * 访问订阅页面:登录 GitHub 后,访问 GitHub Copilot 官网。 * 选择订阅计划: * 个人版:适合独立开发者,提供 30 天免费试用,之后每月 $10 或每年 $100。 * 商业版 (Copilot for Business):适用于企业或团队,每位用户每月 $19。 * 教育优惠:学生、教师和热门开源项目维护者可免费使用,需通过身份验证。 * 完成支付:根据所选计划完成支付流程(个人版需绑定信用卡或

llama-cpp-python完整安装指南:5步解决90%新手问题 [特殊字符]

llama-cpp-python完整安装指南:5步解决90%新手问题 🎯 【免费下载链接】llama-cpp-pythonPython bindings for llama.cpp 项目地址: https://gitcode.com/gh_mirrors/ll/llama-cpp-python llama-cpp-python是专为llama.cpp库设计的Python绑定项目,为开发者提供了在Python环境中高效运行本地大语言模型的完美解决方案。通过该项目,您可以轻松实现文本生成、对话交互、多模态推理等AI功能,无需依赖云端API即可享受强大的本地AI推理能力。 🔧 一键编译配置技巧 环境配置是新手最容易遇到问题的环节。llama-cpp-python支持多种硬件加速后端,正确配置编译环境至关重要。 步骤1:基础环境检查 确保系统已安装Python 3.8+和C编译器: * Linux/Mac: gcc或clang * Windows: Visual Studio或MinGW * MacOS: Xcode命令行工具 步骤2:核心安装命令 pip in

【AIGC面试面经第七期】旋转位置编码RoPE:从 2D 到 nD 的完美扩展之旅

【AIGC面试面经第七期】旋转位置编码RoPE:从 2D 到 nD 的完美扩展之旅

AIGC面试面经项目: https://github.com/WeThinkIn/AIGC-Interview-Book * 1. 正余弦位置编码也有外推、相对距离表达、远程衰减,为什么大模型都用RoPE? * 2. RoPE的base有什么作用、在控制什么? * 3. RoPE为何能从2维扩展到n维? * 4. Qwen中RoPE有GPT-J和GPT-NeoX两种实现,和理论不同,二者等价吗? * 5. 长度外推中传统位置编码的OOD问题是什么? * 6. 长度外推中RoPE的OOD问题是什么? * 7. RoPE是绝对位置编码,训练过程中到底在训练什么? * 8. 如何免训练外推RoPE?少量长文本训练如何强化外推? * 9. 从几何+傅里叶角度,n维RoPE整体在做什么、代表什么? * 10. RoPE高低频旋转圈数差异,和训练过程如何联系? 1. 正余弦位置编码也有外推、相对距离表达、远程衰减,为什么大模型都用RoPE? 原生sinusoidal正余弦位置编码公式为: { P E p o s , 2

让工作效率翻倍的终极神器之被工具定义的编程时代(VS Code + GitHub Copilot + JetBrains全家桶)

让工作效率翻倍的终极神器之被工具定义的编程时代(VS Code + GitHub Copilot + JetBrains全家桶)

目录 * 一、引言:被工具定义的编程时代 * 二、背景:传统开发模式的效率瓶颈 * 2.1 认知负荷过载 * 2.2 工具链断层 * 三、效率翻倍工具链深度解析 * 3.1 智能代码编辑器:从打字机到智能助手 * 3.2 版本控制大师:Git的隐藏技能 * 3.3 自动化脚本:解放生产力的魔法 * 3.4 协作平台:从信息孤岛到知识网络 * 四、工具链选型方法论 * 4.1 效率评估模型 * 4.2 定制化策略 * 五、总结:工具是能力的延伸 一、引言:被工具定义的编程时代 在GitHub Copilot单月生成代码量突破10亿行的今天,开发者早已告别“记事本+命令行”