时间:2021-05-19
工程做好之后,需要对接口进行压力测试。可以自己编写线程池模拟多用户访问测试,也可以使用jmeter进行压测。jmeter的好处是测试方便,并且有完善的结果分析功能。本次采用jmeter进行压力测试。
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
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("-",""));7.选中HTTP请求,设置如下,其中参数部分内容为:
名称 值 userName ${user_Name}这样就可以将步骤6生成的参数传递为HTTP POST请求的参数了。
添加结果树,汇总报告等,最终结构:
8.选中线程组,设置线程数等信息,详细请参照官网:https://jmeter.apache.org/usermanual/index.html
这里先设置线程数为2000,由于要压力测试,设置Ramp-up为1秒,即1秒内启动所有线程。
9.启动线程组。在这里插入图片描述
10.结果树里面可以确认具体每次请求的参数:
汇总报告里面可以查看总体信息:
通过以上步骤,可以初步预估下系统各个接口的吞吐量等信息。第一次压测中user_name自动没有设置索引,可以通过一些方法来提高系统性能:
1.为user_name设置索引。
2.使用redis缓存,其一是缓存最近检索数据,其二是将表中所有user_name存入缓存(Set),请求到来时首先去缓存中查看是否存在,只有存在的时候才去检索DB。
3.若数据量过大,可采用布隆过滤器存储user_name。
4.限流,这里只说API层面的,guava包下RateLimiterJ;自写切面+Redis;Spring Cloud GateWay。
工程地址:https://github.com/showsys20/spring-demo-cm.git
以上这篇浅谈Spring Boot: 接口压测及简要优化策略就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一)spring-boot-starter命名规则自动配置模块命名规则:xxx-spring-boot,如:aspectlog-spring-boot启动器命名
1.什么是spring-boot-devtoolsspring-boot-devtools是spring-boot项目开发时的一个热部署工具,安装了spring
1.加入mybatis-spring-boot-stater的Maven依赖org.mybatis.spring.bootmybatis-spring-boot
一、使用mybatis-spring-boot-starter1、添加依赖org.mybatis.spring.bootmybatis-spring-boot-
Spring-cloud-eureka使用feign调用服务接口的具体方法,供大家参考,具体内容如下基于spring-boot2.0以上版本完成的微服务架构po