Spring Boot内嵌Tomcat处理HTTP请求的完整过程
作者:invicinble
Spring Boot和Tomcat的结合可以让我们能够快速、方便地开发、部署和运行Java Web应用,这篇文章主要介绍了Spring Boot内嵌Tomcat处理HTTP请求的完整过程,文中通过代码介绍的非常详细,需要的朋友可以参考下
我们来完整、准确地梳理一遍 Spring Boot 内嵌 Tomcat 处理 HTTP 请求的全过程,并澄清 I/O 模型的问题。
完整流程(从客户端到响应返回)
假设你用 java -jar myapp.jar 启动了一个 Spring Boot 应用(内嵌 Tomcat),浏览器发起请求:
客户端 → 服务器:建立 TCP 连接
- 客户端(如浏览器)向服务器 IP:8080 发起 TCP 三次握手
- 成功后,TCP 连接建立(此时还没有任何 HTTP 数据)
客户端发送 HTTP 请求数据
- 在已建立的 TCP 连接上,客户端发送 原始 HTTP 报文(字节流),例如:
GET /api/user/1 HTTP/1.1 Host: localhost:8080 Accept: application/json
Tomcat 接收并解析 HTTP 请求
✅ 关键点:Tomcat 是 Servlet 容器,负责底层网络通信和 HTTP 协议解析
- Tomcat 的 连接器(Connector) 监听 8080 端口
- 接收 TCP 字节流 → 解析成 HttpServletRequest / HttpServletResponse 对象
- 这一步与 Spring 无关,是 Tomcat 自己完成的(基于 Servlet 规范)
🔧 I/O 模型问题(BIO / NIO):
- 传统 Tomcat(老版本默认):BIO(Blocking I/O)→ 每个请求一个线程,性能差
- 现代 Spring Boot 内嵌 Tomcat(默认):NIO(Non-blocking I/O) → 少量线程处理大量连接(基于 Java NIO 的 Selector 机制)
- Tomcat 10+ 还支持 NIO2(AIO)和 APR(本地库)
✅ 所以你说的“bno”很可能是 “BIO” 的误打,而实际情况是:现代 Spring Boot 默认用的是 NIO!
请求交给 Spring MVC 处理
- Tomcat 将
HttpServletRequest交给 Spring 的 DispatcherServlet - Spring MVC 开始工作:
- HandlerMapping:找到对应的
@Controller方法 - HandlerAdapter:调用你的业务方法(如
@GetMapping("/api/user/{id}")) - 参数解析:路径变量、JSON 转对象(使用 Jackson 等)
- 执行你的业务逻辑(Service、DAO、Redis、DB 等)
- HandlerMapping:找到对应的
构建 HTTP 响应
- 你的 Controller 方法返回对象(如
User) - Spring 用 HttpMessageConverter(如
MappingJackson2HttpMessageConverter)将其序列化为 JSON 字符串 - 写入
HttpServletResponse的输出流
Tomcat 发送响应 + 断开连接
- Tomcat 将响应组装成 HTTP 报文(含状态行、Header、Body)
- 通过同一个 TCP 连接发送回客户端
- 根据
Connection头决定是否保持连接(HTTP/1.1 默认 keep-alive):- 如果是 短连接(或客户端发了
Connection: close)→ 四次挥手断开 TCP - 如果是 长连接 → 连接保持,等待下一个请求(或超时后关闭)
- 如果是 短连接(或客户端发了
关键澄清
| 你提到的说法 | 实际情况 |
|---|---|
| “Tomcat 解析 HTTP 请求” | ✅ 正确,这是 Tomcat 的核心职责 |
| “其实是 bno” | ❌ 应为 NIO(非阻塞 I/O),不是 BIO(阻塞 I/O) |
| Spring Boot 默认 I/O 模型 | NIO(通过内嵌 Tomcat 的 NioEndpoint 实现) |
💡 你可以通过日志确认:
Spring Boot 启动时会打印:Tomcat initialized with port(s): 8080 (http)
并且底层使用的是org.apache.tomcat.util.net.NioEndpoint
总结全流程(简化版)
客户端 │ ▼ TCP 三次握手(建立连接) │ ▼ 发送 HTTP 请求字节流 │ ▼ Tomcat (NIO) 接收 → 解析为 HttpServletRequest │ ▼ Spring MVC DispatcherServlet 分发请求 │ ▼ 执行 @Controller 业务逻辑 │ ▼ 返回结果 → 序列化为 JSON │ ▼ Tomcat 写入 HttpServletResponse → 发送 HTTP 响应 │ ▼ 根据 Connection 头决定: ├─ keep-alive → 保持 TCP 连接(长连接) └─ close → TCP 四次挥手断开(短连接)
如果你对 NIO 的工作原理(Selector、Channel、Buffer)或者 Spring Boot 如何配置 Tomcat 的连接参数(如最大连接数、超时时间)感兴趣,也可以继续深入!
总结
到此这篇关于Spring Boot内嵌Tomcat处理HTTP请求的文章就介绍到这了,更多相关SpringBoot处理HTTP请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
