Undertow Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器 Untertow 的特点: 轻量级:它是一个 Web 服务器,但不像传统的 Web 服务器有容器概念 的 Spring Boot 程序,通过 VisualVM 工具进行比较,可看到 Undertow 性能优于 Tomcat 使用 Undertow 添加依赖 <dependency> <groupId # Undertow 日志存放目录 server.undertow.accesslog.dir # 是否启动日志 server.undertow.accesslog.enabled =false # 日志格式 server.undertow.accesslog.pattern=common # 日志文件名前缀 server.undertow.accesslog.prefix , 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载 server.undertow.worker-threads=20 #
需要看看SpringBoot里面的embedded.undertow内部实现? ? 解决这个问题大致思路是: 通过重写HttpServletRequest里面的HttpSession getSession() 方法,filter里面包装 覆盖embedded.undertow生产SessionId 找到Undertow的默认使用的生成器SecureRandomSessionIdGenerator,默认是怎么实现的呢?感兴趣的可以再深入一下。 Callback interface that can be used to customize an Undertow {@link DeploymentInfo}.
Undertow 它能成为 Spring Boot 默认集成的三大容器之一,就凭这点,我想就足以说明它的地位。 Undertow 什么鬼? 这也是为什么 Spring Boot 可以直接嵌入 Undertow 的原因,Undertow 它就是为了嵌入而发烧的。 官方网站: https://undertow.io/ 源码托管在 Github: https://github.com/undertow-io/undertow Undertow 有啥特性? ; 独立使用 Undertow 需要添加以下依赖: <dependency> <groupId>io.undertow</groupId> <artifactId>undertow-core 中使用 Undertow。
{ exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }最后添加undertow 依赖:compile 'org.springframework.boot:spring-boot-starter-undertow:2.7.0'2、如果是maven工程:直接排除后添加依赖既可;<dependency > <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow
甚至JBoss的WilfFly服务器在内部使用Undertow来提高服务器的性能。 在本文中,我们将介绍Undertow的主要功能并给出使用代码。 2. 为什么要选择Undertow? 使用Undertow 不多说,让我们使用Undertow来创建一个简单的web server吧! 3.1. Maven 依赖 加入如下依赖: ? 这个是根据我们的需要定制Undertow应用程序的最重要的武器。 Undertow 为你提供了一个开箱即用的页面。 ? 4. 要想在Spring Boot中使用Undertow只需要加下面的依赖就是了: ? 5. 总结 在本文中,我们了解了Undertow以及如何使用它创建不同类型的服务器。
spring-boot-starter-tomcat' } dependencies{ compile ('org.springframework.boot:spring-boot-starter-undertow
Tomcat,Jetty和Undertow是目前比较主流的3款Servlet容器,而且Spring Boot框架还提供了对它们的集成支持(默认使用的是Tomcat),网络上有许多文章都在介绍Undertow Intel® Core™ i5-6200U CPU @ 2.30GHz × 4 内存:8GB 压测主要指标:响应时间,吞吐量,系统负载(CPU,内存,线程数) 压测指标 1.吞吐量及响应时间 吞吐量:Undertow > Jetty > Tomcat 响应时间:Jetty < Tomcat < Undertow ? 2.CPU使用率:Undertow < Jetty < Tomcat ? 3.内存使用率:Undertow < Jetty < Tomcat ? 4.线程数:Undertow < Jetty < Tomcat ? 结论 结论:综合吞吐量,响应时间以及资源消耗,Undertow胜出。
Undertow Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器 Untertow 的特点: 轻量级:它是一个 Web 服务器,但不像传统的 Web 服务器有容器概念 Spring Boot内嵌容器支持Tomcat、Jetty、Undertow。为什么选择Undertow? 这里有一篇文章,时间 2017年1月26日发布的: Tomcat vs. 证明了Undertow在性能和内存使用上是最好的。 </artifactId> </dependency> 配置 Undertow # Undertow 日志存放目录 server.undertow.accesslog.dir # 是否启动日志 server.undertow.accesslog.enabled # 日志文件名后缀 server.undertow.accesslog.suffix=log # HTTP POST请求最大的大小 server.undertow.max-http-post-size
可以进行Tomcat调优,但是Undertow容器在性能和内存上都优于Tomcat容器,因此直接选择Undertow容器并进行调优是更好的选择。 2. 在SpringBoot应用中如何优化Undertow性能 2.1. 会从这个线程池中取得线程,它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8 server.undertow.io-threads=8 server.undertow.worker-threads 例如: server.undertow.buffer-size=1024 server.undertow.direct-buffers=true 2.3. 例如: server.undertow.session-cookie-config=none server.undertow.accesslog.enabled=false 2.5.
Undertow 简介 Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。 ,启动项目会报错:打开文件数过多 server: undertow: io-threads: 16 # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程 总结 今天我们演示了如何用性能优良的 Undertow 来作为Spring Boot 的 Servlet Web 容器。 其实在并发量不大的情况下 Undertow、和其它两款 Servlet Web 容器 Jetty 、Tomcat 的差距并不是很大。 Undertow 的优势是高并发下的吞吐量。
Spring Boot 在关闭时,如果有请求没有响应完,在不同的容器会出现不同的结果,例如,在 Tomcat 和 Undertow 中会出现中断异常,那么就有可能对业务造成影响。 Thread.currentThread().interrupt(); } } } } } Undertow "); field.setAccessible(true); Undertow undertow = (Undertow) field.get (webServer); List<Undertow.ListenerInfo> listenerInfo = undertow.getListenerInfo(); Undertow.ListenerInfo listener = listenerInfo.get(0); ConnectorStatistics connectorStatistics
UNDERTOW 通过Jetty和tomcat的压测结果发现,HTTP异步并不一定会提升程序性能,只有在特定的条件下才会起到正面的效果,如应用服务器为非NIO时。 而undertow和jetty一样是NIO,所以这里不再对比异步非异步,直接只测非异步。 UNDERTOW业务接口(无异步) ioThreads 4 workerThreads 52 结果 2200 UNDERTOW天花板(无异步) ioThreads UNDERTOW ? ? https://github.com/sunshanpeng/dark_magic 原文博客:http://ifeve.com/how-to-calculate-threadpool-size/ Undertow
同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢? 没错,就是题目中的Undertow容器技术。SrpingBoot已经完全继承了Undertow技术,我们只需要引入Undertow的依赖即可,如下图所示。 配置好以后,我们启动应用程序,发现容器已经替换为Undertow。 那我们为什么需要替换Tomcat为Undertow技术呢? 我们在相同机器配置下压测Tomcat和Undertow,得到的测试结果如下所示: QPS测试结果对比: Tomcat Undertow 内存使用对比: Tomcat Undertow 通过测试发现 所以,如果是高并发的业务系统,Undertow是最佳选择。 最后 SpingBoot中我们既可以使用Tomcat作为Http服务,也可以用Undertow来代替。
在Spring Boot应用程序中优化Undertow的性能,可以通过调整Undertow的配置参数来实现。以下是一些常见的优化策略: 1. 启用HTTP/2 Undertow支持HTTP/2,可以通过配置来启用,这可以提高网络传输效率。 7. 示例配置 以下是在application.properties或application.yml中配置Undertow的一些示例: # 增加IO线程数 server.undertow.io-threads =16 # 增加工作线程数 server.undertow.worker-threads=256 # 设置缓冲区大小 server.undertow.buffer-size=1024 # 使用直接内存 server.undertow.direct-buffers=true # 启用HTTP/2 server.undertow.enabled=true 请注意,优化Undertow的性能需要根据具体的应用程序和负载情况来定制
一、前言 昨天发了一个《SpringBoot服务器压测对比(jetty、tomcat、undertow)》,本是工作的一个笔记,没想到被红薯翻牌了(荣幸之至)。 以下是本次测试主要优化的地方: 序号 服务容器 优化参数 1 tomcat 最大连接数server.tomcat.max-threads=400 2 jetty 最大连接数(400)和最小连接数(10) 3 undertow ,在application.properties中加入server.undertow.io-threads=16和server.undertow.worker-threads=400即可 3、undertow 启动命令 java -server -Dserver.undertow.io-threads=16 -Dserver.undertow.worker-threads 2、关于服务容器 在基于天花板接口的测试中,综合对比tomcat、jetty、undertow,可以发现undertow相对性能更高点。
Undertow undertow.png cpu高点接近60%,吞吐量4万6。 Jetty jetty.png cpu高点在50%,吞吐量达到5万。 简单接口下吞吐量:tomcat>jetty>undertow。 cpu:tomcat>jetty>undertow。 Undertow undertow2.png cpu高点在50%,吞吐量2万2。 Jetty jetty2.png cpu高点在60%,吞吐量2万。 复杂接口下吞吐量:tomcat>undertow>jetty。 cpu:tomcat>undertow>jetty。 undertow更适合用于IO密集型服务器,或者文件服务器使用undertow会是一个不错的选择,但是在一般情况下还是老老实实的使用Springboot默认的tomcat吧。
同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢? 没错,就是题目中的Undertow容器技术。SrpingBoot已经完全继承了Undertow技术,我们只需要引入Undertow的依赖即可,如下图所示。 ? ? 配置好以后,我们启动应用程序,发现容器已经替换为Undertow。 那我们为什么需要替换Tomcat为Undertow技术呢? 我们在相同机器配置下压测Tomcat和Undertow,得到的测试结果如下所示: QPS测试结果对比: Tomcat ? Undertow ? 内存使用对比: Tomcat ? Undertow ? Undertow在高并发业务场景中,性能优于Tomcat。所以,如果我们的系统是高并发请求,不妨使用一下Undertow,你会发现你的系统性能会得到很大的提升。
背景 Springboot集成了众多容器(Tomcat、Jetty、Undertow) Undertow是一款并发性能极高的容器,由于默认的容器是Tomcat,我们通常会把tomcat的jar包干掉并引入 Undertow的jar包,由此开启Undertow容器 项目需要记录AccessLog日志,来保存和查询接口调用情况 AccessLog日志文件默认会定时日志切割(每天凌晨,按照天维度拆分小文件),默认生成的文件名为 access_log.log.2021-02-11 由于access_log.2021-02-11.log不符合日志文件名标准,导致自动日志删除代理无法识别,日志会积压,只能手动去集群删除,比较耗费时间 默认的Undertow ip等),用于生成请求日志内容 prefix: "access_log." # 前缀 suffix: "log" # 后缀 抓手 为了解决AccessLog文件名不支持自定义的问题,需要从Undertow 源码入手 从源码找到生成日志文件名的地方,重写这部分的逻辑 解决过程 1.首先打开Undertow的源码包 发现server.handlers.accesslog下有相关的accesslog的处理的类
CVE-2024-3884: Undertow 应用/x-www-form-urlencoded编码解析表单数据时的内存耗尽问题在解析使用 application/x-www-form-urlencoded 编码的大表单数据时,Undertow 存在一个缺陷,可导致远程拒绝服务攻击。 漏洞详情漏洞编号: CVE-2024-3884严重性: 高危CVSS 评分: 7.5 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)影响组件: io.undertow :undertow-core (Maven)影响版本受影响版本: < 2.3.21.Final 以及 2.4.0.Alpha1已修复版本: 2.3.21.Final漏洞描述当 Undertow 服务器处理 解决方案请立即将 io.undertow:undertow-core 升级至 2.3.21.Final 或更高版本,以修复此安全漏洞。
同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢? SpringBoot内容聚合 没错,就是题目中的Undertow容器技术。SrpingBoot已经完全继承了Undertow技术,我们只需要引入Undertow的依赖即可,如下图所示。 ? ? 配置好以后,我们启动应用程序,发现容器已经替换为Undertow。 那我们为什么需要替换Tomcat为Undertow技术呢? 我们在相同机器配置下压测Tomcat和Undertow,得到的测试结果如下所示: QPS测试结果对比: Tomcat ? Undertow ? 内存使用对比: Tomcat ? Undertow ? 所以,如果是高并发的业务系统,Undertow是最佳选择。 最后 SpingBoot中我们既可以使用Tomcat作为Http服务,也可以用Undertow来代替。