JMeter - 揭开分布式压测的神秘面纱

 接触过实际项目开发的同学都知道,作为一个有梦想的开发,我们提供的服务需要尽可能保持更高的质量和性能。这里JMeter就登场了,通过一些工具我们可以对自己所编写代码的性能有一个很清晰的认识并根据具体指标分析去做优化。

1. 常用压测工具对比

 相信大家对常用的压测工具都有一些接触,目前LoadRunnerApache abWebbench这几款都是我们平时出镜率比较高的压测工具。这里我们对每一款做一个简单的对比:

  1. LoadRunner:这款工具性能比较稳定、压测结果及细粒度大、功能繁多,还可以通过自定义脚本实现一些特殊场景验证。不过优点越明显缺点也可能越明显,相对来说比较重量级,学习和使用成本都比较高。
  2. Apache ab:这款工具也可以模拟多线程并发请求,并且对使用该工具的机器配置要求较低(内存、CPU占用很低),不过却可以给目标服务器造成巨大的负载。这款工具在压测单接口时使用最为频繁,另外还能实现一些简单的DDOS攻击,不过我们不提倡,我们立志要做网络的守护者。另外这款工具的使用我们在【Spring Boot - 集成Redis以及使用Apache AbTest进行压力测试】中使用过,大家可以简单了解下。
  3. Webbench:这款工具主要是通过fork多个子线程然后分别循环去进行Web访问测试的,子进程会通过pipe去将结果返回给父进程,父进程去做总体的一个统计。


 最后压轴的就是我们这里要介绍的JMeter了,这里暂时不做简单的介绍,后面会逐步深入去探索这款工具的神奇之处。

2. JMeter基本介绍和使用场景

2.1 JMeter基本介绍

 要对JMeter做一个基本介绍,那就得从它功能上讲起,这款工具支持的协议和应用类型也是十分丰富的:

  1. TCP
  2. FTP
  3. Web - HTTP, HTTPS
  4. Database via JDBC
  5. SOAP / REST Webservices
  6. Message-oriented middleware (MOM) via JMS
  7. Mail - SMTP(S), POP3(S) and IMAP(S)
  8. LDAP(轻量目录访问协议)

 上述这些都只是它所支持的众多协议中比较常用的协议,还有一些其他的大家可以自己去了解。

2.2 JMeter使用场景

JMeter作为一款非常成功的工具,那么它的使用场景就不会单一,下面这些都是我们平时实际会遇到的一些常见的场景:

  1. 功能测试
  2. 压力测试
  3. 分布式压力测试

 如果使用过其他压测工具的同学可以自己做一个比较,使用JMeter从我个人感受来说带给我的是一种轻快、方便的感觉。这还是一款基于Java 开发的工具,性能也很好。当我们需要快速去完成一些压测场景时,这款工具由于上手十分简单则是当仁不让的选择。它还提供了对测试数据的分析以及可以自动生成各种报表数据图形,十分强大。

3. Windows环境安装JMeter

3.1 下载安装JMeter

 这里我们主要先讲下在Windows环境下如何安装JMeter,后面进行分布式压测时会讲解Linux环境的安装。过程十分简单。
 首先有一点是我们需要注意的,由于JMeter是通过Java编写的,所以我们需要事先安装好JDK8(或以上),这里不做过多讲解。我们这里可以进入【Apache JMeter-Download Apache JMeter】去下载最新版本的JMeter

Windows环境我们下载zip的即可,另外如果官网下载太慢或者无法下载的同学可以通过【清华大学软件镜像站】【北京理工大学软件镜像站】下载我们所需的软件。我们还可以通过【JMeter官方使用文档】去了解一些快速使用的方法。这里如果大家有JRE环境的化也可以无需安装JDK,这里推荐安装JDK是因为在使用某些功能时需要有JDK的支持。

3.2 JMeter目录简单介绍

 下载完成后,我们只需将zip压缩包解压即可。解压完成后目录大概就是下面这样:

 这里我们简单对这些目录做一个介绍:

  1. bin:核心可执行文件,包含配置文件
    1)jmeter.bat: windows环境JMeter启动程序
    2)jmeter.sh: linux环境JMeter启动程序
    3)jmeter-server.bat: windows环境分布式压测启动程序
    4)jmeter-server.sh: linux环境分布式压测启动程序
    5)jmeter.properties: 核心配置文件
  2. extras:插件拓展的包
  3. lib:核心的依赖包
  4. ext:核心包
  5. junit:单元测试包

3.3 JMeter语言切换

 我们点击jmeter.bat打开之后,界面默认是英文的。虽然推荐大家坚持使用英文环境的习惯,但这里还是介绍下。我们可以通过Options -> Choose Language去选择我们需要的语言即可。

 另外大家可以发现通过这种方式修改的语言重启之后又会变回应用,属于临时性的方案。这里我们找到JMeter /bin 目录下jmeter.properties找到language=

 这里我们将注释放开并且设置成我们需要的语言即可,下面提供了所支持的语言对应的属性值。修改保存后重新启动即可。

4. JMeter初体验

4.1 快速开发API接口

 这里我们利用Spring Boot编写一个接口,如何编写这里不做过多的介绍,大家可以通过自己擅长的方式去编写一个接口即可。这里贴出我们接口相关代码,这里主要提供一个GET和一个POST接口用于获取球星列表以及球星对应评分,喜欢篮球的同学一看就懂啦,后面咱们还会专门写一篇通过NBA某个赛季的各项数据综合分析拟定一个训练模板去推测后面一个赛季的比赛结果。

package com.ithzk.controller;


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;

/** * @author hzk * @date 2019/8/23 */
@RestController
public class JMeterController {

    @GetMapping("/stars")
    public Object stars(){
        System.out.println("stars...");
        return getStars();
    }

    @PostMapping("/getScore")
    public Object getScore(String name){
        HashMap<String, Integer> stars = getStars();
        System.out.println("getScore...");
        return stars.get(name);
    }

    private static HashMap<String,Integer> getStars(){
        HashMap<String, Integer> stars = new HashMap<>(3);
        stars.put("kobe",99);
        stars.put("tracy",95);
        stars.put("nash",94);
        return stars;
    }

}

 启动项目,访问http://127.0.0.1:8080/stars,编写完成。POST接口这边先不请求,待会会直接通过工具校验。

4.2 创建测试计划测试接口

 这里我们先通过测试计划去添加一个setUp Thread Group

 这里我们修改几个主要参数,

  1. Name:线程组名称
  2. Number of Threads:线程数
  3. Ramp-up period:多少秒内到达指定线程数
  4. Loop Count:循环次数

     这里我们再来新增一个HTTP请求

     这里我们也修改一些参数,大家应该一目了然就知道什么意思,英文不好的同学可以中英文切换使用慢慢熟悉。

 修改好之后我们点击启动。

 此时我们可以看到我们服务后台不停接收到请求,也就是开始配置的数量,大家可以自己数数。

 此时时候我们可以发现在JMeter上没有看到任何变化,这是因为我们还缺少一项组件结果树。如下图操作即可添加结果树。

 再次启动,我们可以看到结果树中将我们每次请求的结果以及一些数据都展现了出来。大家是不是对JMeter有了一个简单的认识呢。