springboot中undertow容器的使用及说明

 更新时间:2025年11月28日 08:56:43   作者:赶路人儿  
Undertow是一个轻量级、高性能的Java Web服务器,支持HTTP/2、WebSocket等,Spring Boot中使用Undertow需要排除Tomcat依赖并添加Undertow依赖,Undertow的配置项包括访问日志、缓冲区大小、解码URL等,性能方面

1、undertow介绍

官网:https://undertow.io/

Undertow 是一个轻量级的、高性能的 Java Web 服务器,由 JBoss 开发并开源。它是基于非阻塞(non-blocking)的I/O模型,具有低资源消耗和高并发处理能力。

Undertown 的优势如下:

  • 支持 HTTP/2:Undertow 开箱即支持 HTTP/2,无需重写启动类路径。
  • 支持 HTTP Upgrade:允许通过 HTTP 端口复用多种协议。
  • 支持 Web Socket:Undertow 提供对 Web Sockets 的全面支持,包括 JSR-356 支持。
  • Servlet 4.0:Undertow 支持 Servlet 4.0,包括对嵌入式 Servlet 的支持。还可以在同一部署中混合使用 Servlet 和原生 undertow 非阻塞 handler。
  • 可嵌入式:只需几行代码,即可将 Undertow 嵌入应用程序或独立运行。
  • 灵活性:Undertow 通过链式 handler 进行配置,可以根据需求灵活地添加功能。
  • 在很多场景的测试下, Undertow 的性能都高于 Tomcat。天生适合作为 Spring Boot 应用的嵌入式服务器!

说明:tomcat主要支持以下几种IO 模型:

  1. BIO(Blocking I/O):传统的同步阻塞IO,每个请求都对应一个线程,在处理速度慢的情况下容易造成线程堆积。
  2. NIO(Non-blocking I/O):使用JDK 1.4 和 java.nio 包,支持非阻塞I/O,能够通过少量线程处理大量并发连接,提高了服务器的吞吐量和并发能力。Tomcat 8 及以上版本默认就运行在NIO 模式下。
  3. APR(Apache Portable Runtime):通过JNI 调用Apache HTTP 服务器的核心动态链接库,利用操作系统的非阻塞IO 能力,可以大幅提升处理静态文件和高并发的性能。
  4. AIO(Asynchronous I/O,也称NIO.2):从JDK 7 开始支持的异步非阻塞IO,是目前最先进的IO 模型。

2、springboot中使用undertow

Spring Boot 默认使用 Tomcat 作为嵌入式 Servlet 服务器,所以 spring-boot-starter-web 默认依赖了 spring-boot-starter-tomcat。

要使用 Undertow 首先要从 spring-boot-starter-web 排除 spring-boot-starter-tomcat,再添加 spring-boot-starter-undertow 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
        <exclusions>
            <!-- 排除 undertow-websockets-jsr 依赖 -->
            <exclusion>
              <groupId>io.undertow</groupId>
              <artifactId>undertow-websockets-jsr</artifactId>
            </exclusion>
        </exclusions>
</dependency>

在springboot中指定端口:(同tomcat)

server.port=8081
server.servlet.session.timeout=2M

undertow配置:

配置项说明示例
server.undertow.accesslog.dirUndertow 访问日志目录。
server.undertow.accesslog.enabled是否启用访问日志。false
server.undertow.accesslog.pattern访问日志的格式。common
server.undertow.accesslog.prefix日志文件前缀。access_log.
server.undertow.accesslog.rotate是否开启日志滚动。true
server.undertow.accesslog.suffix日志文件后缀。log
server.undertow.always-set-keep-alive是否应在所有响应中添加 Connection: keep-alive Header,即使 HTTP 规范没有要求。true
server.undertow.buffer-size每个 buffer 的大小。默认大小是根据 JVM 可用的最大内存确定的。
server.undertow.decode-slash是否应解码已编码的斜线字符(%2F)。如果前端代理不执行相同的解码,解码可能会导致安全问题。只有在传统应用程序需要时才启用。设置后,server.undertow.allow-encoded-slash 无效。
server.undertow.decode-url是否对 URL 进行解码。禁用时,URL 中的百分比编码字符将保持原样。true
server.undertow.direct-buffers是否在 Java 堆外分配 buffer。默认大小是根据 JVM 可用的最大内存确定的。
server.undertow.eager-filter-init是否应在启动时初始化 servlet Filtertrue
server.undertow.max-cookies允许的最大 cookie 数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。200
server.undertow.max-headers允许的最大 header 数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。
server.undertow.max-http-post-sizeHTTP post content 的最大大小。当值为-1(默认值)时,大小为无限。-1B
server.undertow.max-parameters允许查询或路径参数的最大数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。
server.undertow.no-request-timeout在服务器关闭连接之前,连接在不处理请求的情况下闲置的时间。
server.undertow.options.server.*在 io.undertow.UndertowOptions 中定义的服务器选项。
server.undertow.options.socket.*在 org.xnio.Options 中定义的 socket 选项。
server.undertow.preserve-path-on-forward转发请求时是否保留请求路径。false
server.undertow.threads.ioI/O 线程数。默认值为可用的处理器数量。
server.undertow.threads.workerWorker 线程数。默认为 I/O 线程数的 8 倍。
server.undertow.url-charset用于解码 URL 的字符集。UTF-8

3、性能对比

1)吞吐量和响应时间

2)cpu使用率:Undertow < Jetty < Tomcat

3)内存使用率:Undertow < Jetty < Tomcat

4)线程数:Undertow < Jetty < Tomcat

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Spring Boot使用Maven自定义打包方式

    详解Spring Boot使用Maven自定义打包方式

    这篇文章主要介绍了Spring Boot使用Maven自定义打包方式,本文通过多种方式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • springboot如何使用sm2加密传输

    springboot如何使用sm2加密传输

    这篇文章主要介绍了springboot如何使用sm2加密传输问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Spring boot项目打包成jar运行的二种方法

    Spring boot项目打包成jar运行的二种方法

    这篇文章主要给大家介绍了关于Spring boot项目打包成jar运行的二种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java服务实现开启Debug远程调试

    Java服务实现开启Debug远程调试

    文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率
    2025-09-09
  • java 学习笔记(入门篇)_程序流程控制结构和方法

    java 学习笔记(入门篇)_程序流程控制结构和方法

    程序流程控制结构分为:顺序、选择、循环以及异常处理结构,语句是程序的基本组成单位,一般来说语句的执行流程是按顺序来进行的,但是当遇到一些特殊的条件,比如循环,这时候语句就会按照流程控制结构来进行了
    2013-01-01
  • 学生视角看Java 面向对象的继承本质

    学生视角看Java 面向对象的继承本质

    继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
    2022-03-03
  • 基于Java实现经典蜘蛛纸牌游戏

    基于Java实现经典蜘蛛纸牌游戏

    《蜘蛛纸牌》(Ancient Spider) 是由Oberon Games开发的一款休闲益智类游戏。本文将利用Java语言实现这一经典游戏,需要的可以参考一下
    2022-05-05
  • mybatis源码解读之executor包语句处理功能

    mybatis源码解读之executor包语句处理功能

    这篇文章主要介绍了executor包语句处理功能,mybatis中支持三种语句类型,不同语句类型支持的变量符号不同,下文详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • 使用ResponseEntity处理API返回问题

    使用ResponseEntity处理API返回问题

    这篇文章主要介绍了使用ResponseEntity处理API返回问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Mybatis Flex代码生成器详解

    Mybatis Flex代码生成器详解

    MybatisFlex是一个轻量级、高性能的MyBatis增强框架,支持多种数据库操作和灵活的SQL生成,文章还介绍了MybatisFlex代码生成器,可以通过数据库表快速生成Entity、Mapper、Service和Controller等代码
    2025-11-11

最新评论