专栏首页好好学java的技术栈一文教你 Dubbo 服务性能压测(with JMeter)

一文教你 Dubbo 服务性能压测(with JMeter)

前言好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达今日推荐:为什么魂斗罗只有 128 KB却可以实现那么长的剧情?个人原创+1博客:点击前往,查看更多
原文地址:https://ricstudio.top/archives/dubbo-benchmark-jmeter
转载请注明出处!

前言

最近在做Dubbo服务与Prometheus的监控集成,为了测试监控组件对Dubbo RPC 调用的性能影响,就需要对添加前后做性能测试。虽然之前给组内搭建了统一的Dubbo 服务测试平台,但是无法用于性能测试。

说起性能测试,大家可能会有很多选择,wrk、JMeter等等。但是相信大家一般都是用于测试HTTP接口,对于这种Dubbo框架的这种私有协议dubbo://,这些工具没有提供原生的支持。第一个想法就是通过Dubbo 的泛化调用来自己写一个客户端,然后统计测试结果,但是这样一是不优雅,二是有可能重复造轮子,浪费时间。经过一番google之后,果然得到了想要的答案。

今天要介绍的,就是一款来自于Dubbo 社区的JMeter 插件jmeter-plugins-for-apache-dubbo,使用这款插件,就可以让JMeter 对Dubbo 服务的测试。

本文假定读者使用JMeter 进行过简单的性能测试,并且安装了JMeter

正文

Step 1:安装Dubbo 插件

  1. 克隆项目:git clone https://github.com/thubbo/jmeter-plugins-for-apache-dubbo.git
  2. 打包项目,构建 JMeter 插件:mvn clean install 或者你可以直接跳过上面两步,下载 jmeter-plugins-dubbo-2.7.3-jar-with-dependencies.jar
  3. 将插件添加到 ${JMETER_HOME}\lib\ext(安装完之后重启jmeter)

image.png

Step 2:编写JMeter 脚本

1、创建Dubbo Sample

【测试计划】 区域右键单击 【线程组】,并选择 【添加】 > 【取样器】 > Dubbo Sample

image.png

Dubbo Sample 对话框中配置注册中心地址、服务接口名(Java interface 类名)、方法名、参数类型和参数值等信息。

配置步骤如下:

  • 配置注册中心,通常使用 ZooKeeper。(配置完成之后,点击上面Get Provider List 按钮获取注册的服务列表)
    • Protocol 选择为 zookeeper,则 Address 填写 ZooKeeper 地址。
    • 若生产环境通常包含多个 ZooKeeper 节点,可填写多个 ZooKeeper 地址并用英文逗号(,)隔开。
    • 若针对单台服务器进行测试,则将 Protocol 选择 noneAddress 填写 Dubbo 服务地址。
  • 按需调整服务调用配置,如分组 Group、版本 Version、调用超时时间 Timeout(默认为 1 秒)等。
  • 配置 Dubbo 服务的完整 Java 接口类名和方法名。
  • 配置每个参数的参数类型和参数值。
    • 参数类型:基本类型(如 boolean, int 等)直接写类型名,其他类型写完整 Java 类名(注意哦,是完整类名)。
    • 参数值:基本类型和字符串直接写参数值,复杂类型用 JSON 表示填写

image.png

为了方便本地调试测试脚本,可以添加结构监听器,右键单击 【线程组】,选择 【添加】 > 【监听器】> 【察看结果树】,添加 察看结果树 监听器。

Step 3:测试执行

在**【线程组】上右击,点击【验证】**,执行单次请求,来测试工具与服务的联通性。

在**【察看结果树】选项卡中可以看到【响应数据】**返回如预期,说明可以正常执行 Dubbo 调用了。

image.png

Step 4:添加断言

有时候你会看到执行结果显示成功,但是实际上Dubbo 服务调用失败了,或者业务处理失败,返回结果中包含了错误码。比如下面两张图。

RPC 调用失败。

image.png

业务处理失败。

image.png

解决方法:

针对此类问题,可以添加断言来检查服务是否成功。泛化调用的结果以 JSON 形式返回,可以添加断言检查返回的 JSON 数据,以更准确的校验服务执行是否成功。

