请求响应时间(RT)一般由:客户端网络 → DNS → TCP 握手 → 服务端处理 → 数据库 / 中间件 IO → 网络回包 → 客户端渲染 多段组成,优化思路按「由外到内、先瓶颈后细节」。
公式:
总RT = 网络耗时 + 服务处理耗时 + 下游依赖耗时 + 序列化/反序列化耗时
一、网络层优化(最容易感知到延迟)
缩短物理距离
接入 CDN:静态资源(图片、JS、CSS、静态接口)就近节点缓存,减少跨地域访问。
多活 / 就近接入:用户访问就近机房,避免跨城 / 跨洲长链路。
协议优化
HTTP/2 → HTTP/3(QUIC):多路复用,消除队头阻塞;QUIC 基于 UDP,握手更快,弱网友好。
开启 TCP 参数调优:tcp_tw_reuse、调整缓冲区、BBR 拥塞控制(Linux)。
减少往返次数
合并请求、资源合并;接口批量查询,避免串行多次调用。
预连接(preconnect)、持久连接(Keep-Alive)复用 TCP 连接,减少重复握手。
压缩
开启 gzip / Brotli 压缩响应体,减小包大小,降低传输耗时。
二、客户端 & 网关层优化
缓存
浏览器缓存:Cache-Control、ETag、Last-Modified,静态资源强缓存,接口使用协商缓存。
网关层缓存(Nginx/APISIX/Traefik):热点接口直接在网关返回,不打到后端服务。
网关限流 & 熔断 防止突增流量压垮后端,避免排队导致 RT 暴涨;超时设置合理,不要无限等待。
DNS 优化
用就近 DNS、DNS 预解析,降低 DNS 解析延迟;配置 TTL 合理,减少频繁解析。

三、应用服务层优化(Java/SpringBoot 这类业务服务重点)
减少串行等待,并行化
多个独立下游调用:把串行调用改成并行(线程池 / CompletableFuture)。
只查询必要字段,禁止
select *。
序列化优化
替换 Jackson 为更快序列化:Hessian、Protobuf、FlatBuffers(接口协议升级)。
减少返回字段,大对象懒加载,避免不必要对象创建。
JVM 优化(Java)
合理堆大小、选择低延迟 GC:ZGC / Shenandoah,减少 STW 停顿。
消除热点锁、避免锁竞争;减少频繁创建短生命周期对象,降低 GC 压力。
线程模型
IO 密集型:异步非阻塞(WebFlux、Netty),避免 Tomcat 线程被 IO 阻塞排队。
线程池参数合理,队列不要过大,防止请求堆积排队。
业务逻辑精简
去掉不必要校验、日志(大量 debug 日志很耗性能)、冗余计算。
大循环、复杂计算做预处理 / 预计算。
四、存储 & 中间件优化(大部分系统瓶颈在这里)
数据库
索引优化:建立合适 B + 树索引,避免全表扫描;防止索引失效(隐式转换、like 前缀模糊、函数操作)。
减少事务时长:小事务,不要长事务锁表;拆分大事务。
分页优化:避免 offset 大分页,使用主键游标分页。
读写分离:读请求走从库,主库只写。
分库分表:数据量巨大时,水平拆分,降低单表扫描压力。
缓存(Redis 为主)
热点数据前置到 Redis,把 DB 查询变成内存查询,极大降低 RT。
缓存策略:Cache-Aside;防缓存穿透、击穿、雪崩。
Redis 本身优化:合理持久化(RDB/AOF)、集群就近访问、pipeline 批量命令,减少多次网络往返。
原则:能读缓存就不查库
消息队列
如果是同步接口,尽量不要同步等待 MQ 结果;异步化把长任务剥离出主链路,主请求快速返回。
五、架构层面根治长 RT
异步化:非强一致性的业务,主链路只做落库 + 发消息,后台异步处理,前端轮询 /websocket 拿结果,主请求 RT 大幅下降。
预计算:报表、统计、大盘数据,定时提前算好存入 Redis,请求直接读取结果,实时计算改离线预计算。
降级:非核心功能降级,保证核心链路低延迟。
服务拆分:避免单体大服务锁竞争、资源争抢;但是不要过度拆分,否则增加跨服务调用开销。
六、观测手段(先定位瓶颈,不要盲目优化)
链路追踪:SkyWalking / Pinpoint / Jaeger,看每个阶段耗时,找到慢节点(网络 / DB / 下游)
指标:P50/P95/P99 响应时间(看 P99,而不是平均值)
数据库慢 SQL、Redis 慢命令、线程 dump、GC 日志
优先级推荐(落地顺序)
先加链路追踪,定位瓶颈(不要猜)
热点数据增加缓存(收益最大)
慢 SQL 优化索引
并行化串行依赖调用
网络:CDN、压缩、HTTP2
JVM、锁、序列化等代码层面微调
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