高并发的 Spring Boot Web 项目注意点
构建一个 高并发的 Spring Boot Web 项目,需要从架构设计、性能优化、稳定性、可扩展性等多个维度综合考虑。下面我将系统性地为你梳理 必须考虑的关键问题和最佳实践。
🚀 一、架构设计层面
1. 选择合适的 Web 模型
方案 | 适用场景 | 推荐 |
---|---|---|
Spring MVC(Servlet Stack) | 传统阻塞 I/O,适合中低并发 | ✅ 简单项目 |
Spring WebFlux(Reactive Stack) | 高并发、I/O 密集型(如网关、API 中心) | ✅ 高并发首选 |
异步 Servlet + 线程池 | 折中方案,部分异步化 | ⚠️ 过渡方案 |
✅ 建议:
- 高并发场景优先考虑 WebFlux + Netty 或 MVC + 异步化改造。
2. 分层架构与解耦
- 严格分层:
Controller → Service → Repository
- 使用 CQRS(命令查询职责分离)缓解读写压力
- 核心业务与非核心业务解耦(如日志、通知异步化)
3. 微服务 vs 单体
架构 | 优点 | 缺点 | 建议 |
---|---|---|---|
单体应用 | 开发简单、部署方便 | 扩展性差、故障影响大 | 小团队、初期项目 |
微服务 | 可独立部署、弹性扩展 | 复杂度高、运维成本高 | 高并发、大团队 |
✅ 建议:高并发项目建议采用微服务架构,便于横向扩展。
⚙️ 二、性能优化
1. 数据库优化
- 索引优化:避免全表扫描,使用
EXPLAIN
分析 SQL - 分库分表:使用 ShardingSphere 或 MyCat
- 读写分离:主库写,从库读
- 连接池配置:
spring:datasource:hikari:maximum-pool-size: 20 # 根据 DB 能力调整minimum-idle: 5
2. 缓存策略
缓存层级 | 技术 | 说明 |
---|---|---|
本地缓存 | Caffeine、Ehcache | 速度快,适合热点数据 |
分布式缓存 | Redis | 共享缓存,支持高并发 |
多级缓存 | Caffeine + Redis | 先本地,后远程,降低 Redis 压力 |
✅ 使用
@Cacheable
、@CacheEvict
注解简化缓存逻辑。
3. 异步处理
- 使用
@Async
将非核心逻辑异步化(如发送邮件、日志记录) - 配置自定义线程池:
@Bean @Primary public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10);executor.setMaxPoolSize(50);executor.setQueueCapacity(100);executor.setThreadNamePrefix("async-");executor.initialize();return executor; }
4. 接口优化
- 避免 N+1 查询:使用
JOIN
或@EntityGraph
- 分页查询:避免
LIMIT 0, 1000000
- DTO 裁剪:只返回前端需要的字段
- GZIP 压缩:
server:compression:enabled: truemime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/json
🛡 三、稳定性与容错
1. 限流(Rate Limiting)
防止突发流量压垮系统:
- 单机限流:Guava RateLimiter
- 分布式限流:Redis + Lua 脚本,或使用 Sentinel
- 网关层限流:Nginx、Spring Cloud Gateway
// 使用 Sentinel
@SentinelResource(value = "getUser", blockHandler = "handleBlock")
public User getUser(String id) { ... }public User handleBlock(String id, BlockException e) {return User.defaultUser();
}
2. 降级与熔断
- 使用 Resilience4j 或 Sentinel 实现:
- 超时熔断
- 异常比例熔断
- 自动恢复
- 提供 fallback 降级逻辑
3. 幂等性设计
- 高并发下重复提交问题
- 解决方案:
- 唯一订单号 + 数据库唯一索引
- Redis 分布式锁(
SET order_id userId NX EX 60
) - Token 机制(提交时校验 token)
4. 日志与监控
- 日志:使用
MDC
记录traceId
,便于链路追踪 - 监控:
- Spring Boot Actuator(健康检查、指标)
- Prometheus + Grafana(性能监控)
- ELK(日志收集)
🌐 四、网络与部署
1. 负载均衡
- Nginx / LVS:四层/七层负载
- DNS 轮询:多机房部署
- 服务注册发现:Nacos、Eureka、Consul
2. CDN 加速
- 静态资源(JS、CSS、图片)走 CDN
3. JVM 调优
-Xms2g -Xmx2g # 堆内存大小
-XX:NewRatio=3 # 新生代比例
-XX:+UseG1GC # 使用 G1 垃圾回收器
-XX:MaxGCPauseMillis=200
✅ 建议:生产环境使用 G1 或 ZGC(JDK 11+)
🔐 五、安全考虑
- 防 SQL 注入:使用 JPA / MyBatis 参数化查询
- 防 XSS:输入过滤、前端转义
- 防 CSRF:Token 校验(WebFlux 中需特别处理)
- 接口鉴权:JWT + Redis 黑名单 或 OAuth2
- 敏感信息加密:如密码使用
BCryptPasswordEncoder
🧪 六、测试与压测
1. 压力测试
- 使用 JMeter、Gatling 模拟高并发
- 关注指标:
- QPS(每秒请求数)
- RT(响应时间)
- 错误率
- CPU / 内存 / GC 情况
2. 链路追踪
- 使用 SkyWalking 或 Zipkin 分析性能瓶颈
🧩 七、高并发设计模式
模式 | 说明 |
---|---|
池化技术 | 数据库连接池、线程池、HTTP 客户端池(如 OkHttp) |
批量处理 | 合并小请求(如 List<User> getUsers(List<String> ids) ) |
预加载 | 缓存预热、热点数据提前加载 |
懒加载 + 缓存 | 首次访问慢,后续快 |
事件驱动 | 使用 Spring Event 或 Kafka 解耦 |
✅ 八、推荐技术栈(高并发 Spring Boot)
类别 | 推荐技术 |
---|---|
Web 框架 | Spring Boot + Spring MVC 或 WebFlux |
数据库 | MySQL + ShardingSphere / PostgreSQL |
缓存 | Redis + Caffeine(多级缓存) |
消息队列 | Kafka / RocketMQ(异步解耦) |
限流熔断 | Sentinel / Resilience4j |
监控 | Prometheus + Grafana + SkyWalking |
部署 | Docker + Kubernetes + Nginx |
配置中心 | Nacos / Apollo |
网关 | Spring Cloud Gateway |
📌 九、总结:高并发 Spring Boot 项目 Checklist
类别 | 必做事项 |
---|---|
✅ 架构 | 分层清晰、解耦、考虑微服务 |
✅ 性能 | 缓存、异步、索引、连接池 |
✅ 稳定 | 限流、熔断、降级、幂等 |
✅ 监控 | 日志、指标、链路追踪 |
✅ 安全 | 鉴权、防攻击、加密 |
✅ 部署 | 负载均衡、JVM 调优、压测 |
为你提供一个 高并发 Spring Boot 项目模板 或 性能优化 checklist Excel 表格 吗?