记录一次简单的Springboot高并发调优
本文内容仅能处理一些简单的高并发,上万人的高并发调优仍需学习。。。。
正文
针对高并发的问题,我们决定从三个方向去处理:
1.增加数据库连接数
在 application.yml文件中加上以下代码
spring:
datasource:
hikari:
connection-test-query: SELECT 1 FROM DUAL
connection-timeout: 600000
maximum-pool-size: 500
max-lifetime: 1800000
minimum-idle: 20
validation-timeout: 3000
idle-timeout: 60000
优点:可以显著提升由于数据库连接问题导致的高并发问题,实现简单。
缺点:这个方法的弊端暂时不清楚
2.增大线程数提高吞吐量
新建一个类GlobalConfig.java,在文件中加上以下代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
public class GlobalConfig {
/**
* 默认线程池线程池
*
* @return Executor
*/
@Bean
public ThreadPoolTaskExecutor defaultThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数目
executor.setCorePoolSize(16);
//指定最大线程数
executor.setMaxPoolSize(300);
//队列中最大的数目
executor.setQueueCapacity(50);
//线程名称前缀
executor.setThreadNamePrefix("defaultThreadPool_");
//rejection-policy:当pool已经达到max size的时候,如何处理新任务
//CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
//对拒绝task的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程空闲后的最大存活时间
executor.setKeepAliveSeconds(60);
//加载
executor.initialize();
return executor;
}
}
优点:可以显著提升由于线程数不足问题导致的高并发问题,实现简单,加上这个文件即可。
缺点:这个方法的弊端暂时不清楚
3.使用current-limiting对接口限流
1.首先在pom.xml中添加依赖
<dependency>
<groupId>cn.yueshutong</groupId>
<artifactId>spring-boot-starter-current-limiting</artifactId>
<version>0.0.8.RELEASE</version>
</dependency>
2.在application.yml中添加以下代码
current:
limiting:
#开启全局限流
enabled: false
#开启注解限流,可使注解失效
part-enabled: true
#每秒并发量 这里的qps是全局限流开启的时候的值,如果使用注解在注解里设置QPS值
qps: 100
#开启快速失败,可切换为阻塞
fail-fast: true
#系统启动保护时间为0
initial-delay: 1
3.在需要的限流的接口上添加注解
@RequestMapping(value = "/login",method = RequestMethod.POST)
@CurrentLimiter(QPS=5)
public ResponseModel loginUser(@RequestBody JSONObject account)
4.新建MyCurrentLimitHandler.java文件,自定义被拦截时的返回信息
import cn.yueshutong.springbootstartercurrentlimiting.annotation.CurrentLimiter;
import cn.yueshutong.springbootstartercurrentlimiting.handler.CurrentAspectHandler;
import com.program.facesigninsystem.entity.ResponseModel;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
@Component
public class MyCurrentLimitHandler implements CurrentAspectHandler {
@Override
public ResponseModel around(ProceedingJoinPoint pjp, CurrentLimiter rateLimiter) {
return new ResponseModel(500,"系统繁忙,请稍后重试");
}
}
上述代码中的ResponseModel类是我项目中自定义的返回类,可以根据自己的代码情况修改;
优点:能够显著提升系统稳定性
缺点:用户体验较差,尤其是对实时性要求较高时,对系统的可用性影响很大
在我本人的项目中,上述三种方式全部都用上了,使我的1核2G的阿里云学生机也能顶住四五十人的并发,还凑合。当然高并发的调优还有许多需要学习。
新手程序猿,上述中的错误欢迎大家指正!