SpringBoot用起来爽,但默认配置是为开发便利设计的,不是为高并发。上线后QPS上不去、响应慢,往往不是代码逻辑问题,而是配置没调。下面7个实战技巧,每个都经过生产验证,照做就能见效。
一、调优内嵌Tomcat线程池
默认max-threads=200,但accept-count=100,高并发下请求直接排队。根据压测调整:server.tomcat.max-threads=500,accept-count=1000,max-connections=10000。如果接口平均耗时50ms,500线程理论QPS可达10000。注意别盲目调大,线程上下文切换也耗CPU,压测找最优值。
二、HikariCP连接池精细配置
SpringBoot默认HikariCP,但默认maximum-pool-size=10,数据库连接不够用。公式:连接数 = CPU核数 2 + 磁盘数。4核8G机器设20左右。关键参数:connection-timeout=3000,idle-timeout=600000,max-lifetime=1800000。开启leak-detection-threshold=60000,排查连接泄漏。曾把连接池从10调到20,接口P99从800ms降到120ms。
三、异步化与线程池隔离
耗时操作别阻塞主线程。用@Async配合自定义线程池,核心线程数按CPU核数/(1-阻塞系数)算。不同业务用不同线程池,避免相互影响。比如订单查询和日志写入分开。注意:@Async方法必须public,且同类调用不生效,要注入自身或拆类。
四、多级缓存减少数据库压力
Spring Cache + Caffeine做本地缓存,Redis做分布式缓存。热点数据先查Caffeine,未命中查Redis,再未命中查库。TTL设随机值防雪崩,布隆过滤器防穿透。一个商品详情接口,加缓存后QPS从300涨到5000,数据库负载降了80%。
五、启动优化:延迟初始化与裁剪自动配置
开发时快,上线后启动慢?开启spring.main.lazy-initialization=true,Bean用到才加载,启动时间减半。排除无用自动配置:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})。用spring-boot-maven-plugin的layers分层打包,配合Docker增量构建,部署快人一步。
六、日志异步与级别控制
同步日志写磁盘,高并发下直接拖垮接口。改用Logback异步Appender,队列大小设8192,丢弃策略选DiscardingThreshold。生产环境日志级别设INFO,别用DEBUG。关键路径打点用MDC加TraceId,排查问题不抓瞎。
七、JVM与Actuator监控
JVM选G1,-XX:MaxGCPauseMillis=50,-Xmx设为容器内存的70%。开启Actuator端点,监控/actuator/metrics看QPS、延迟、GC。用Prometheus + Grafana做大盘,异常告警。没有监控的优化都是盲猜,数据驱动才靠谱。
总结
这7个技巧,从容器、数据库、线程、缓存、启动、日志到监控,覆盖SpringBoot性能优化的主干。别一次性全上,按瓶颈逐个击破。先压测定位,再调参验证,最后固化配置。记住:优化不是堆配置,是让每个组件都在最佳状态工作。做好这七点,你的SpringBoot应用就能扛住生产流量。