java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > springboot中undertow容器的使用

springboot中undertow容器的使用及说明

作者:赶路人儿

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 的优势如下:

说明: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

总结

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

您可能感兴趣的文章:
阅读全文