性能优化与压测引擎一
作者:互联网
性能优化与压测引擎一
压测框架gatling
说到压测,我们最熟悉的可能就是ab命令和jmeter了,确实他们很方便,但是我最近都在用另外一个压测框架,叫gatling,为什么呢,因为他的报告很吸引我,而且写压测脚本很方便,功能也挺全的,他可以很好的去模拟一些场景,用的是scala语言,用到actor模型,很容易模拟大量并发的场景,并发真的很强,我觉得挺不错的,天生封装了http的协议,当然可以想办法实现GRPC或者DUBBO,网上其实有的,遗憾的可能就是需要用到scala,对于纯JAVA的可能不是那么友好把,不过仅仅是用压测那些脚本逻辑问题应该不大。这里我用他自带的demo说明下好了,为了给后面做铺垫,官网是https://gatling.io/,有兴趣的可以下个最新版玩玩,很方便,看看结果,也有大佬做的比较,有兴趣可以看看Gatling与Jmeter的比对。
简单使用介绍
下载完直接解压打开,去bin目录下:
然后在目录中打开cmd,输入gatling,他会启动,然后让你选择要模拟的脚本,有编号的,比如我输入了0,之后就等他跑,跑的时候会有信息:
就可以看到他会显示出请求名字,然后是成功和失败数目:
最终跑完后会生成报告:
报告在results目录内:
进去打开index.html:
报告页面:
可以看到这里有所有的接口的信息,包括总共调用多少次,成功和失败的比率,QPS,最大最小耗时,然后百分比区间耗时等,很全,而且你还可以点进去看详细的:
然后下面还有一些用户注入,响应时间,请求频率等信息:
然后我们来看下这个压测脚本,居然是java的,当然也可以用scala,其实内部核心是akka,用scala写的,都可以转换为字节码,在jvm上跑的,可以互相调用,也方便的,就是用scala不习惯:
看下脚本,其实很简单,就是跟普通写http请求差不多,只是这里需要创建场景,给用户并发这种,这个是框架自带的,可以直接用
package computerdatabase;
import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;
import io.gatling.javaapi.core.*;
import io.gatling.javaapi.http.*;
import java.time.Duration;
public class BasicSimulation extends Simulation {
//创建议信息
HttpProtocolBuilder httpProtocol =
http
// Here is the root for all relative URLs
.baseUrl("http://computer-database.gatling.io")
// Here are the common headers
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.doNotTrackHeader("1")
.acceptLanguageHeader("en-US,en;q=0.5")
.acceptEncodingHeader("gzip, deflate")
.userAgentHeader(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0");
// 创建场景
ScenarioBuilder scn =
scenario("Scenario Name")
.exec(http("request_1").get("/")) //get请求
// Note that Gatling has recorded real time pauses
.pause(7)//暂停多久
.exec(http("request_2").get("/computers?f=macbook"))
.pause(2)
.exec(http("request_3").get("/computers/6"))
.pause(3)
.exec(http("request_4").get("/"))
.pause(2)
.exec(http("request_5").get("/computers?p=1"))
.pause(Duration.ofMillis(670))
.exec(http("request_6").get("/computers?p=2"))
.pause(Duration.ofMillis(629))
.exec(http("request_7").get("/computers?p=3"))
.pause(Duration.ofMillis(734))
.exec(http("request_8").get("/computers?p=4"))
.pause(5)
.exec(http("request_9").get("/computers/new"))
.pause(1)
.exec(
http("request_10")
// Here's an example of a POST request
.post("/computers") //post请求,然后传一些form参数
// Note the triple double quotes: used in Scala for protecting a whole chain of
// characters (no need for backslash)
.formParam("name", "Beautiful Computer")
.formParam("introduced", "2012-05-30")
.formParam("discontinued", "")
.formParam("company", "37"));
{
//注入用户,刚开始就一个,协议是http
setUp(scn.injectOpen(atOnceUsers(1)).protocols(httpProtocol));
}
}
好了,最基本的介绍完了,这个只是命令行的,当然还有直接idea里跑的,这个网上可以找,很多资料,其实还有很多有意思的内容,可以看官网,或者看这些大佬的文章:
https://blog.csdn.net/qq_39261142/category_9622000.html
https://blog.csdn.net/o_oomg/category_9688662.html
好了,就这个就介绍到这里,这个很有意思,但是只是命令行的版本,后面我站在巨人们的肩膀上,整了一个web版本的压测系统,有些东西涉及到公司的东西,所以可能要精简下,然后可能会开源发布下,毕竟大多内容都也是开源框架里整来的,我只是最了点加工,所以还是得贡献出去,给更多有兴趣的人使用。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。
标签:pause,http,get,压测,exec,request,引擎,gatling,优化 来源: https://blog.csdn.net/wangwei19871103/article/details/122775533