高并发的 Spring Boot Web 项目注意点

构建一个 高并发的 Spring Boot Web 项目 ,需要从架构设计、性能优化、稳定性、可扩展性 等多个维度综合考虑。下面我将系统性地为你梳理 必须考虑的关键问题和最佳实践


🚀 一、架构设计层面

1. 选择合适的 Web 模型

方案 适用场景 推荐
Spring MVC(Servlet Stack) 传统阻塞 I/O,适合中低并发 ✅ 简单项目
Spring WebFlux(Reactive Stack) 高并发、I/O 密集型(如网关、API 中心) ✅ 高并发首选
异步 Servlet + 线程池 折中方案,部分异步化 ⚠️ 过渡方案

建议

  • 高并发场景优先考虑 WebFlux + NettyMVC + 异步化改造

2. 分层架构与解耦

  • 严格分层:Controller → Service → Repository
  • 使用 CQRS(命令查询职责分离)缓解读写压力
  • 核心业务与非核心业务解耦(如日志、通知异步化)

3. 微服务 vs 单体

架构 优点 缺点 建议
单体应用 开发简单、部署方便 扩展性差、故障影响大 小团队、初期项目
微服务 可独立部署、弹性扩展 复杂度高、运维成本高 高并发、大团队

建议 :高并发项目建议采用微服务架构,便于横向扩展。


⚙️ 二、性能优化

1. 数据库优化

  • 索引优化 :避免全表扫描,使用 EXPLAIN 分析 SQL

  • 分库分表:使用 ShardingSphere 或 MyCat

  • 读写分离:主库写,从库读

  • 连接池配置

    yaml 复制代码
    spring:
      datasource:
        hikari:
          maximum-pool-size: 20  # 根据 DB 能力调整
          minimum-idle: 5

2. 缓存策略

缓存层级 技术 说明
本地缓存 Caffeine、Ehcache 速度快,适合热点数据
分布式缓存 Redis 共享缓存,支持高并发
多级缓存 Caffeine + Redis 先本地,后远程,降低 Redis 压力

✅ 使用 @Cacheable@CacheEvict 注解简化缓存逻辑。


3. 异步处理

  • 使用 @Async 将非核心逻辑异步化(如发送邮件、日志记录)

  • 配置自定义线程池:

    java 复制代码
    @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 压缩

    yaml 复制代码
    server:
      compression:
        enabled: true
        mime-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
java 复制代码
// 使用 Sentinel
@SentinelResource(value = "getUser", blockHandler = "handleBlock")
public User getUser(String id) { ... }

public User handleBlock(String id, BlockException e) {
    return User.defaultUser();
}

2. 降级与熔断

  • 使用 Resilience4jSentinel 实现:
    • 超时熔断
    • 异常比例熔断
    • 自动恢复
  • 提供 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 调优

bash 复制代码
-Xms2g -Xmx2g          # 堆内存大小
-XX:NewRatio=3         # 新生代比例
-XX:+UseG1GC           # 使用 G1 垃圾回收器
-XX:MaxGCPauseMillis=200

✅ 建议:生产环境使用 G1ZGC(JDK 11+)


🔐 五、安全考虑

  • 防 SQL 注入:使用 JPA / MyBatis 参数化查询
  • 防 XSS:输入过滤、前端转义
  • 防 CSRF:Token 校验(WebFlux 中需特别处理)
  • 接口鉴权:JWT + Redis 黑名单 或 OAuth2
  • 敏感信息加密 :如密码使用 BCryptPasswordEncoder

🧪 六、测试与压测

1. 压力测试

  • 使用 JMeter、Gatling 模拟高并发
  • 关注指标:
    • QPS(每秒请求数)
    • RT(响应时间)
    • 错误率
    • CPU / 内存 / GC 情况

2. 链路追踪

  • 使用 SkyWalkingZipkin 分析性能瓶颈

🧩 七、高并发设计模式

模式 说明
池化技术 数据库连接池、线程池、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 表格 吗?