使用 jMeter 构造大量并发 HTTP 请求进行微服务性能测试
比如我开发好了一个微服务,想测试其在大并发请求下的性能表现如何。
比较方便的一个做法是使用工具jMeter来构造这些请求。
创建一个新的工程:
创建一个新的 Thread Group,下图意思是这个工程会使用 3 个线程同时发请求,每个请求执行一次。
在这个 Thread Group 里创建一个新的 HTTP 请求,维护如下属性。
Protocol: https
Server name:
Http request method: GET
Http path: /sap/c4c/odata/v1/c4codata/AccountCollection/
Use KeepAlive: 不选择
在参数标签页,维护参数名称 $search, 值为'Wang'。这个请求的意思是使用 Odata 请求查询账号名称为'Wang'的实例。
创建一个新的 HTTP Header Manager,维护执行这个请求的 Authorization 信息。这里我使用 Basic 认证方式,即 HTTP header 名称为 Authorization,值为用户名:密码经过 base64 编码之后的值。
维护完毕之后点执行按钮,
会观察到 3 个线程同时发出 HTTP 请求,并能看到每个请求的响应时间。
也可以用命令行 jmeter -n -t 的方式执行测试,看到的结果和在 jMeter GUI 上执行的一致。
在前一篇文章使用jMeter构造大量并发HTTP请求进行微服务性能测试里,我介绍了如何用 jMeter 构造并发 HTTP 请求。但是通过文中介绍的方式构造的并发请求,其请求参数都是硬编码的'Wang'.
有没有办法让每个并发请求查询的参数都不一样呢?比如让 jMeter 构造一些从 1 到 100 的随机数,作为查询请求的一部分?
JerryTestCustomer_<1~100>
解决方案
创建一个 User Parameter:
Parameter 的 Name 为 uuid,值为 ${__Random(1,100)}
这个__Random(1,100)是 jMeter 提供的随机数发生器。
然后在 HTTP Request 的 Parameters 标签页里面,使用这个参数即可。
测试
随机数生成生效,每个并发请求发出的查询参数现在都不一样了。
在前一篇文章使用jMeter构造大量并发的随机HTTP请求里我通过 jMeter 构造了大量的 HTTP GET 并发请求,对服务器产生了大量读操作。
现在我有另一个需求场景:假设我开发了一个创建 Service Request 的微服务,需要使用 HTTP post 调用。为了防止 Cross Site Request Forgery(跨站域请求伪造),这个微服务调用时需要传一个 XSRF token,这个 XSRF token 需要另一个 HTTP get 请求从服务器请求。
因此,这里存在两个逻辑上相关的 HTTP 请求:
1. 先调用 HTTP get 从服务器读取 XSRF token
2. 将第一步获得的 XSRF token 作为 HTTP post 请求头部的一个参数传至服务器。
用 jMeter 怎么实现这个场景呢?
总的思路就是使用 Transaction Controller,将 http get 请求和 http post 请求包在一起,如下图所示。
在第一个 http get 请求里,使用 HTTP 头部参数 x-csrf-token 去读取 token。
创建一个参数 jerrycsrftoken,使用正则表达式将服务器通过 HTTP 响应头部返回的 token 解析出来并保存。
然后创建第二个 HTTP post 请求,在请求头部使用第一个请求创建的参数 jerrycsrftoken 即可。
这是我 HTTP post 请求的 body 内容,里面使用了 jMeter 自带的随机数发生器作为创建成功的 Service Request 的后缀。
最后使用 jMeter 成功创建的 Service Request 在系统显示如图:
版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/2ddbcb40d6e4e16cdaafd62a6】。文章转载请联系作者。
评论