【JAVA】Undertow的使用及性能优化,以及Undertow与Tomcat的对比

news2024/11/15 19:51:53

在这里插入图片描述

文章目录

      • Undertow优势
      • Undertow使用
      • Undertow性能优化
        • 线程池配置
        • 缓冲区和内存使用
        • 连接和请求超时
        • 禁用无关的设置
        • 编程式配置
        • 启用HTTP/2
      • Undertow与Tomcat的对比

更多相关内容可查看

当你进行Tomcat调优发现在怎么调都无法满足需求的时候,Undertow容器在性能和内存上都优于Tomcat容器,因此选择Undertow容器并进行调优是更好的选择。

Undertow优势

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

  • 支持 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 应用的嵌入式服务器


Undertow使用

Spring Boot 默认使用Tomcat作为嵌入式服务。所以 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>
</dependency>

具体配置跟tomcat性质一样,可以参考以下官方文档,这里不做列举。除了配置对应的xml文件还可以通过实现接口实现

import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UndertowConfiguration implements WebServerFactoryCustomizer<UndertowServletWebServerFactory>{

    @Override
    public void customize(UndertowServletWebServerFactory factory) {
        factory.setBufferSize(8192);
        // 其他自定义配置 ...
    }
}

所以只需更换一个依赖即可使用,还是很方便的。更换完重新启动你的控制台Tomcat Start就会变成Undertow Start

Undertow性能优化

线程池配置

在SpringBoot应用的application.properties或application.yml中,可以调整Undertow的线程池设置。包括IO线程和工作线程的设置

  • server.undertow.io-threads:设置IO线程数,负责处理非阻塞的网络IO。通常设置为与CPU核心数相等的值。它们会负责多个连接,不要设置过大,如果过大,启动项目会报错:打开文件数过多
  • server.undertow.worker-threads:阻塞任务线程池, 当执行类似servlet请求阻塞IO操作,undertow会从这个线程池中取得线程,它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
server.undertow.io-threads=8
server.undertow.worker-threads=128
缓冲区和内存使用
  • server.undertow.buffer-size:设置每个缓冲区的大小。以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理,每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
  • server.undertow.direct-buffers:是否分配的直接内存(NIO直接分配的堆外内存)
  • server.undertow.buffers-per-region:
    每个区分配的buffer数量,所以pool的大小是buffer-size * buffers-per-region
server.undertow.buffer-size=1024
server.undertow.direct-buffers=true
连接和请求超时
  • server.undertow.max-http-post-size:设置HTTP POST请求的最大内容大小,以适应可能的文件上传或大批量数据提交。
  • server.undertow.no-request-timeout:设置连接在不处理请求的情况下闲置的时间。
server.undertow.max-http-post-size=0 # 不限制大小,或根据实际情况调整
server.undertow.no-request-timeout=1800s # 例如,设置为30分钟
禁用无关的设置
  • server.undertow.session-cookie-config:设置会话cookie的配置,可以选择不使用cookie以减少HTTP响应的大小。
  • server.undertow.accesslog.enabled:根据需要启用或禁用访问日志。
server.undertow.session-cookie-config=none
server.undertow.accesslog.enabled=false
编程式配置

通过实现WebServerFactoryCustomizer接口来编程式地配置Undertow,可以更加灵活。

启用HTTP/2

通过配置启用Undertow支持的HTTP/2,可以提高网络传输效率。

其实本质上还是跟tomcat很像的,一些优化的方向以及配置策略,大家可以将二者好好贯通一下便于理解


Undertow与Tomcat的对比

先看一下QPS测试结果对比

Tomcat
在这里插入图片描述

Undertow

在这里插入图片描述
内存使用对比:

Tomcat

在这里插入图片描述
Undertow

在这里插入图片描述

通过测试发现,在高并发系统中,Tomcat 相对来说比较弱。在相同的机器配置下,模拟相等的请求数,Undertow 在性能和内存使用方面都是最优的。并且 Undertow 新版本默认使用持久连接,这将会进一步提高它的并发吞吐能力。所以,如果是高并发的业务系统,Undertow 是最佳选择。

场景

