关于性能:性能基础之浅谈常见接口性能压测

2次阅读

共计 5867 个字符,预计需要花费 15 分钟才能阅读完成。

背景

随着支流零碎的服务化设计,特地是 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 格局的返回数据

正文完
 0