详解SpringBoot 应用如何提高服务吞吐量

网友投稿 283 2022-12-02


详解SpringBoot 应用如何提高服务吞吐量

意外和明天不知道哪个先来。没有危机是最大的危机,满足现状是最大的陷阱。

背景

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

方案

1、undertow替换tomcat

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

1、增加pom配置

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-tomcat

org.springframework.boot

spring-boot-starter-undertow

2、增加相关配置

server:

undertow:

direct-buffers: true

io-threads: 4

worker-threads: 160

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

2、缓存

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

3、异步

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

1、pom依赖 一般springboot引入web相关依赖就行

org.springframework.boot

spring-boot-starter-web

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

import org.springframework.boot.SpringApplication

@EnableAsync

@SpringBootApplication

public class AppApplication {

public static void main(String[] args) {

SpringApplication.run(AppApplication.class, args);

}

}

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

@Async

public Future doReturn(int i) {

try {

// 这个方法需要调用500毫秒

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 消息汇总

return new AsyncResult("异步调用");

}

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

import org.slf4j.MDC;

import org.springframework.context.annotation.Configuratihttp://on;

import org.springframework.core.task.TaskDecorator;

import org.springframework.scheduling.annotation.AsyncConfigurerSupport;

import org.springframework.scheduling.annotation.EnableAsync;

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.Map;

import java.util.concurrent.Executor;

/**

* @Description:

*/

@EnableAsync

@Configuration

public class AsyncConfig extends AsyncConfigurerSupport {

@Override

public Executor getAsyncExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

executor.setTaskDecorator(new MdcTaskDecorator());

executor.initialize();

return executor;

}

}

class MdcTaskDecorator implements TaskDecorator {

@Override

public Runnable decorate(Runnable runnable) {

Map contextMap = MDC.getCopyOfContextMap();

return () - & gt; {

try {

MDC.setContextMap(contextMap);

runnable.run();

} finally {

MDC.clear();

}

};

}

}

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

import lombok.extern.slf4j.Slf4j;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

import java.util.concurrent.ThreadPoolExecutor;

@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) - & gt; {

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,然后延时消费。举个例子,根据条件查询指定用户发送推送消息,这里可以时按时、按天、按月等等,这时就


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java类与对象案例之打字游戏
下一篇:Spring Security中的Servlet过滤器体系代码分析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~