记录一次简单的Springboot高并发调优

记录一次简单的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的阿里云学生机也能顶住四五十人的并发,还凑合。当然高并发的调优还有许多需要学习。

新手程序猿,上述中的错误欢迎大家指正!

  • 3
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值