具体步骤就是,在 jmeter的 【测试计划】 区域右键单击 Dubbo Sample,并选择 【添加】 > 【断言】 > 【JSR233 Assertion】

image.png

这里我给出我的groovy 测试脚本代码:

String respStr = null;
Map<String, Object> resp = null;
try {
    respStr = SampleResult.getResponseDataAsString();
    resp = (Map<String, Object>) com.alibaba.fastjson.JSON.parse(respStr);
} catch (Throwable ex) {
    // pass
    log.error("error", ex);
}
if (resp == null) {
    AssertionResult.setFailure(true);
    AssertionResult.setFailureMessage("RESPONSE IS NOT JSON: " + respStr);
} else {
    // 简单检查: dubbo 泛化调用失败时, 返回 JSON 包含 code 和 detailMessage 字段.
    if (resp.get("code") != null && resp.get("detailMessage")) {
        AssertionResult.setFailure(true);
        AssertionResult.setFailureMessage("rpc exception, code=" + resp.get("code") + " detailMessage=" + resp.get("detailMessage"));
    } else if(!"SUCCESS".equals((String)resp.get("code"))) {
        // TODO 根据你自己的实际业务,校验请求是否成功.
        AssertionResult.setFailure(true);
        AssertionResult.setFailureMessage("请求失败, code=" + resp.get("code"));
    } else {
        AssertionResult.setFailure(false);
    }
}

image.png

让我们看看,添加了断言之后,再验证的结果。

image.png

可以看到,断言起到了业务校验的作用,并且提示了报错信息。

至于如何编写脚本的其他部分,就要考虑你要模拟的场景来设置了,属于如何使用JMeter的部分,所以这里就不过多叙述。

更多常见问题

关于该插件的更多常见问题,请参考该插件的github wiki中的FAQ。

参考

  • jmeter-plugins-for-apache-dubbo)

本文分享自微信公众号 - 好好学java(SIHAIloveJAVA)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 重磅!!面试季--最新面试题总结出厂,附题解,后期持续分享!

    你答: 我听过一个这样的故事:讲的是蚯蚓一家人,有一天,蚯蚓爸爸特别无聊,就把自己切成了俩段愉快的打羽毛球去了,蚯蚓妈妈见状,把自己切成了四段,打麻将去了,蚯蚓...

    好好学java
  • Spring中的Controller ,Service,Dao是不是线程安全的?

    Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是...

    好好学java
  • ”365算法每日学计划”:02打卡-线性表(赠书活动第①期预告)

    好好学java
  • 最火的实时计算框架Flink和下一代分布式消息队列Pulsar的批流融合

    Apache Flink 和 Apache Pulsar 的开源数据技术框架可以以不同的方式融合,来提供大规模弹性数据处理。Flink Forward San ...

    暴走大数据
  • 最火的实时计算框架Flink和下一代分布式消息队列Pulsar的批流融合

    Apache Flink 和 Apache Pulsar 的开源数据技术框架可以以不同的方式融合,来提供大规模弹性数据处理。Flink Forward San ...

    王知无
  • Flink 和 Pulsar 的批流融合

    Apache Flink 和 Apache Pulsar 的开源数据技术框架可以以不同的方式融合,来提供大规模弹性数据处理。4 月 2 日,我司 CEO 郭斯杰...

    Spark学习技巧
  • 【转载+微整】Navicat Premium 12.0.18安装、激活和简单使用

    Navicat Premium 12 是一套数据库开发管理工具,支持连接 MySQL、Oracle等多种数据库,可以快速轻松地创建、管理和维护数据库。

    黑泽君
  • pytorch基础知识-tensor张量的创建 下

    若使用rand_like的函数,torch.rand_like(a)表示接收的参数不再是shape,而是tensor类型。将上面的a的shape读出来后,再送给...

    用户6719124
  • 贪婪模式、懒惰模式、独占模式一网打尽,分享一个正则回溯分析工具

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    业余草
  • 小白学PyTorch | 10 pytorch常见运算详解

    这一课主要是讲解PyTorch中的一些运算,加减乘除这些,当然还有矩阵的乘法这些。这一课内容不多,作为一个知识储备。在后续的内容中,有用PyTorch来获取Ef...

    机器学习炼丹术

扫码关注云+社区

领取腾讯云代金券