当前位置: 首页 > news >正文

使用 Undertow 替代 Tomcat

使用 Undertow 替代 Tomcat 的优势与配置

为什么要用 Undertow 替代 Tomcat

1. 性能优势

  • 更低的资源占用:Undertow 内存占用比 Tomcat 少 30-50%

  • 更高的并发处理能力:基于 XNIO 的非阻塞 I/O 模型

  • 更好的响应时间:轻量级架构减少处理延迟

2. 架构优势

  • 模块化设计:只加载需要的组件

  • 嵌入式部署:更适合微服务架构

  • 灵活配置:支持编程式配置

详细优势对比

性能指标对比

指标TomcatUndertow优势
内存占用较高减少30-50%
启动时间较慢减少40-60%
并发连接10k+50k+5倍提升
CPU使用率中等更高效

技术特性对比

// Undertow 基于 XNIO 的优势:
// 1. 非阻塞I/O
// 2. 零拷贝技术
// 3. 直接内存访问
// 4. 更精细的线程控制

Spring Boot 中配置 Undertow

1. 添加依赖

<!-- 移除 Tomcat -->
<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><!-- 添加 Undertow -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

2. 基础配置


# application.yml
server:port: 8080undertow:# 线程池配置threads:io: 16worker: 256# 缓冲区配置buffer-size: 1024direct-buffers: true# HTTP配置max-http-post-size: 0# 连接配置max-connections: 10000

3. 高级配置示例


@Configuration
public class UndertowConfig {@Beanpublic UndertowServletWebServerFactory undertowServletWebServerFactory() {UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();// 自定义构建器factory.addBuilderCustomizers(new UndertowBuilderCustomizer() {@Overridepublic void customize(Builder builder) {// 服务器配置builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true).setServerOption(UndertowOptions.HTTP2_SETTINGS_ENABLE_PUSH, true).setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false).setServerOption(UndertowOptions.ALWAYS_SET_DATE, true);// 缓冲区配置builder.setBufferSize(1024 * 16).setIoThreads(Runtime.getRuntime().availableProcessors() * 2).setWorkerThreads(200);}});// 监听器配置factory.addDeploymentInfoCustomizers(deploymentInfo -> {deploymentInfo.setDefaultEncoding("UTF-8");deploymentInfo.setUrlCharset(StandardCharsets.UTF_8.name());});return factory;}
}

4. 完整的配置类


@Configuration
@EnableConfigurationProperties(UndertowProperties.class)
public class AdvancedUndertowConfig {@Autowiredprivate UndertowProperties undertowProperties;@Bean@Primarypublic ServletWebServerFactory servletContainer() {UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();// 基础配置factory.setPort(undertowProperties.getPort());factory.setContextPath(undertowProperties.getContextPath());// 高级自定义配置factory.addBuilderCustomizers(this::customizeBuilder);factory.addDeploymentInfoCustomizers(this::customizeDeployment);return factory;}private void customizeBuilder(Builder builder) {// XNIO 工作线程配置builder.setWorkerThreads(undertowProperties.getWorkerThreads());builder.setIoThreads(undertowProperties.getIoThreads());// 缓冲区配置builder.setBufferSize(undertowProperties.getBufferSize());builder.setDirectBuffers(undertowProperties.isDirectBuffers());// 连接配置builder.setServerOption(UndertowOptions.MAX_CONNECTIONS, undertowProperties.getMaxConnections());builder.setServerOption(UndertowOptions.MAX_ENTITY_SIZE, undertowProperties.getMaxEntitySize());// HTTP/2 配置builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);builder.setServerOption(UndertowOptions.HTTP2_SETTINGS_HEADER_TABLE_SIZE, 4096);builder.setServerOption(UndertowOptions.HTTP2_SETTINGS_INITIAL_WINDOW_SIZE, 65535);// 安全配置builder.setServerOption(UndertowOptions.RECORD_REQUEST_START_TIME, false);builder.setServerOption(UndertowOptions.ALLOW_UNESCAPED_CHARACTERS_IN_URL, true);}private void customizeDeployment(DeploymentInfo deploymentInfo) {deploymentInfo.setDefaultEncoding("UTF-8");deploymentInfo.setEagerFilterInit(true);deploymentInfo.setIgnoreFlush(false);// Session 配置deploymentInfo.setDefaultSessionTimeout(1800);}
}// 配置属性类
@ConfigurationProperties(prefix = "server.undertow")
@Data
public class UndertowProperties {private int port = 8080;private String contextPath = "";private int workerThreads = 256;private int ioThreads = Runtime.getRuntime().availableProcessors() * 2;private int bufferSize = 1024;private boolean directBuffers = true;private int maxConnections = 10000;private long maxEntitySize = 10485760L; // 10MB
}

5. 性能优化配置


# application-prod.yml
server:undertow:threads:worker: 500io: 32buffer-size: 2048direct-buffers: truemax-http-post-size: 104857600  # 100MBmax-connections: 10000no-request-timeout: 60000idle-timeout: 30000spring:servlet:multipart:max-file-size: 100MBmax-request-size: 100MB

6. 监控和健康检查


@RestController
public class ServerStatusController {@Autowiredprivate XnioWorker xnioWorker;@GetMapping("/server/status")public Map<String, Object> getServerStatus() {Map<String, Object> status = new HashMap<>();// 线程池状态status.put("ioThreadCount", xnioWorker.getIoThreadCount());status.put("workerThreadCount", xnioWorker.getWorkerThreadCount());status.put("busyWorkerThreads", xnioWorker.getBusyWorkerThreadCount());// 内存状态Runtime runtime = Runtime.getRuntime();status.put("maxMemory", runtime.maxMemory());status.put("totalMemory", runtime.totalMemory());status.put("freeMemory", runtime.freeMemory());status.put("usedMemory", runtime.totalMemory() - runtime.freeMemory());return status;}
}

迁移注意事项

1. 会话管理


@Configuration
public class SessionConfig {@Beanpublic UndertowSessionCustomizer undertowSessionCustomizer() {return deploymentInfo -> {deploymentInfo.setSessionPersistenceManager(new FileSessionPersistence(new File(System.getProperty("java.io.tmpdir"))));};}
}

2. SSL 配置


server:ssl:key-store: classpath:keystore.p12key-store-password: changeitkey-store-type: PKCS12key-alias: tomcatundertow:ssl-contexts:default:enabled-protocols:- TLSv1.2- TLSv1.3

总结

使用 Undertow 替代 Tomcat 的主要好处:

  1. 性能提升:更低的延迟,更高的吞吐量

  2. 资源优化:减少内存占用,提高资源利用率

  3. 架构适配:更适合云原生和微服务架构

  4. 配置灵活:支持更细粒度的性能调优

在需要高性能、低延迟的应用场景中,Undertow 是比 Tomcat 更好的选择,特别是在微服务架构和云原生环境中。

http://www.dtcms.com/a/523828.html

相关文章:

  • 搜维尔科技将携手Xsens|Haption|Tesollo|Manus亮相IROS 2025国际智能机器人与系统会议
  • 第四章-Tomcat线程模型与运行方式
  • 【PB案例学习笔记】-46在数据窗口中编辑数据
  • tomcat问题
  • 爱电影网站个人养老金制度将落地
  • 自己做游戏网站电子商务营销是什么意思
  • 基于深度学习的短视频内容理解与推荐系统_hadoop+flask+spider
  • unbuntu系统配置IPV6的三种模式
  • ZVD振动抑制方法原理介绍
  • Java微服务无损发布生产案例
  • Kivy 乒乓游戏教程 基于Minconda或Anconda 运行
  • 摄影的网站设计特点同城发广告的平台有哪些
  • 【Python高级编程】类和实例化
  • 徐州市建设局交易网站网站设计的公司运营接单
  • 虹科亮相2025嵌入式会议 | 解读CAN XL与TSN如何驱动下一代E/E架构创新
  • VxWorks系统下龙芯平台的PCI驱动与硬件配置
  • 【2026计算机毕业设计】基于Django的新闻资讯平台的设计与实现
  • Linux小课堂: 基于 SSH 的安全文件传输与增量同步机制深度解析之从 wget 到 rsync 的全流程实战
  • 使用ffmpeg裁剪视频
  • 凡科建站网站西安全网推广公司
  • 免费网站建设程序下载建站用什么工具
  • 香港科技大学工学院2026/2027年度研究生课程招生宣讲会-重庆大学专场
  • Qualcomm SNPE(Neural Processing SDK)集成到 OpenWRT + QCS6490 的完整配置指南
  • LangGraph 官方教程:聊天机器人之一
  • Git与Gitee使用中的几个问题
  • 关于淘宝店网站建设的可行性报告网站建设的公司
  • Flink DatastreamAPI详解(四)
  • 线性代数直觉(四):找到特征向量
  • iis网站服务器 建立出现问题微信小程序制作费用是多少
  • 亚马逊云代理商:2025 AWS 服务器配置趋势走向怎么样?