以下是一些Undertow 可能更适合的场景,大家在面试中或者实际业务中可以考虑是否使用
当然!以下是十个具体的业务场景,其中使用 Undertow 比 Tomcat 更加合适:

  1. 实时数据流处理平台

    • 场景:实时处理大规模传感器数据或金融市场数据流,例如高频交易系统或实时监控平台。
    • 理由:Undertow 的非阻塞 I/O 模型适合处理高并发和低延迟的数据流。
  2. 在线游戏服务器

    • 场景:为多人在线游戏提供后端服务,例如游戏房间管理和玩家匹配。
    • 理由:Undertow 能处理大量并发连接和低延迟请求,适合需要高性能的在线游戏环境。
  3. 微服务架构中的 API 网关

    • 场景:构建一个微服务架构中的 API 网关,处理来自不同服务的请求并进行负载均衡。
    • 理由:Undertow 的高性能和轻量级特性使其在微服务环境中表现优异。
  4. 高频交易平台

    • 场景:为金融市场提供高频交易服务,需要极低的延迟和快速的请求处理。
    • 理由:Undertow 的高效异步处理能力适合高频交易中的低延迟需求。
  5. 大规模的 RESTful API 服务

    • 场景:提供大规模的 RESTful API 服务,例如数据存储和检索服务。
    • 理由:Undertow 能处理大量的 API 请求,适合高流量环境。
  6. 实时通信应用

    • 场景:开发实时聊天应用或实时视频会议平台,需要高并发和低延迟。
    • 理由:Undertow 支持 WebSocket,适合实时双向通信应用。
  7. 高效的 Web 爬虫和抓取服务

    • 场景:开发一个高效的网络爬虫,抓取大量网页数据。
    • 理由:Undertow 的低开销和高吞吐量适合处理大量 HTTP 请求。
  8. 轻量级的嵌入式 Web 服务器

    • 场景:将 Web 服务器嵌入到物联网设备或桌面应用中,例如智能家居控制中心。
    • 理由:Undertow 的轻量级和嵌入式特性适合资源受限的环境。
  9. 动态生成的 Web 服务

    • 场景:提供动态生成内容的 Web 服务,例如广告服务器或实时报告生成。
    • 理由:Undertow 的快速启动和高性能适合处理动态内容生成的需求。
  10. 开发和测试环境

    • 场景:在开发和测试过程中需要快速启动和关闭的 Web 服务器,例如本地测试环境中的开发应用。
    • 理由:Undertow 的启动速度快且资源消耗低,适合开发和测试阶段的高效使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

盘点2024年大家都在用的短视频剪辑工具

你现在休息的时间是不是都靠短视频来消遣&#xff1f;看着看着你就会发现短视频制作好像我也可以了吧&#xff1f;这次我就介绍一些简单好操作的短视频剪辑工具。 1.FOXIT视频剪辑 连接直达>>https://www.pdf365.cn/foxitclip/ 短视频剪辑其实也不难&#xff0c;只需…

MySql-表的内外连接

文章目录 前言一、内连接二、外连接1.左外连接2.右外连接 前言 表的内外连接跟我们上节课讲的笛卡尔积很相似。 一、内连接 格式&#xff1a;select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1b; 例如&#xff1a;显示SMITH的名字和部门名称 二、外…

RB-SQL:利用检索LLM框架处理大型数据库和复杂多表查询的NL2SQL

NL2SQL的任务是将自然语言问题转换为SQL查询&#xff0c;以便从数据库中获取答案。现有LLM来指导SQL生成的方法在处理大型数据库和复杂多表查询时存在挑战&#xff0c;尤其是在处理冗余信息和提高提示工程效率方面。 (a) 利用大型语言模型&#xff08;LLM&#xff09;解决文本…

ctfshow-web入门-sql注入(web249-web253)nosql 注入

目录 1、web249 2、web250 3、web251 4、wen252 5、web253 1、web249 开始nosql,flag在flag中 $user $memcache->get($id); 使用 Memcache 类的 get 方法从缓存中获取数据&#xff0c;$id 是传入的键&#xff0c;用于从缓存中获取与该键对应的值&#xff0c;结果存储…

明基相机sd卡格式化还能恢复数据吗?可以这样操作

随着数字摄影的普及&#xff0c;相机SD卡已成为我们记录生活点滴的重要载体。然而&#xff0c;不小心将SD卡格式化&#xff0c;导致珍贵照片和视频瞬间消失&#xff0c;无疑是摄影爱好者的一大噩梦。面对这样的突发情况&#xff0c;许多朋友可能会感到无助与绝望。但实际上&…

【计算机组成原理】概述+数制与编码

目录 计算机组成原理概述计算机基本组成计算机系统的层次结构计算机性能指标 数制与编码进位计数制及其相互转换数据的编码与表示校验码 计算机组成原理概述 计算机基本组成 运算器、控制器、存储器、输入输出设备 运算器&#xff1a;完成数据的暂存、变换、算术运算和逻辑…

OpenCV结构分析与形状描述符(23)确定一个点是否位于多边形内的函数pointPolygonTest()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 进行点在轮廓内的测试。 该函数确定点是在轮廓内、轮廓外&#xff0c;还是位于一条边上&#xff08;或与顶点重合&#xff09;。它返回正值&…

【可变参模板】基类参数包的展开

