您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

如何提升springboot服务吞吐量

时间:2020-02-06 11:37:14  来源:  作者:

原文作者:lipengHeke

背景

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

方案

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,可以增加传递

import org.slf4j.MDC;
import org.springframework.context.annotation.Configuration;
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<string, string> contextMap = MDC.getCopyOfContextMap();
        return () -> {
            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) -> {
                    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服务吞吐量

 



Tags:springboot   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
背景在日常开发时,我们常常需要 在SpringBoot 应用启动时执行某一段逻辑,如下面的场景: 获取一些当前环境的配置或变量 向数据库写入一些初始数据 连接某些第三方系统,确认对方...【详细内容】
2020-11-04   springboot  点击:(9)  评论:(0)  加入收藏
SpringBoot运行流程源码分析上一章中我们分析了 SpringApplication 类实例化的源代码,在此过程中完成了基本配置文件的加载和实例化。当 SpringApplication 对象被创建之后,...【详细内容】
2020-10-29   springboot  点击:(4)  评论:(0)  加入收藏
在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作 但是分布式部署的时候,我们请求的服务器...【详细内容】
2020-10-22   springboot  点击:(7)  评论:(0)  加入收藏
Spring应用上下文的准备我们在上一节完成了应用上下文的创建工作,SpringApplication 继续通过 prepareContext方法来进行应用上下文的准备工作。首先,通过图 4-4 来整体了解一...【详细内容】
2020-10-21   springboot  点击:(8)  评论:(0)  加入收藏
SentrySentry是一种由Python编写的跨平台程序监控应用, 可以帮助你实时监控和修复崩溃,主要关注错误报告。 Sentry包含一个完整的API,用于在任何应用程序中从任何语言发送事件...【详细内容】
2020-10-19   springboot  点击:(6)  评论:(0)  加入收藏
备份数据库  备份通过命令行对数据库导出到指定目录即可。我这里是一个Get请求,页面需要展示备份文件名称、大小和备份时间,代码中使用的log是Slf4j,最终界面效果如图: 代码对...【详细内容】
2020-09-23   springboot  点击:(24)  评论:(0)  加入收藏
昨天有前同事离职,和同事去吃饭。聊了很久&hellip;&hellip;我已经出来一年多了,换了另一种工作的状态,前同事们讨论的依然是提测、改bug,赶项目。我已经换了一种生活,感觉出来值...【详细内容】
2020-09-13   springboot  点击:(1)  评论:(0)  加入收藏
在实际项目中,经常需要用到角色权限区分,以此来为不同的角色赋予不同的权利,分配不同的任务。比如,普通用户只能浏览;会员可以浏览和评论;超级会员可以浏览、评论和看视频课等;实际...【详细内容】
2020-09-04   springboot  点击:(7)  评论:(0)  加入收藏
嗯,工具类记录原链接:https://blog.csdn.net/qq_37651267/article/details/99305573,非常感谢原链接博主 此验证码的实现没有用到太多的插件,话不多说直接上代码,大家拿过去就...【详细内容】
2020-09-02   springboot  点击:(16)  评论:(0)  加入收藏
从一个天气预报系统讲起本节通过Spring Boot技术快速实现一个天气预报系统。通过这个系统,一方面可以了解Spring Boot的全面用法,为后续创建微服务应用打下基础;另一方面,该系...【详细内容】
2020-08-26   springboot  点击:(5)  评论:(0)  加入收藏
前言阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于 99.9999999999%(12 个 9),服务设计可...【详细内容】
2020-08-21   springboot  点击:(6)  评论:(0)  加入收藏
本节主要学习SpringBoot + JPA(底层使用Hibernate实现)集成案例。1.JPA概述1.1 JPA简介JPA是Java Persistence API的简称,中文名Java持久化层API,是JDK 5.0注解或XML描述对象-...【详细内容】
2020-08-11   springboot  点击:(10)  评论:(0)  加入收藏
Dubbo(来自于阿里巴巴)Dubbo是一个分布式服务框架,致力于提供高性能和透明化的PRC远程调用服务调用方案。 Dubbo的的特点 通过spring配置的方式即可完成服务化,对于应用无入侵。...【详细内容】
2020-08-10   springboot  点击:(5)  评论:(0)  加入收藏
前言最近有个项目需要对图片图像进行处理,使用到了开源框架OpenCV全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库;而现在的项目都是基于SpringBoot,需...【详细内容】
2020-08-10   springboot  点击:(8)  评论:(0)  加入收藏
1 概述在实际业务开发中通常会在单个应用中通过 分库分表 或者 读写分离的方式来提供应用的读写性能。在具体的开发中有很多方式: 通过不同的 mapper,映射到不同的 mybatis 源...【详细内容】
2020-08-05   springboot  点击:(8)  评论:(0)  加入收藏
SpringBoot介绍官网:https://spring.io/projects/spring-boot官方文档:https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/reference/html/index.htmlSpringBoot是2014...【详细内容】
2020-07-29   springboot  点击:(4)  评论:(0)  加入收藏
SpringBoot常用属性配置 application.properties# =================================================================== # 通用SpringBoot属性# ======================...【详细内容】
2020-07-27   springboot  点击:(7)  评论:(0)  加入收藏
源码分享:关注转发文章之后私信回复【源码】即可免费获取到!框架说明 基于springboot+shiro+freemarker的快速开发框架,代码结构清晰,快速上手使用! 配置代码生成器,减少70%开发...【详细内容】
2020-07-26   springboot  点击:(2)  评论:(0)  加入收藏
1.为什么需要控制加载顺序springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配...【详细内容】
2020-07-16   springboot  点击:(6)  评论:(0)  加入收藏
定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时刻执行某些动作...定时任务在主流开发语言均提供相应的API供开...【详细内容】
2020-07-15   springboot  点击:(5)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条