温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spring Boot: 接口压测及简要优化策略

发布时间:2020-10-30 15:47:40 来源:亿速云 阅读:379 作者:Leah 栏目:开发技术

本篇文章为大家展示了Spring Boot: 接口压测及简要优化策略,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1.准备数据,为了测试准备200w条以上的数据。一个简单的方法是使用下面的sql快速创建。

INSERT INTO table (user_name,address)

SELECT user_name, address FROM table;

但这样创建的数据不同记录的重复部分太多,和实际业务不太相符。一般业务上,除了主键之外还会有某一个字段是唯一,比如手机号,用户名等。本次将user_name设置为唯一,简单采用UUID的方式生成。

@RequestMapping("/create")
public Integer createData(Integer password) {
if (password != 1024) {
return 0;
}
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10,
20, 1, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(100000),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
int max = 1000000;
for (int i = 0; i < max; i++) {
poolExecutor.execute(() -> {
Date now = new Date();
User user = new User();
user.setStatus(0);
user.setUserName(UUID.randomUUID().toString().replace("-", ""));
user.setAddress("");
user.setCreateTime(now);
user.setUpdateTime(now);
userService.saveUser(user);
});
}
return 1;
}

采用线程池技术来生成数据。部分参数参考自己的配置进行设置。我这里采用核心线程数10,最大线程数20,阻塞队列容量10w,拒绝策略CallerRunsPolicy的参数来生成。

数据生成以后,确认下生成数量,可以看到所有的user_name都是不同的。

select count(*),count(distinct user_name) from user

Spring Boot: 接口压测及简要优化策略

2.改造接口。为了测试方便,使用公共mapper。引入依赖

<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>

修改启动类MapperScan注解为import tk.mybatis.spring.annotation.MapperScan;

mapper接口继承extends Mapper,(import tk.mybatis.mapper.common.Mapper;)。这样就会为mapper生成insert,select等基本方法。

3.测试。

所测试的接口为

@RequestMapping(value = "/hello", method = {RequestMethod.POST})
public List<User> getUser(User user) {
return userService.getUserByUser(user);
}

打开jmeter,通过Option选择中文语言。创建测试计划,这次仅对接口进行压力测试。

测试参数选择userName,并使用随机生成的UUID,这样可以保证最终访问DB时不触发任何缓存。

1.文件-新建测试计划

2.编辑-添加-线程-线程组

3.选中线程组,编辑-添加-逻辑控制器-事务控制器

4.选中事务控制器,编辑-添加-取样器-BeanShell 取样器

5.选中事务控制器,编辑-添加-HTTP请求

6.选中BeanShell取样器,将下面代码复制到脚本框里面,内容即为设置user_name变量为UUID。

import java.util.UUID;
UUID uuid1 = UUID.randomUUID();
vars.put("user_name",(uuid1.toString()).toUpperCase().replaceAll("-","")); 

Spring Boot: 接口压测及简要优化策略

7.选中HTTP请求,设置如下,其中参数部分内容为:

名称
userName${user_Name}

这样就可以将步骤6生成的参数传递为HTTP POST请求的参数了。

Spring Boot: 接口压测及简要优化策略

添加结果树,汇总报告等,最终结构:

Spring Boot: 接口压测及简要优化策略

8.选中线程组,设置线程数等信息,详细请参照官网:https://jmeter.apache.org/usermanual/index.html

Spring Boot: 接口压测及简要优化策略

这里先设置线程数为2000,由于要压力测试,设置Ramp-up为1秒,即1秒内启动所有线程。

9.启动线程组。在这里插入图片描述

10.结果树里面可以确认具体每次请求的参数:

Spring Boot: 接口压测及简要优化策略

汇总报告里面可以查看总体信息:

Spring Boot: 接口压测及简要优化策略

通过以上步骤,可以初步预估下系统各个接口的吞吐量等信息。第一次压测中user_name自动没有设置索引,可以通过一些方法来提高系统性能:

1.为user_name设置索引。

2.使用redis缓存,其一是缓存最近检索数据,其二是将表中所有user_name存入缓存(Set),请求到来时首先去缓存中查看是否存在,只有存在的时候才去检索DB。

3.若数据量过大,可采用布隆过滤器存储user_name。

4.限流,这里只说API层面的,guava包下RateLimiterJ;自写切面+Redis;Spring Cloud GateWay。

上述内容就是Spring Boot: 接口压测及简要优化策略,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI