背景
随着支流零碎的服务化设计,特地是SOA架构和微服务架构的风行,接口曾经成为各零碎间通信的桥梁。所以,接口的性能压测也变得越来越重要。
SOA(Server OrientedArchitecture,面向服务架构)是目前通用的组件模型。它将软件系统的不同功能模块(被称为服务)通过接口的模式分割起来。这里的接口能够是具体的接口服务也能够是连贯两个模块通信的中间件。一个大型项目通常是由多个零碎开发组成的,每个零碎都有专门的研发团队来负责,单个零碎的性能被称作一个模块。而模块的性能是按后盾的接口实现和UI出现来划分。
微服务架构在某种程度上是面向服务的架构SOA持续倒退的下一步。基本上,这种架构类型是开发软件,网络或挪动应用程序作为独立服务套件(又称微服务)的一种非凡形式。这些服务的创立仅限于一个特定的业务性能,如用户治理、用户角色、电子商务车、搜索引擎、社交媒体登录等。此外,它们是齐全独立的,也就是说它们能够写入不同的编程语言并应用不同的数据库。集中式服务治理简直不存在,微服务应用轻量级HTTP、REST或Thrift API进行通信。
次要指标
取得单接口/单业务容量
发现应用程序的性能瓶颈
发现数据库的性能瓶颈
测试策略
概述
很多时候咱们在设计接口性能压测脚本须要调用零碎接口平台,如果接口平台没有提供可用的UI界面,那么就须要咱们本人写代码联合压测工具连贯接口平台,依照对应的协定调用接口。接口办法运行过程中须要调用很多依赖的办法。依赖办法不同的返回内容也是须要思考的。然而依赖接口内容咱们是不可控的。有时候是依赖模块不能失常运行,有时是依赖模块还未开发完,有时是咱们是主观上无条件让依赖模块返回想要的异样值。这时候咱们在压测的时候就须要Mock零碎实现了,在Mock零碎(挡板)定义好接口相干数据后,填入指标返回后果,就能模仿依赖接口返回想要的内容
联合开源的性能测试工具Jmeter(本文只讲此工具),只须要把URL通过模仿HTTP并发申请就能够失去对应的执行后果,再依据返回后果判断接口执行是否正确。 所以相对来说工夫老本比拟低,一个场景转化成测试脚本也是比较简单的事件。接口公布上线后,参数很少发生变化。因为接口做为服务公布后会有多个调用方,如果参数发生变化将告诉所有调用方做响应的批改,否则将呈现调用方无奈应用的状况。接口定义稳固不太容易发生变化,所以接口性能压测的前期保护工作也就不多。
次要类型
类型 | 具体内容 |
---|---|
效率(性能) | 并发数、响应工夫 、TPS、错误率、资源占用 |
稳定性 | 单用户长时间下的重复操作、多用户长时间并发操作、异样值下的长时间重复操作、最大故障时长 |
压力 | 超规格负载下的规格内的解决 |
恢复性 | 负载失常后,零碎是否失常复原 |
常见接口
目前支流零碎的接口大抵可分为HTTP接口和自研RPC(Remote Procedure call,近程过程调用)接口,而HTTP接口可能更为广泛一些。
HTTP接口
个别压测WEB零碎都会接触HTTP接口 常见有HTTP和HTTPS两种协定
HTTP 超文本传输协定,默认80端口
HTTPS 平安超文本传输协定,能够了解为http协定的平安版,默443端口
HTTP常见两种申请办法:GET和POST
与Server进行申请/响应时,两种最常被用到的两种办法
GET 从指定的资源申请数据
POST向指定的资源提交要被解决的数据
RPC接口
RPC(Remote Procedure Call Protocol)——近程过程调用协定,它是一种通过网络从近程计算机程序上申请服务,而不须要理解底层网络技术的协定。 其实简略的说,就是象调用本地的类的办法样来调用服务器端的办法实现。
须要要对RMI(Remote Method Invoke,近程办法调用)中的stu(桩)和skeleton(骨架)的概念有一点理解。RMI的代理模式是通过代理对象将办法传递给理论对象的。Stub驻留客户端,承当着代理近程对象实现者的角色。skeleton类帮忙近程对象与sttub连贯进行通信。
次要组成元素:
次要原理:
实体对象和业务接口由客户端和服务端专用。 接口实现是由服务端对定义好的业务接口进行性能实现,并将接口实例注册服务中提供给客户端调用。
目前咱们接触到RPC接口次要有Hession、Dubbo、HTTP、Thrift、Hprose等
Hession、Dubbo、Thrift、Hprose都是近程办法调用的一种实现,客户端须要保留stub来调用接口。这就是为什么咱们性能压测的时候须要Jmeter援用jar包。
Hession:是一个轻量级的remoting onhttp工具,应用简略的办法提供了RMI的性能,近程办法调用的一种,采纳二进制RPC协定(基于Http协定),适宜发送二进制数据,不适宜简单对象类型的传输。
Dubbo:阿里巴巴开源的一个高性能优良的服务框架,一个近程办法调用的框架。Dubbo注册核心负责服务地址的注册和查找,相当于服务目录:Dubbo监控核心负责统计各服务调用次数、调用工夫
Thrift:facebook开源的一个可互操作和可伸缩服务的框架一个近程办法调用的框架,可扩大且跨语言的服务的开发。容许你定义一个简略的定义文件中的数据类型和服务接口(IDL)。之后生成服务器骨架和客户端调用代理
Hprose:国人开发的一个近程办法调用的开源框架。它是一个先进的轻量级的跨语言跨平台面向对象的高性能近程动静通信中间件。
HTTP:常见于WEB利用,基于HTTP协定传输文本。当一个URL发送申请时,服务端doGet或者doPost办法会被调用,获取相应的参数。压测HTTP接口时,只须要通过定位URL接口并传参断言,绝对比较简单。
上面针对几种接口简要阐明: Hession接口压测:
通过接口URL获取接口,如果复制接口定义及其自定义类,包名尽量跟开发包保持一致,不倡议应用间接复制代码的形式,因为这样不便于保护,应用Maven在pom文件引入接口和Hessian依赖的jar包。通常借助HessianSpringFactoryBean获取,再联合Jmeter自定义JAVA类申请和Stub的形式接入测试工具进行压测
HessianProxy是hessian client解决客户端申请的外围类,采纳proxy模式,代理客户端对近程接口的调用,hessian client的主程序的时序图如下:
Dubbo接口压测测试:
如果通过Dubbo注册核心获取服务接口,那么搭建测试环境的时候须要指定Dubbo注册核心的地址,扩大Jmeter也须要配置Dubbo注册核心地址以及对外提供服务的接口名称。直连的形式在Jmeter须要导入Dubbo框架相干的JAR包。当初有现成的Jemter dubbo插件,间接引入即可
节点阐明:
Provider:裸露服务的服务提供方
Consumer:调用近程服务的服务生产方
Registry:服务注册与发现的注册核心
Monitor:统计服务调用次数和服务调用工夫的监控核心
Container:服务运行容器
Jemter Dubbo插件地址:https://github.com/dubbo/jmet...
Jemter DubboSample截图
Thrift接口压测:
通过Stub驻留客户端调用用接口描述语言来写接口(IDL),生成服务器skeleton(骨架)类和客户端调用代理,skeleton类帮忙近程对象与sttubb驻留客户端连贯进行通信,客户端和服务器端是紧耦合在一起的,你不能独自批改任何一端的接口(不是说服务器端代码的实现),服务器和客户端传递的数据类型是严格匹配的
具体的办法能够参照上面这篇文章:
性能工具之Jmeter压测Thrift RPC服务
Hprose接口压测:
由服务端对定义好的业务接口进行性能实现,并将接口实例注册服务中提供给客户端调用。本地的函数和办法作为服务公布,而客户端通过能够依据本人的须要来定义调用接口,或者间接调用服务器端的函数或办法。再联合Jmeter自定义JAVA类申请和Stub的形式接入测试工具进行压测。
HTTP接口压测:
相对来说最简略,通过Jmeter HTTP Request Sampel并发调用接口断言即可
总之,接口压测测试方法因框架不同其实现申请压测有所差别,但总的来说都是获取接口,并发申请,参数化数据,执行脚本,断言后果,监控数据这些步骤。
上面来做两个实际小例子
实际小例子
首先介绍下什么叫Mock?
此处援用淘宝网《接口测试白皮书》中的对mock的定义:
mock 是指应用各种技术手段模拟出各种须要的资源以供测试应用。
被mock的资源通常有以下特色:
被测指标依赖该资源
该资源可能因为各种起因不稳固、返回后果一直变动或者并不总是可能获取到
该资源跟被测指标自身品质无关
这些资源可能是一个内部或底层接口、一个零碎、一组数据对象或者是一整套目标软件的工作环境等。通过mock防止对外部实在资源的依赖实现对被测指标的孤立测试,从而大大降低测试的难度,节约测试老本。
须要留神的是利用mock通过的测试与应用实在环境通过的测试毕竟还是有肯定差异的。有些时候咱们就是须要所测试的零碎可能解决依赖所产生的各种状况,包含失常状况和异常情况,咱们同样不能保障咱们的mock 能够模仿到每种这样的状况。因而只在的确有必要的状况下才使用mock。
Moco
简略来说Moco就是相似一个mock的工具框架,下载就是一个JAR包
在Moco的github下面有这段话。
Integration, especially based on HTTP protocol, e.g. web service, REST etc, is wildly used in most of our development. In the old days, we just deployed another WAR to an application server, e.g. Jetty or Tomcat etc. As we all know, it's so boring to develop a WAR and deploy it to any application server, even if we use an embeded server. And the WAR needs to be reassembled even if we just want to change a little bit.
翻译过去:
集成,特地是基于HTTP协定的集成,例如web服务、REST等,在咱们的大多数开发中都被宽泛应用。 在过来,咱们只是将另一场WAR包部署到应用服务器上,例如Jetty或Tomcat等。家喻户晓,开发一个WAR包并将其部署到任何应用服务器上是十分干燥的,即便咱们应用的是嵌入式服务器。war包也须要被从新打包即便咱们只是想略微扭转一下。
简略来说,Moco就是解决了开发前端时没有后端反对,开发接口时依赖没有到位的难堪场景。当然Moco的灵活性,让其有越来越多的利用场景,比方咱们在开发接口性能压测脚本的时候。
特点:
只须要简略的配置request、response等即可满足要求,反对http、https、socket。能够说是十分的灵活性。
反对在request 中设置 Headers , Cookies , StatusCode等。
对GET、POST、PUT、DELETE等申请形式均反对,很适宜web开发。
无需环境配置,有java环境即可。
批改配置后,立即失效。只须要保护接口,也就是契约即可。
对可能用到的数据格式都反对,如json、text、xml、file等。
还能与其余工具集成,如Junit、Maven、Gradle等。
foo.json配置示例:
[ { "response" : { "text" : "Hello, Moco" } }]
1.
加载配置启动Moco HTTP Server
java -jar moco-runner--standalone.jar http -p 12306 -c foo.json
1.
Github地址:https://github.com/dreamhead/...
压测HTTP GET办法
此处示例均只设置一个线程
startupGet.json配置文件:
[ { "description":"这是一个带cookies和参数的get申请", "request":{ "uri":"/7dget", "method":"get", "cookies":{ "login":"7dgroup" }, "queries":{ "name":"zuozewei", "sex":"man" } }, "response":{ "text":"success!" } }]
1.
加载配置启动Moco HTTP Server
Jmeter设置Cookies
name字段为一个cookie的名称。
value字段为一个cookie的值。
domain字段为能够拜访此cookie的域名,本机为localhost
非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名自身,不能设置其余二级域名的cookie,否则cookie无奈生成。
Jmeter设置HTTP GET Request
留神,查问字符串(名称/值对)是在 GET 申请的 URL 中发送的:
/7dget?name1=value1&name2=value2
Jmeter承受的Response后果
正确承受到服务端的返回信息
压测HTTP POST办法
startupGet.json配置文件:
[ { "description":"这是一个带headers和cookies以及Json参数的post申请", "request":{ "uri":"/7dpost", "method":"post", "headers":{ "content-type":"application/json" }, "cookies":{ "login":"7dgroup" }, "json":{ "name":"zuozewei", "sex":"man" } }, "response":{ "status":200, "json":{ "name":"success", "code":"1" } } }]
1.
加载配置启动Moco HTTP Server
Jmeter设置headers
Jmeter设置Cookies
Jmeter设置HTTP POST Request
留神此次参数的格局是JOSN格局,是在音讯主体中发送的。
Jmeter承受的Response后果
依据咱们的配置,服务端返回的是一个Json格局的返回数据