项目属于课上作业迭代,请不要用于真实开发和调试。
本文非解决方案文章,仅作为记录作业使用,类似于写点心路历程。
作业日期:2020年6月07日,作业06
作业安排:压力测试、代码里面加上用Swagger相关的注解,生成API文档。
代码详见github:github.com/hitofuncy
一、作业概述
结束上一节未完成的sw生成API文档的任务,进行压力测试的相关内容。其中,压力测试项目参造的视频是:
第四章 秒杀压测 4.1 JMeter介绍 4.2自定义变量 4.3命令行压测。
二、Swagger(以下称为sw,不是短波的意思哦)相关注解生成API文档,以及特别说明
构建sw的思路:构建sw首先得引进sw的依赖,这里我引入如下的依赖:
io.springfox
springfox-swagger2
2.7.0
io.springfox
springfox-swagger-ui
2.7.0
引入依赖之后,还要编写sw的配置java类,这个类参造网上的写法则是以下代码(省略import):
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket productApi() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("swagger和springBoot整合").description("swagger的API文档")
.version("1.0").build();
}
}
这样,我们部署sw的前期工作就做完了,接着是在各个Controller中添加相关的代码以便生成测试接口,为了不占用大多数空间,所以仅仅挑选其中的一个Controller进行演示。在此,我挑选的Controller是LoginController 这个类作为演示。
在这个Controller中,包含接口有如下:
@RequestMapping("/to_login") // 登录网页接口
@RequestMapping("/do_login") // 登录异步接口
@RequestMapping(value = "/getVerify") //验证码生成接口
@RequestMapping(value = "/checkVerify", method = RequestMethod.POST,headers = "Accept=application/json") //校验验证码接口
原本,在生成sw文档前,需要对每一个接口填写一个错误异常码,但是由于我的项目已经设置过全局异常码了,因此这一步完全可以省略,就只在每一个接口上添加一个APIOPERATION,如下所示:
@ApiOperation(value = "当前的方法名", httpMethod = "GET") // POST
在这个Controller上添加一个介绍API的名称和tags,如下所示:
@Api(value = "登录Controller", tags = { "登录接口" })
在以上完成之后,这个API的接口文档生成的所有前期工作就完成了,这个工作完成以后,接着运行项目,输入网址:http://localhost:8080/swagger-ui.html#/ 就可以看到API的接口了,如下图所示:
特别注意一下:在全局API异步错误码已经定义的前提之下,如果在此添加@ApiResponses的话,那肯定是一种重写,则就可以达到不对代码进行更改从而使得异常信息变为中文,这个是可选的功能。
sw结束。
三、压力测试
压力测试参造视频进行完成,在此使用的apache-jmeter-5.3,以下简称jm5.
3.1 jm5的界面
3.2 建立初步测试。
3.2.1 以下,将要演示如何测试 /goods/to_list 这个接口。
为了测试正常,需要在 UserArgumentResolver 类中的 getCookieValue 方法中添加空指针的判断。因为初始情况下,用户并未登录就会导致异常。
线程配置:
HTTP请求默认值配置:
一般的HTTP请求配置:
聚合报告界面:
图形结果界面:
表格查看结果的界面:
分析结果
由图上可以得知,占用最大的一次是java.exe 占用 83% CPU ,mysqld占用7% CPU ,然后得出结论,这个系统应该进行优化。
3.2.2 压测获取用户。
准备步骤:编写 UserController 添加接口/info 传入 Model 和MiaoshaUser 的参数,返回用户信息,关键的方法如下:
@RequestMapping("/info")
@ResponseBody
public Result info(Model model, MiaoshaUser user) {
return Result.success(user);
}
创建一个jm5的任务请求,添加cookie项
开始压测,压测结果如下:
比较直观的是这次压测的吞吐量是1664每秒,和最大值4221,经过分析,可以得出就是查询数据库上耗费大量的时间,导致这个速度变慢。
3.2.3 压测多个用户
创建CSV Data Set Config 配置文件地址和变量名称,配置变量名称是定义这个获取到的值 如下图所示:
即可进行测试。
3.2.4 使用命令行进行压测
redis-benchmark.exe -h 127.0.0.1 -p 6379 -c 100 -n 100000
注意:在使用以上命令进行压测时,如遇见以下问题:
Unexpected error reply, exiting... redis已经添加密码,请打开无密码的redis,或是配置好密码参数选项。
Could not connect to Redis at 127.0.0.1:6379: Unknown error redis还没有启动,请启动redis
压测结果需要稍等片刻,我得出我的结果,第一个结果会和最后一个结果相差十分大。
====== PING (inline) ======
100000 requests completed in 1.95 seconds
100 parallel clients
3 bytes payload
keep alive: 1
51.44% <= 1 milliseconds
90.70% <= 2 milliseconds
96.59% <= 3 milliseconds
97.55% <= 4 milliseconds
97.83% <= 5 milliseconds
97.86% <= 6 milliseconds
97.88% <= 7 milliseconds
97.88% <= 8 milliseconds
97.90% <= 9 milliseconds
97.95% <= 10 milliseconds
98.02% <= 11 milliseconds
98.14% <= 12 milliseconds
98.28% <= 13 milliseconds
98.51% <= 14 milliseconds
98.73% <= 15 milliseconds
99.02% <= 16 milliseconds
99.19% <= 17 milliseconds
99.34% <= 18 milliseconds
99.43% <= 19 milliseconds
99.49% <= 20 milliseconds
99.59% <= 21 milliseconds
99.66% <= 22 milliseconds
99.70% <= 23 milliseconds
99.78% <= 24 milliseconds
99.84% <= 25 milliseconds
99.86% <= 26 milliseconds
99.89% <= 27 milliseconds
99.90% <= 31 milliseconds
99.90% <= 35 milliseconds
99.90% <= 36 milliseconds
99.90% <= 39 milliseconds
99.92% <= 43 milliseconds
99.92% <= 50 milliseconds
99.92% <= 56 milliseconds
99.92% <= 61 milliseconds
99.92% <= 65 milliseconds
99.92% <= 69 milliseconds
99.92% <= 73 milliseconds
99.92% <= 79 milliseconds
99.93% <= 84 milliseconds
99.93% <= 90 milliseconds
99.93% <= 95 milliseconds
99.93% <= 99 milliseconds
99.93% <= 105 milliseconds
99.93% <= 114 milliseconds
99.93% <= 123 milliseconds
99.93% <= 129 milliseconds
99.93% <= 134 milliseconds
99.93% <= 141 milliseconds
99.93% <= 147 milliseconds
99.94% <= 155 milliseconds
99.94% <= 159 milliseconds
99.94% <= 164 milliseconds
99.94% <= 166 milliseconds
99.94% <= 171 milliseconds
99.94% <= 176 milliseconds
99.95% <= 180 milliseconds
99.95% <= 186 milliseconds
99.95% <= 192 milliseconds
99.95% <= 200 milliseconds
99.95% <= 209 milliseconds
99.95% <= 220 milliseconds
99.95% <= 227 milliseconds
99.95% <= 235 milliseconds
99.95% <= 239 milliseconds
99.96% <= 247 milliseconds
99.96% <= 258 milliseconds
99.96% <= 260 milliseconds
99.96% <= 268 milliseconds
99.96% <= 272 milliseconds
99.96% <= 279 milliseconds
99.96% <= 288 milliseconds
99.96% <= 294 milliseconds
99.96% <= 305 milliseconds
99.96% <= 312 milliseconds
99.96% <= 320 milliseconds
99.97% <= 325 milliseconds
99.97% <= 332 milliseconds
99.97% <= 341 milliseconds
99.97% <= 347 milliseconds
99.97% <= 356 milliseconds
99.97% <= 362 milliseconds
99.97% <= 372 milliseconds
99.97% <= 379 milliseconds
99.97% <= 388 milliseconds
99.97% <= 394 milliseconds
99.98% <= 406 milliseconds
99.98% <= 413 milliseconds
99.98% <= 420 milliseconds
99.98% <= 427 milliseconds
99.98% <= 436 milliseconds
99.98% <= 443 milliseconds
99.98% <= 453 milliseconds
99.98% <= 460 milliseconds
99.98% <= 467 milliseconds
99.99% <= 476 milliseconds
99.99% <= 484 milliseconds
99.99% <= 490 milliseconds
99.99% <= 499 milliseconds
99.99% <= 506 milliseconds
99.99% <= 513 milliseconds
99.99% <= 518 milliseconds
99.99% <= 526 milliseconds
99.99% <= 532 milliseconds
99.99% <= 541 milliseconds
100.00% <= 546 milliseconds
100.00% <= 552 milliseconds
100.00% <= 561 milliseconds
100.00% <= 565 milliseconds
100.00% <= 566 milliseconds
100.00% <= 567 milliseconds
51413.88 requests per second
使用以下命令继续压测:
redis-benchmark.exe -t set,lpush -n 100000 -q
很可惜,在现在Windows的客户端上的redis上并没有参数t,此条命令无法完成。
Usage: redis-benchmark [-h
] [-p ] [-c ] [-n [-k ] -h Server hostname (default 127.0.0.1) -p Server port (default 6379) -s Server socket (overrides host and port) -c Number of parallel connections (default 50) -n Total number of requests (default 10000) -d Data size of SET/GET value in bytes (default 2) -k 1=keep alive 0=reconnect (default 1) -r Use random keys for SET/GET/INCR, random values for SADD Using this option the benchmark will get/set keys in the form mykey_rand000000012456 instead of constant keys, the argument determines the max number of values for the random number. For instance if set to 10 only rand000000000000 - rand000000000009 range will be allowed. -q Quiet. Just show query/sec values -l Loop. Run the tests forever -I Idle mode. Just open N idle connections and wait. 运行之后出现:Invalid option "-t" or option argument missing
使用命令以下进行压测:
redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
提示:Unexpected error reply, exiting...,'bar'): 0.00
理论上也是属于在windows环境下出现的问题。
3.2.5 Spring Boot 打War包
添加以下
1.添加spring-boot-starter-tomcat的provided依赖
2.添加maven-war-plugin插件
3.修改主运行方法。如下代码所示:
@SpringBootApplication public class MainApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return super.configure(builder); } }
3.2.6 导出jmx文件,在目标机器上做测试。
导出不用讲了吧,只需要写好参数,导出即可。
使用命令 进行测试
apache-jemeter/bin/jmeter.sh -n -t goods_list.jmx -l result.jtl