一次完整的http请求的完整生命周期
前端浏览器发起的请求,第一步是DNS域名解析,浏览器先查本地缓存和hosts文件,找不到,就请求本地的DNS服务器,逐级向上查询根域名服务器,顶级权威域名服务器,最终解析出真实的服务器IP地址,没有ip,一切网络请求,都是无从存在。
拿到IP之后,客户端开始简历TCP网络连接,也就是三次握手,客户端发送SYM报文,服务端回应SYN+ACK报文,最后客户端回复ACK确认。双向通道正式建立。
如果是https的请求,还要额外走一遍TLS加密握手,完成密钥协商,与数据加密。这就是HTTP和HTTPS的区别。
请求建立完成了,请求最先抵达的是Nginx反向代理,再统一走到API网关,网关承载负载均衡,路由分发,统一鉴权,限流熔断,灰度发布,日志埋点等核心功能,把请求精准的转发到对应的后端服务实例。
进入java服务内部,请求会依次的经历两层拦截机制,最先执行的是SpringMvc的一个filter过滤器,主要做全局的编码过来,跨域处理,通用的请求拦截,走完过滤器,才会进入springmvc的拦截器Interceptor,用来做登录校验,权限判断,接口耗时统计,访问频次限制,层层限制,全部放行后,请求才正式进入Controller控制层,负责接受的潜能请求参数,完成基础的参数校验,只做请求分发,不处理核心的业务,紧接就用Service业务层,这个就是整个项目的核心,所有的业务逻辑编排、事务控制,接口幂等这些处理全部写在这层,需要操作数据库,就会进入持久层,通过mybatis执行SQL语句,完成数据的增删改查和数据库完成数据交互,所有的业务执行逻辑完成后,数据不会直接返回,而是按照进来的层级,原路逐层回传,从持久层到service到Controller,只有加上
@ResponseBody的注解,后端才会自动把数据序列化为JSON格式,返回给前端,没有的话,只会返回视图,报错误异常。
AI总结:
作为资深架构师,这道题我会答成:一个请求从浏览器到数据库再返回,不是简单“DNS→TCP→Nginx→Controller”,而是一条完整的全链路:网络接入、网关治理、Spring MVC 拦截、业务分层、持久化、序列化返回、异常兜底和可观测性。
核心一句话:
DNS 解析 → TCP 三次握手 → TLS 握手 → CDN/WAF/SLB/Nginx → API 网关 → Servlet Filter → Spring Interceptor → Controller → Service → DAO/MyBatis → DB → 逐层返回 → @ResponseBody 序列化 JSON → 浏览器。
面试要讲清每一层职责、执行顺序、异常处理、性能瓶颈和排查手段。
一、先纠偏原答案
-
“SYM 报文”是错的
是 SYN。三次握手:客户端发SYN→ 服务端回SYN+ACK→ 客户端回ACK。 -
DNS 不是简单“逐级向上”
浏览器先查自身缓存、OS 缓存、hosts;没有则请求本地 DNS。本地 DNS 通常递归查询,向根、顶级、权威 DNS 迭代查询,最终拿到 IP。 -
HTTPS 不是“额外走一遍 TLS”这么简单
TCP 建立后做 TLS 握手:ClientHello、ServerHello、证书校验、密钥协商、Finished。TLS 1.3 简化到 1-RTT,甚至 0-RTT。之后 HTTP 数据用对称加密传输。 -
Nginx 和 API 网关顺序不绝对
常见链路:CDN → WAF → SLB/LVS → Nginx → API 网关 → Java 服务。Nginx 本身也可做网关,API 网关也可替代部分 Nginx 功能。 -
Filter 和 Interceptor 顺序要准确
Filter 属于 Servlet 容器,先执行;Interceptor 属于 Spring MVC,在 DispatcherServlet 之后、Controller 之前执行。顺序是:Filter → DispatcherServlet → Interceptor.preHandle → Controller → Interceptor.postHandle → afterCompletion → Filter 后置。 -
Controller 不只是分发
Controller 负责参数绑定、@Valid校验、DTO 转换、调用 Service、组装响应。核心业务放 Service。 -
@ResponseBody 才序列化 JSON
@RestController = @Controller + @ResponseBody。没有@ResponseBody,返回的是视图名,由 ViewResolver 解析;有异常不一定“报错”,会被@ControllerAdvice统一处理。 -
返回不是严格“原路逐层回传”
是调用栈逐层返回,同时 Filter、ResponseBodyAdvice、AOP 可包装响应。
二、2 分钟面试逐字稿
一个前端请求到后端,我会按网络接入、网关、Spring MVC、业务分层、持久化、返回六段讲。
第一,DNS 解析。浏览器先查自身缓存、OS 缓存、hosts 文件;没有就请求本地 DNS。本地 DNS 递归查询根、顶级、权威 DNS,最终拿到真实 IP。
第二,建立连接。客户端发 SYN,服务端回 SYN+ACK,客户端回 ACK,三次握手完成。如果是 HTTPS,还要做 TLS 握手:ClientHello、ServerHello、证书校验、密钥协商、Finished,之后用对称密钥加密 HTTP 数据。
第三,接入层。请求先到 CDN、WAF、SLB/LVS,再到 Nginx 反向代理。Nginx 做负载均衡、静态缓存、限流、SSL 卸载。再往后是 API 网关,做路由分发、统一鉴权、限流熔断、灰度发布、日志埋点、协议转换。
第四,Java 服务内部。请求到 Tomcat 后,先走 Servlet Filter,做编码、CORS、TraceId、请求包装、XSS 过滤。然后进 DispatcherServlet,通过 HandlerMapping 找到 Controller,再走 HandlerInterceptor 的 preHandle,做登录校验、权限判断、接口耗时、频控。全部放行后进入 Controller。
Controller 负责参数绑定、
@Valid校验、DTO 转换、调用 Service,不写核心业务。Service 是核心,做业务编排、事务控制、幂等、缓存、MQ、远程调用。需要落库时进 DAO/Mapper,通过 MyBatis 执行 SQL,走 HikariCP 连接池和数据库。第五,返回。Service 返回后,Controller 返回结果。如果有
@ResponseBody或@RestController,由 HttpMessageConverter 把对象序列化成 JSON。然后 Interceptor 的 postHandle、afterCompletion 执行,Filter 后置处理,最后通过 TCP/TLS 返回浏览器。第六,异常和可观测。全局异常用
@ControllerAdvice + @ExceptionHandler统一处理,返回标准错误码。全链路用 TraceId 贯穿,日志、Metrics、Tracing 监控 QPS、RT、错误率、连接池、慢 SQL。总结:网络层解决“怎么到”,网关解决“怎么进”,Filter/Interceptor 解决“能不能进”,Controller/Service/DAO 解决“怎么处理”,ResponseBody 解决“怎么回”。每一层都有职责边界和性能风险。
三、全链路拆解表
| 层级 | 组件 | 核心职责 | 常见问题 |
|---|---|---|---|
| DNS | 浏览器/OS/本地DNS/根/权威 | 域名转 IP | 解析慢、劫持、缓存 |
| 传输 | TCP | 三次握手、可靠传输 | 连接超时、重传 |
| 安全 | TLS | 证书、密钥协商、加密 | 握手慢、证书过期 |
| 接入 | CDN/WAF/SLB/Nginx | 加速、防护、负载均衡 | 回源、502/504 |
| 网关 | Spring Cloud Gateway/Kong | 路由、鉴权、限流、灰度 | 路由错、限流误杀 |
| Servlet | Filter | 编码、CORS、TraceId、包装 | 顺序、重复执行 |
| Spring MVC | DispatcherServlet/Interceptor | 分发、拦截、权限 | 拦截器不生效 |
| Controller | @RestController | 参数、校验、组装 | 业务侵入、参数错 |
| Service | @Service/@Transactional | 业务、事务、幂等 | 事务失效、长事务 |
| DAO | MyBatis/Mapper | SQL、映射 | 慢 SQL、N+1 |
| DB | MySQL/连接池 | 持久化 | 锁、连接池满 |
| 返回 | HttpMessageConverter | JSON 序列化 | 循环依赖、脱敏 |
四、Java 层关键点
1. Filter vs Interceptor
| 维度 | Filter | Interceptor |
|---|---|---|
| 规范 | Servlet | Spring MVC |
| 执行 | DispatcherServlet 前 | Handler 前 |
| 能拿 | Request/Response | HandlerMethod |
| 用途 | 编码、CORS、TraceId | 登录、权限、耗时 |
| 顺序 | 先 | 后 |
执行顺序:
Filter.doFilter
→ DispatcherServlet
→ Interceptor.preHandle
→ Controller
→ Interceptor.postHandle
→ Interceptor.afterCompletion
Filter 后置
2. @ResponseBody 原理
@RestController=@Controller + @ResponseBody;RequestResponseBodyMethodProcessor处理;HttpMessageConverter如 Jackson 序列化 JSON;- 可配
@JsonInclude、@JsonIgnore、脱敏注解。
3. 全局异常
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BizException.class)
public Result<?> handle(BizException e) {
return Result.fail(e.getCode(), e.getMessage());
}
}
4. 事务
@Transactional加在 Service;- 默认回滚
RuntimeException和Error; - checked 异常要
rollbackFor = Exception.class; - 自调用、private、异常被 catch、多线程会失效;
- 事务内不要远程调用、长 IO。
5. 可观测
- TraceId:Filter 生成,MDC 写入,日志输出;
- Micrometer + Prometheus + Grafana;
- SkyWalking/Zipkin 链路追踪;
- 慢 SQL、连接池、线程池监控。
五、网络层关键点
1. DNS
- 浏览器缓存 → OS 缓存 → hosts → 本地 DNS;
- 本地 DNS 递归查询根、顶级、权威;
- 返回 IP,浏览器缓存 TTL。
2. TCP 三次握手
- Client → SYN;
- Server → SYN+ACK;
- Client → ACK;
- 目的:确认双方收发能力,同步序列号。
3. TLS 握手
- ClientHello:支持的版本、加密套件、随机数;
- ServerHello:选定套件、随机数、证书;
- 客户端校验证书,生成预主密钥;
- 双方生成会话密钥;
- Finished 验证;
- 之后对称加密传输。
4. HTTP/HTTPS 区别
- HTTP 明文;
- HTTPS = HTTP + TLS;
- 默认端口 80/443;
- HTTPS 防窃听、防篡改、防冒充。
六、面试官可能追问
Q1:Filter 和 Interceptor 区别?
Filter 是 Servlet 规范,先执行,能包装 Request/Response;Interceptor 是 Spring MVC,后执行,能拿 HandlerMethod,适合权限和日志。
Q2:@ResponseBody 怎么变成 JSON?
由 RequestResponseBodyMethodProcessor 处理,HttpMessageConverter 如 Jackson 序列化。@RestController 自动加 @ResponseBody。
Q3:@Transactional 为什么失效?
自调用、private、异常被 catch、默认不回滚 checked 异常、多线程、数据库引擎不支持。
Q4:Nginx 和网关区别?
Nginx 偏四层/七层代理、静态资源、SSL、负载均衡;网关偏业务路由、鉴权、限流、灰度、协议转换。可组合使用。
Q5:怎么全链路排查慢请求?
TraceId 贯穿,看网关 RT、Nginx 日志、Filter/Interceptor 耗时、Service 方法耗时、慢 SQL、连接池、GC、线程池。
Q6:跨域在哪处理?
可在 Nginx、网关或 Filter 处理。Filter 加 CORS 头,或网关统一配置。预检 OPTIONS 要放行。
Q7:HTTPS 一定安全吗?
不是。证书校验、TLS 版本、加密套件、HSTS、防降级、防中间人。业务层还要防越权、注入、重放。
七、收尾话术
所以一个请求的全链路是:DNS 找 IP,TCP 建连接,TLS 保安全,CDN/Nginx/网关做接入治理,Filter/Interceptor 做横切拦截,Controller 接参,Service 编排业务,DAO 落库,@ResponseBody 序列化返回,全局异常和 TraceId 兜底。面试不能只背步骤,要讲清每层职责、执行顺序、异常处理、性能瓶颈和排查手段。

浙公网安备 33010602011771号