基于线上请求的性能测试系统CPC
1.背景
测试人员在设计性能测试脚本时,HTTP请求中的参数往往根据个人经验设置,而测试人员水平参差不齐,设计往往具有局限性,不够全面,不能涵盖全线上真实的请求,故得到的性能测试结果不能够真实反映线上真实的情况。
使用线上环境下的HTTP请求检查软件性能的问题,通过Gor记录线上真实的请求,作为性能测试脚本的请求池,用请求池物料进行性能测试,能真实的反映软件系统在线上环境下的性能指标和问题。
2.概念
2-1.架构图
2-2.技术栈
请求池:
Gor:
HTTP 录制工具 https://github.com/buger/gor
Webdis:
A very simple web server providing an HTTP interface to Redis https://github.com/nicolasff/webdis
redis:
持久化缓存
性能测试工具:
nGrinder二次开发:
http://blog.csdn.net/neven7/article/details/50740018
Spring MVC
链路可视化:
watchman(微博APM)
influxDB:
时序化DB https://github.com/influxdata/influxdb
Grafana:
可视化工具 https://github.com/grafana/grafana
3.实现
3-1.请求池
使用Gor录制线上请求,根据线上请求,序列化成Json String, 持久化到redis;性能测试脚本根据key,获取到线上请求数据,进行压测。
为了方便部署请求池,将请求池docker化,使用如下命名,启动docker容器:
docker run -i -t --net=host gor-request-parser /bin/bash
开始录制线上数据:
sh gor_request_parser.sh 8080 60 GET your_api_name NONBASIC ip port参数介绍:
8080:监听端口
60:监听时间(秒)
GET:HTTP METHOD
your_api_name:过滤其他url,只保留your_api_name请求
NONBASIC:非BASIC认证接口,参数BASIC为BASIC接口
ip port:webdis服务
60s后, 请求数据持久化到redis中
***************************************************
gor http请求 序列化 http请求记录中,60 秒后,终止记录
***************************************************
Version: ***************************************************
记录结束, http请求序列化到请求池
@author hugang
***************************************************
redis的key为$date_$hostname_$url
value为Json Array,形如:
3-2.性能测试脚本
性能测试工具使用nGrinder,进行二次开发,请参考:http://blog.csdn.net/neven7/article/details/50740018;
性能测试脚本使用redis获取线上请求数据,依赖jedis、fastJson,在脚本lib中导入这2个jar包。
范例:
package org.ngrinder;import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.plugin.http.HTTPRequest
import net.grinder.plugin.http.HTTPPluginControl;
import net.grinder.script.GTest
import net.grinder.script.Grinder
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
// import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWithimport HTTPClient.HTTPResponse
import HTTPClient.NVPairimport java.util.ArrayList;
import java.util.Collections;
import java.util.List;import groovy.json.JsonBuilder
import groovy.json.JsonSlurperimport com.alibaba.fastjson.JSONArray;
import redis.clients.jedis.Jedis;/*** A simple example using the HTTP plugin that shows the retrieval of a* single page via HTTP. * * This script is automatically generated by ngrinder.* * @author hugang*/
@RunWith(GrinderRunner)
class TestRunner {public static GTest testpublic static HTTPRequest requestpublic static File filepublic static JSONArray jsonArray@BeforeProcesspublic static void beforeProcess() {HTTPPluginControl.getConnectionDefaults().timeout = 6000test = new GTest(1, "压测ip")request = new HTTPRequest()test.record(request);// 读取请求池数据Jedis jedis = new Jedis("redis ip", redis port);// redis keyString key = "your key";String jsonStr = jedis.get(key);jsonArray = JSONArray.parseArray(jsonStr);// grinder.logger.info(jsonArray.getString(0));// grinder.logger.info("before process.");}@BeforeThread public void beforeThread() {grinder.statistics.delayReports=true;}@Testpublic void test(){// 随机获取int index = (int) (Math.random() * jsonArray.size());String httpInfo = jsonArray.getString(index);def json = new JsonSlurper().parseText(httpInfo)String api = json.apiMap param = json.paramdef nvs = []param.each{key, value -> nvs.add(new NVPair(key, value))}// GET请求,wiki http://grinder.sourceforge.net/g3/script-javadoc/net/grinder/plugin/http/HTTPRequest.html// param1: uri, param2: queryData// HTTPResponse GET(java.lang.String uri, NVPair[] queryData) Makes an HTTP GET request.HTTPResponse result = request.GET("http://压测ip" + api, nvs as NVPair[])if (result.statusCode == 301 || result.statusCode == 302) {grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", result.statusCode); } else {assertThat(result.statusCode, is(200));// 请求返回的数据// println(result.text);// 定义一个事务,接口返回数据校验,是否包含assertThat(result.text, containsString("\"code\""));}}
}
3-3. 链路时间分布可视化
链路时间展示,启动web服务指定-javaagent为watchman agent,使用字节码增强,获取某一段时间内代码链路的分布时间。
请参考:http://blog.csdn.net/neven7/article/details/50980726
基于线上请求的性能测试系统CPC相关推荐
- SSM毕设项目基于线上考试系统t90ic(java+VUE+Mybatis+Maven+Mysql)
SSM毕设项目基于线上考试系统t90ic(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX ...
- ssm基于微信小程序的食堂线上预约点餐系统--(ssm+uinapp+Mysql)
ssm基于微信小程序的食堂线上预约点餐系统–(ssm+uinapp+Mysql) 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括食堂线上预约点餐系统的网络应用,在外 ...
- 基于JAVA线上甜品店售卖系统计算机毕业设计源码+系统+lw文档+部署
基于JAVA线上甜品店售卖系统计算机毕业设计源码+系统+lw文档+部署 基于JAVA线上甜品店售卖系统计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java ...
- 课程设计-基于SSM的在线课程教学系统代码-基于java的线上课程资源共享论坛系统
课程设计-基于SSM的在线课程教学系统代码-基于java的线上课程资源共享论坛系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SSM 前端框架 ...
- 记一次线上请求偶尔变慢的排查
前言 最近解决了个比较棘手的问题,由于排查过程挺有意思,于是就以此为素材写出了本篇文章. Bug现场 这是一个偶发的性能问题.在每天几百万比交易请求中,平均耗时大约为300ms,但总有那么100多笔会 ...
- 字节跳动自研线上引流回放系统的架构演进
本文选自"字节跳动基础架构实践"系列文章. "字节跳动基础架构实践"系列文章是由字节跳动基础架构部门各技术团队及专家倾力打造的技术干货内容,和大家分享团队在基础 ...
- java毕业设计线上甜品店售卖系统Mybatis+系统+数据库+调试部署
java毕业设计线上甜品店售卖系统Mybatis+系统+数据库+调试部署 java毕业设计线上甜品店售卖系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...
- 基于线上的茶叶购买小程序(论文+程序设计源码+数据库文件)
微信小程序在日常生活中应用越来越广,网上消费.游戏娱乐等成为了一种常见应用方式.为进一步了解和探索微信小程序在点餐系统中的潜在价值和意义,本文通过使用 Javascript 技术.Spring boo ...
- 计算机毕业设计Java线上甜品店售卖系统(源码+系统+mysql数据库+Lw文档)
计算机毕业设计Java线上甜品店售卖系统(源码+系统+mysql数据库+Lw文档) 计算机毕业设计Java线上甜品店售卖系统(源码+系统+mysql数据库+Lw文档) 本源码技术栈: 项目架构:B/S ...
最新文章
- AI产业链分布图曝光:1040个玩家,BAT率先步入应用
- canvas之特丑时钟
- 国内pinterest发展介绍------瀑布流效果
- 一致性 Hash 算法原理总结
- asp.net core 6 新特性,支持HTTP/3 端点发布
- hazelcast入门教程_Hazelcast入门指南第2部分
- 项目经理(project manager)刘小备的一天
- 赠书 | 什么是 Knative?
- [转帖]备忘:CentOS-7 使用systemctl 管理的服务,文件打开数上限1024要改
- tcc分布式事务框架源码解析系列(四)之项目实战
- 中山大学本科偏微分方程试题
- Abaqus动力学分析基础
- cad.net cad启动慢? cad2008启动慢? cad启动延迟? cad卡住? cad98%卡? 默认打印机!!
- CESM优化——Intel编译器编译安装NetCDF库(C+Fortran)
- 关于Textview maxline=1 ellipsize=end 导致中英文数字混合分割错误的问题
- 解决android上WIFI提示“未检测到任何互联网连接,因此不会自动重新连接“
- Java面试重点_4. 一文彻底搞懂Java中的反射 0.5
- 【秃头系列】-【本科生毕设论文格式Word】小修改和小问题
- 互联网舆情系统功能调研和详细点调研
- 基于PIC18F458的CAN总线接口设计