厉害了!我们老大半小时把我的springboot项目并发提升几倍

本文主要是介绍厉害了!我们老大半小时把我的springboot项目并发提升几倍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java领域佼佼者 2020-02-19 14:44:45

 

厉害了!我们老大半小时把我的springboot项目并发提升几倍

 

背景

生产环境偶尔会有一些慢请求导致系统性能下降,吞吐量下降,下面介绍几种优化建议。

方案

1、undertow替换tomcat

电子商务类型网站大多都是短请求,一般响应时间都在100ms,这时可以将web容器从tomcat替换为undertow,下面介绍下步骤:

1、增加pom配置

<dependency>    
<groupid>org.springframework.boot</groupid>    
<artifactid>spring-boot-starter-web</artifactid>    
<exclusions>       
<exclusion>          
<groupid>org.springframework.boot</groupid>          
<artifactid>spring-boot-starter-tomcat</artifactid>       
</exclusion>    
</exclusions>
</dependency><dependency>    
<groupid>org.springframework.boot</groupid>    
<artifactid>spring-boot-starter-undertow</artifactid>
</dependency>

2、增加相关配置

server:  undertow:    direct-buffers: true    io-threads: 4    worker-threads: 160

 

重新启动可以在控制台看到容器已经切换为undertow了

2、缓存

将部分热点数据或者静态数据放到本地缓存或者redis中,如果有需要可以定时更新缓存数据

3、异步

在代码过程中我们很多代码都不需要等返回结果,也就是部分代码是可以并行执行,这个时候可以使用异步,最简单的方案是使用springboot提供的@Async注解,当然也可以通过线程池来实现,下面简单介绍下异步步骤。1、pom依赖 一般springboot引入web相关依赖就行

<dependency>    
<groupid>org.springframework.boot</groupid>    
<artifactid>spring-boot-starter-web</artifactid>
</dependency>

2、在启动类中增加@EnableAsync注解

@EnableAsync
@SpringBootApplication
public class AppApplication{    
public static void main(String[]args) {        
SpringApplication.run(AppApplication.class, args);    
}
}

3、需要时在指定方法中增加@Async注解,如果是需要等待返回值,则demo如下

@Async

public Future<string> doReturn(int i){    
try {        
// 这个方法需要调用500毫秒         
Thread.sleep(500);     
} catch (InterruptedException e) {       
e.printStackTrace();    
}    
// 消息汇总    
return new AsyncResult<>("异步调用");
}

4、如果有线程变量或者logback中的mdc,可以增加传递

@EnableAsync
@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setTaskDecorator(new MdcTaskDecorator());executor.initialize();return executor;}
}class MdcTaskDecorator implements TaskDecorator {@Overridepublic Runnable decorate(Runnable runnable) {Map<String, String> contextMap = MDC.getCopyOfContextMap();return () -> {try {MDC.setContextMap(contextMap);runnable.run();} finally {MDC.clear();}};}
}

5、有时候异步需要增加阻塞

@Configuration
@Slf4j
public class TaskExecutorConfig {@Bean("localDbThreadPoolTaskExecutor")public Executor threadPoolTaskExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize(5);taskExecutor.setMaxPoolSize(200);taskExecutor.setQueueCapacity(200);taskExecutor.setKeepAliveSeconds(100);taskExecutor.setThreadNamePrefix("LocalDbTaskThreadPool");taskExecutor.setRejectedExecutionHandler((Runnable r, ThreadPoolExecutor executor) -> {if (!executor.isShutdown()) {try {Thread.sleep(300);executor.getQueue().put(r);} catch (InterruptedException e) {log.error(e.toString(), e);Thread.currentThread().interrupt();}}});taskExecutor.initialize();return taskExecutor;}
}

4、业务拆分

可以将比较耗时或者不同的业务拆分出来提供单节点的吞吐量

5、集成消息队列

有很多场景对数据实时性要求不那么强的,或者对业务进行业务容错处理时可以将消息发送到kafka,然后延时消费。举个例子,根据条件查询指定用户发送推送消息,这里可以时按时、按天、按月等等,这时就

厉害了!我们老大半小时把我的springboot项目并发提升几倍

 

这篇关于厉害了!我们老大半小时把我的springboot项目并发提升几倍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026552

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、