一、基类参数包的展开 1.1基类参数包的展开 C C C是一个支持多继承的语言&#xff0c;因此继承的类也可以是一个基类的参数包 注意继承的语法是 p u b l i c : c l a s s . . . public: class ... public:class...&#xff0c;需要补充 . . . ... ...作为基类参数包的标志。…

Linux 驱动编写框架 并编译导入开发板

向内核新加文件&#xff1a;例如 demo1.c 1. 创建并编辑新的文件 #include <linux/init.h> #include <linux/kernel.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/module.h> #include <linux/kdev_t.h> #include …

Qt控制开发板的LED

Qt控制开发板的LED 使用开发板的IO接口进行控制是嵌入式中非常重要的一点&#xff0c;就像冯诺依曼原理说的一样&#xff0c;一个计算机最起码要有输入输出吧&#xff0c;我们有了信息的接收和处理&#xff0c;那我们就要有输出。 我们在开发板上一般都是使用开发板的GPIO接口…

vue3使用provide和inject传递异步请求数据子组件接收不到

前言 一般接口返回的格式是数组或对象&#xff0c;使用reactive定义共享变量 父组件传递 const data reactive([])// 使用settimout模拟接口返回 setTimeout(() > {// 将接口返回的数据赋值给变量Object.assign(data, [{ id: 10000 }]) }, 3000);provide(shareData, dat…

02请求响应(简单参数)

一、操作目的 前端通过post/get请求&#xff0c;传递给后端简单的数据&#xff0c;后端接收后在控制台打印出来&#xff0c;并将结果返回给前端页面展示出来。&#xff08;这里我们用postman来模拟前端页面&#xff0c;而非真实的通过编写前端代码&#xff0c;通过浏览器来展示…

Docker数据挂载本地目录

docker内的数据映射可以不通过数据卷&#xff0c;直接映射到本地的目录。下面将以mysql容器示例&#xff0c;完成容器的数据映射。 注意&#xff1a;每一个不同的镜像&#xff0c;将来创建容器后内部有哪些目录可以挂载&#xff0c;可以参考DockerHubDocker Hub Container Ima…

求树上任意两个点的距离lca

前言&#xff1a;一开始看到这个题目的时候&#xff0c;感觉就和lca有关&#xff0c;但是没有想到具体的公式 d d e p [ x ] d e p [ y ] − 2 ∗ d e p [ l c a ( x , y ) ] d dep[x] dep[y] - 2*dep[lca(x,y)] ddep[x]dep[y]−2∗dep[lca(x,y)] 并且我们这个题目还是一个…

[数据集][目标检测]烟叶病害检测数据集VOC+YOLO格式612张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;612 标注数量(xml文件个数)&#xff1a;612 标注数量(txt文件个数)&#xff1a;612 标注类别…

【重学 MySQL】二十六、内连接和外连接

【重学 MySQL】二十六、内连接和外连接 内连接&#xff08;INNER JOIN&#xff09;外连接&#xff08;OUTER JOIN&#xff09;总结 在MySQL中&#xff0c;内连接和外连接是两种常见的表连接方式&#xff0c;它们在处理多个表之间的关系时发挥着重要作用。 内连接&#xff08;I…

光器件 -- 拉曼放大器(原理、分类和应用)

拉曼工作原理 拉曼放大器基于受激拉曼散射效应&#xff08;SRS&#xff0c;Stimulated Raman Scattering&#xff09;&#xff0c;以传输光纤作为增益介质&#xff0c;将拉曼泵浦功率转移到C波段信号上进行放大。受激拉曼散射基本原理为&#xff1a;如果一个弱信号光与一个强泵…

流动性质押协议 Drop:DeFi 新一轮革新

近年来&#xff0c;去中心化金融&#xff08;DeFi&#xff09;领域经历了迅猛的增长和创新&#xff0c;而其中一项重要的发展便是流动性质押协议的兴起。在传统的区块链网络中&#xff0c;用户为了参与网络的验证过程和维护网络安全&#xff0c;通常需要将加密资产锁定在区块链…

Java集合(八股)

这里写目录标题 Collection 接口List 接口ArrayList 简述 1. ArrayList 和 LinkedList 区别&#xff1f;⭐️⭐️⭐️⭐️2. ArrayList 和 Array 的区别&#xff1f;⭐️⭐️⭐️ArrayList 和 Vector 区别&#xff1f;⭐️⭐️ArrayList 的扩容机制&#xff1f;⭐️⭐️⭐️ Qu…

Lesson08---string类(3)

1.find_first_of string里面的find成员函数就是找一个字符串然后返回第一个字符 find_first_of函数看个例子就很快就能明白 它返回的下标是参数的其中任意一个字符的下标通过以上操作就可以把原来的那一整个字符串替换成自己想要的字符 第二个参数其实就是一个缺省参数默认从0…