提升基于 Spring Boot 的 Web 项目并发量需要从 应用优化、数据库调优、缓存策略、异步处理、水平扩展 等多方面综合改进。以下是具体方案和实践建议:
一、应用层优化
1. 代码性能优化
• 避免阻塞操作:减少同步锁、长事务、大文件处理等耗时操作。
• 优化 SQL 查询:避免 N+1
查询,使用索引,减少全表扫描。
• 复用对象:避免频繁创建大对象(如 JSON 解析工具),使用线程安全对象池。
2. 线程池配置
• 调整 Web 服务器线程池(如 Tomcat):
# application.yml
server:tomcat:max-connections: 8192 # 最大连接数accept-count: 100 # 等待队列长度threads:max: 200 # 最大工作线程数min-spare: 10 # 最小空闲线程数
• 自定义异步线程池:使用 @Async
处理非核心业务(如日志、邮件)。
@Configuration
@EnableAsync
public class AsyncConfig {@Bean("taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10); // 核心线程数executor.setMaxPoolSize(50); // 最大线程数executor.setQueueCapacity(100); // 队列容量executor.setThreadNamePrefix("Async-");executor.initialize();return executor;}
}
3. 启用响应式编程
• 使用 Spring WebFlux 替代传统 Servlet 模型,支持非阻塞 IO,适用于高并发场景。
二、数据库优化
1. 连接池配置
• 使用高性能连接池(如 HikariCP)并合理配置:
spring:datasource:hikari:maximum-pool-size: 20 # 最大连接数(根据数据库配置调整)connection-timeout: 3000 # 连接超时时间(ms)idle-timeout: 60000 # 空闲连接超时时间
2. 读写分离与分库分表
• 主从架构:写操作走主库,读操作走从库。
• 分库分表:使用 ShardingSphere 或 MyCAT 拆分大表。
3. SQL 优化
• 使用慢查询日志定位低效 SQL。
• 避免 SELECT *
,减少数据传输量。
• 对高频查询字段建立索引,但避免过度索引。
三、缓存策略
1. 本地缓存
• 使用 Caffeine 缓存热点数据:
@Bean
public Cache<String, Object> caffeineCache() {return Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).maximumSize(1000).build();
}
2. 分布式缓存
• 使用 Redis 或 Memcached 缓存共享数据,减少数据库压力。
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) { ... }
3. 缓存击穿与雪崩防护
• 对空值缓存,避免缓存穿透。
• 使用互斥锁或 Redis 的 SETNX
防止缓存击穿。
• 设置随机过期时间,避免缓存雪崩。
四、异步与消息队列
1. 异步处理
• 使用 @Async
异步执行耗时任务(如发送短信、记录日志):
@Async("taskExecutor")
public void asyncSendEmail(String email) { ... }
2. 消息队列削峰
• 使用 RabbitMQ 或 Kafka 缓冲高并发请求:
@RabbitListener(queues = "order_queue")
public void processOrder(Order order) { ... }
五、水平扩展
1. 负载均衡
• 通过 Nginx 或 Spring Cloud Gateway 分发请求到多个服务实例:
# nginx.conf
upstream backend {server 192.168.1.101:8080;server 192.168.1.102:8080;
}
server {location / {proxy_pass http://backend;}
}
2. 无状态化服务
• 使用 Redis 存储 Session 数据,确保服务可横向扩展。
3. 容器化与弹性伸缩
• 使用 Docker + Kubernetes 动态扩缩容实例。
六、网络与协议优化
1. 启用 HTTP/2
• 提升传输效率,减少延迟。
# application.yml
server:http2:enabled: true
2. 压缩响应数据
• 启用 GZIP 压缩:
server:compression:enabled: truemime-types: text/html,text/xml,text/plain,application/json
七、监控与调优
1. 性能监控
• 使用 Spring Boot Actuator + Prometheus + Grafana 监控 JVM、数据库、缓存等指标。
• 分析 GC 日志,优化 JVM 参数(如堆大小、垃圾回收器)。
2. 压力测试
• 使用 JMeter 或 Gatling 模拟高并发场景,找出瓶颈。
总结
提升并发量的核心思路:
- 减少单次请求耗时(优化代码、缓存、异步)。
- 提高系统资源利用率(线程池、连接池、非阻塞 IO)。
- 分散压力(水平扩展、消息队列)。
建议结合监控工具逐步优化,避免过度设计。例如,先优化数据库和缓存,再引入异步和消息队列,最后考虑水平扩展。