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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>springBoot-untertow-example</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>2.3.4.RELEASE</version>
  13. </parent>
  14. <dependencies>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-web</artifactId>
  18. <!-- 排除Tomcat依赖 -->
  19. <exclusions>
  20. <exclusion>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-tomcat</artifactId>
  23. </exclusion>
  24. </exclusions>
  25. </dependency>
  26. <!-- undertow依赖 -->
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-undertow</artifactId>
  30. </dependency>
  31. </dependencies>
  32. </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).创建线程组
01.png
(2).设置线程组信息。例如执行的线程数量、多长时间内执行完成、执行次数等等02.png

2.为线程组创建HTTP请求默认值

创建HTTP请求默认值是为了后续创建HTTP请求少填一些信息,例如请求url和端口等等
03.png

04.png

3.创建HTTP请求

05.png

06.png

4.创建聚合报告

聚合报告可以查看测试后的结果信息,例如吞吐量、发送的http请求异常情况等等
07.png

08.png

5.发送请求并测试

Untertow聚合报告(不加application.properties中的配置)
200.png
201.png
202.png

Tomcat聚合报告:**
100.png
101.png
102.png
吞吐量对比:
Untertow平均吞吐量为:(245+253+274)/3=257
Tomcat平均吞吐量为:(220+264+265)/3=249
Untertow的吞吐量比Tomcat略胜一筹,由于是小Demo,项目越大吞吐量的差别也会越来越明显。