SpringBoot默认以Tomcat作为内嵌Servlet服务器,SpringBoot也支持Jetty或Undertow作为容器,对比Tomcat Undertow具有更好的性能和吞吐量。
Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。
Undertow的特点如下:
- Servlet4.0 支持:它提供了对 Servlet4.0 的支持。
- WebSocket 支持:对 Web Socket 完全支持,包括JSR-356,用以满足 Web 应用巨大数量的客户端。
- 嵌套性:它不需要容器,只需通过 API 即可快速搭建 Web 服务器。
- 灵活性:交由链式Handler配置和处理请求,可以最小化按需加载模块,无须加载多余功能。
- 轻量级:它是一个 Web 服务器,但不像传统的 Web 服务器有容器概念,它由两个核心 Jar 包组成,加载一个 Web 应用可以小于 10MB 内存。
启用Untertow:
(1).排除Tomcat依赖
(2).添加Untertow依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springBoot-untertow-example</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除Tomcat依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- undertow依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
</project>
application.properties:
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
# 不要设置过大,如果过大,启动项目会报错:打开文件数过多
server.undertow.threads.io=16
# 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
# 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
server.undertow.threads.worker=256
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
# 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
server.undertow.buffer-size=1024
# 是否分配的直接内存(NIO直接分配的堆外内存)
server.undertow.direct-buffers=true
AppStart.class:
package com.fly;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class AppStart {
public static void main(String[] args) {
SpringApplication.run(AppStart.class);
}
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
使用Jmeter测试:
Apache JMeter是Apache开发的基于Java的压力测试工具。对于压力测试软件,它最初是为Web应用程序测试而设计的,但后来扩展到其他测试领域。它可以用来测试静态和动态资源,例如静态文件、Java servlets、CGI脚本、Java对象、数据库、FTP服务器等。JMeter可用于模拟服务器、网络或对象上的巨大负载,测试它们的强度,并分析它们在不同压力类别下的整体性能。此外,JMeter可以对应用程序执行函数/回归测试,并通过创建带有断言的脚本来验证程序是否返回了期望的结果。为了获得最大的灵活性,JMeter允许使用正则表达式来创建断言。
Apache JMeter可用于测试静态和动态资源(文件、Servlets、Perl脚本、Java对象、数据库和查询、FTP服务器等)的性能。)中。它可以用来模拟服务器、网络或对象上的重载,以测试它们的强度或分析它们在不同压力类型下的整体性能。您可以将其用于性能图形分析,或者在大并发负载下测试服务器 / script /对象。
注意:JMeter由于使用java语言开发的,所以要安装jdk,这里使用的JMeter是5.2(最新的版本是5.3,但是中文乱码),依赖jdk8+。进入JMeter的bin目录,windows系统执行bin目录下的jmeter.bat文件,Unix或Linux执行jmeter文件。
1.添加一个线程组
(1).创建线程组
(2).设置线程组信息。例如执行的线程数量、多长时间内执行完成、执行次数等等
2.为线程组创建HTTP请求默认值
创建HTTP请求默认值是为了后续创建HTTP请求少填一些信息,例如请求url和端口等等
3.创建HTTP请求
4.创建聚合报告
聚合报告可以查看测试后的结果信息,例如吞吐量、发送的http请求异常情况等等
5.发送请求并测试
Untertow聚合报告(不加application.properties中的配置)
Tomcat聚合报告:**
吞吐量对比:
Untertow平均吞吐量为:(245+253+274)/3=257
Tomcat平均吞吐量为:(220+264+265)/3=249
Untertow的吞吐量比Tomcat略胜一筹,由于是小Demo,项目越大吞吐量的差别也会越来越明显。