一次完整的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 → 浏览器。

面试要讲清每一层职责、执行顺序、异常处理、性能瓶颈和排查手段。


一、先纠偏原答案

  1. “SYM 报文”是错的
    是 SYN。三次握手:客户端发 SYN → 服务端回 SYN+ACK → 客户端回 ACK。

  2. DNS 不是简单“逐级向上”
    浏览器先查自身缓存、OS 缓存、hosts;没有则请求本地 DNS。本地 DNS 通常递归查询,向根、顶级、权威 DNS 迭代查询,最终拿到 IP。

  3. HTTPS 不是“额外走一遍 TLS”这么简单
    TCP 建立后做 TLS 握手:ClientHello、ServerHello、证书校验、密钥协商、Finished。TLS 1.3 简化到 1-RTT,甚至 0-RTT。之后 HTTP 数据用对称加密传输。

  4. Nginx 和 API 网关顺序不绝对
    常见链路:CDN → WAF → SLB/LVS → Nginx → API 网关 → Java 服务。Nginx 本身也可做网关,API 网关也可替代部分 Nginx 功能。

  5. Filter 和 Interceptor 顺序要准确
    Filter 属于 Servlet 容器,先执行;Interceptor 属于 Spring MVC,在 DispatcherServlet 之后、Controller 之前执行。顺序是:Filter → DispatcherServlet → Interceptor.preHandle → Controller → Interceptor.postHandle → afterCompletion → Filter 后置。

  6. Controller 不只是分发
    Controller 负责参数绑定、@Valid 校验、DTO 转换、调用 Service、组装响应。核心业务放 Service。

  7. @ResponseBody 才序列化 JSON
    @RestController = @Controller + @ResponseBody。没有 @ResponseBody,返回的是视图名,由 ViewResolver 解析;有异常不一定“报错”,会被 @ControllerAdvice 统一处理。

  8. 返回不是严格“原路逐层回传”
    是调用栈逐层返回,同时 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 兜底。面试不能只背步骤,要讲清每层职责、执行顺序、异常处理、性能瓶颈和排查手段。

posted @ 2026-06-12 17:25  堭鍙銤  阅读(22)  评论(0)    收藏  举报