AJP协议可以帮助你对Tomcat服务进行压力测试
![](https://img.haomeiwen.com/i15423847/d64af18059878689.png-itluobo)
如果你在测试一个由Tomcat servlet容器(或者Apache web服务器)组成的环境时,你很可能会碰到瓶颈,因为Tomcat servlet容器使用Apache JServ Protocol - AJP。所以,如果想要评估Tomcat引擎的性能的话,最合适的方式就是使用相同的AJP协议。
使用Apache JMeter,你可以通过采样器(sampler)模拟发送AJP请求并返回结果 -- 也就是AJP/1.3采样器。你也可以用这个JMeter采样器来压测WildFly,Jetty和GlassFish servlet等Web容器,它们都是用AJP协议。这篇文章将会讲解如何来进行测试。
什么是AJP?
AJP是一个致力于从web服务器路由请求到应用服务器的二进制通信协议。在web服务器和应用服务器之间通信,AJP协议比HTTP协议更加高效,因为它是使用了压缩的二进制协议。例如,对于一个请求方法(“POST”或者“GET”),AJP只需要一个字节来表示,并且每个请求头只需要两个字节。所以,需要发送的信息大大减少,也就是得每个请求的处理也更快。
请求的处理大致如下:
- 客户端发送HTTP请求到web服务器。
-
Web服务器配置了mode_jk连接器,它会将HTTP请求转换成AJP请求,并发送给一个或者多个应用服务器。
AJP
对于这样的应用架构,JMeter AJP/1.3 采样器可以通过在你的系统上建立AJP连接,然后发送AJP请求到应用服务器,从而进行压测达到查找应用瓶颈的目的。
目前有3个版本的AJP协议 -- 1.2(废弃的),1.3 和 1.4(实验版本)。JMeter的AJP/1.3采样器支持1.3版本的AJP协议。
现在,我们来演示如何使用它。
AJP采样器
![](https://img.haomeiwen.com/i15423847/fbdf6a3ba13adae1.png-itluobo)
AJP/1.3 采样器可以将这里设置的HTTP请求转换成AJP请求。正如你所看到的,它的界面和HTTP采样器的十分相似。
- Server Name or IP: 指定你的servlet应用实例的IP或者服务器名。
- Port: AJP协议的默认端口是8009。
- Method: HTTP协议里的方法。
- Path: 指向资源的URL。
- Parameter: 这里你可以指定请求的参数。
AJP 采样器有一个限制 -- 当前版本的实现不支持在一个请求里上传多个文件。只有第一个文件会被上传。必须使用多个AJP 采样器来上传多个文件。
设置你的Tomcat实例环境
现在,让我们来看看AJP 采样器在JMeter脚本里是如何工作的。首先,我们先在本地机器上启动一个Tomcat实例,然后配置它来发送POST请求。Tomcat 9默认就带了一些servlet示例,可以用来测试AJP请求。
我们的测试场景是:
- 我们会使用“Request Parameter”这个Tomcat提供的实例,来模拟通过POST请求发送参数。
- 我们会发送一个带参数的POST请求,然后接收一个返回这些参数值的请求。
-
要启动Tomcat实例,你需要安装并配置Java运行时(JRE_HOME环境变量需要设置)。你还需要把
CATALINA_HOME
设置为你下载的Tomcat的根目录,然后将%CATALINA_HOME%/bin
添加到你的PATH
环境变量里。 -
上面的设置完成后,在命令行里执行
catalina_run
命令。你的Tomcat web界面就可以通过localhost:8080
来进行访问了。
Tomcat
-
你可以通过点击
Developer Quick Start:
下面的Examples
链接来查看示例应用。
Apache Tomcat Examples
-
我们试试“Request Parameters:”这个例子。
Servlet Examples with Code
-
在这个示例里,我们可以执行一个带“fisrtname”和“lastname”两个参数的POST请求。
Request Parameters Exxample
-
我们来手动输入一些值来看看相应结果。
Example
-
按
Submit
。
Submit
输入的值会被设置到“firstname”和“lastname”两个属性上。
接下来,我们会使用AJP 采样器来产生同样的请求。
通过AJP 采样器生成JMeter脚本
在前面的章节里,我们的servlet可以接受两个参数并在结果里返回它们的值。现在,我们使用AJP 采样器来发送带参数的AJP POST请求,通过JMeter执行,并在相应结果里拿到我们在请求里设置的参数。
- 打开JMeter,然后添加一个线程组(Thread Group)到你的测试计划(Test Plan)里。
右击-->Add-->Threads(Users)-->Thread Group
Test Plan
- 添加一个AJP 采样器到你的线程组(Thread Group)里。
右击->Add->Sampler->AJP/1.3 Sampler
AJP 采样器
- 像配置一个HTTP 采样器一样配置这个AJP 采样器
- 把Server Name参数的值设置为"localhost",因为Tomcat实例运行在本机上。
- Port设置成“8009”(默认的AJP端口)。
- Method设置成“POST”。
- Path的值设置成“/examples/servlets/servlet/RequestParamExample”,这是访问“Request Parameter”实例的路径,你可以在浏览器的地址栏里找到。
- 设置请求参数(可以是任意值):
- firstname:testFirstName
- lastname:testLastName
设置完成后的采样器如下:
![](https://img.haomeiwen.com/i15423847/7400ffee2bb17cd4.png-itluobo)
- 添加一个查看结果树监听器(View Results Tree Listener)。
右键->Add->Listener->View Results Tree
结果树j监听器
6.现在,我们可以运行结果,并在监听器里查看结果。
![](https://img.haomeiwen.com/i15423847/313ef0cc69601ddf.png-itluobo)
现在,可以看到我们的采样器已经顺利地把带有我们设定的参数的AJP请求发送到我们的服务器上。并且,可以看到之前设置的参数都列在“Paramater in this request”部分 -- 这意味着我们的服务已经收到我们的请求了。
恭喜!你现在知道怎么压测AJP协议以及Tomcat服务了。为了更加方便地去执行你的测试,你可以将脚本上传到BlazeMeter上,然后直接在云上运行。你能够很方便的进行扩展,协同合作,并且可以得到高级的报表。
网友评论