很多大公司为什么禁止在SpringBoot项目中使用Tomcat?

news/2025/9/28 8:50:48/文章来源:https://www.cnblogs.com/12lisu/p/19116045

前言

今天我们来聊聊一个很有意思的现象:为什么越来越多的大公司禁止SpringBoot项目使用默认的Tomcat,而强制要求使用Undertow?

有些小伙伴在工作中可能已经发现了这个趋势,但背后的原因你真的清楚吗?

一、SpringBoot的默认选择与现状

SpringBoot作为Java领域最流行的开发框架,其默认内嵌的Web容器是Tomcat。

这让我们很多开发者养成了"开箱即用"的习惯,但大公司却在生产环境中纷纷转向Undertow。

这背后到底隐藏着什么秘密?

image

从上图可以看出,虽然Tomcat是默认选择,但Undertow在高性能场景下更具优势。

二、性能对比

2.1 内存占用对比

让我们先看一组实际测试数据。在相同条件下部署SpringBoot应用:

容器 启动内存 堆内存占用 非堆内存占用 线程内存
Tomcat 120MB 80MB 25MB 15MB
Undertow 85MB 60MB 15MB 10MB
优化比例 -29% -25% -40% -33%

从数据可以看出,Undertow在内存占用方面有明显优势。

对于大规模部署的微服务架构,这种内存节省会累积成巨大的成本优势。

2.2 并发处理能力

在并发性能测试中,Undertow同样表现优异:

// 性能测试代码示例
@SpringBootTest
class WebContainerPerformanceTest {@Testvoid testConcurrentPerformance() {// 模拟1000并发用户持续请求30秒LoadTest loadTest = LoadTest.configure().threads(1000).duration(30, TimeUnit.SECONDS).build();// Tomcat测试结果TomcatResult tomcatResult = loadTest.runWithTomcat();// Undertow测试结果  UndertowResult undertowResult = loadTest.runWithUndertow();// 结果对比System.out.println("QPS - Tomcat: " + tomcatResult.getQps());System.out.println("QPS - Undertow: " + undertowResult.getQps());System.out.println("平均响应时间 - Tomcat: " + tomcatResult.getAvgResponseTime());System.out.println("平均响应时间 - Undertow: " + undertowResult.getAvgResponseTime());}
}

典型测试结果:

  • Tomcat:QPS 8500,平均响应时间 15ms
  • Undertow:QPS 12000,平均响应时间 8ms

三、底层架构差异

3.1 Tomcat的架构设计

Tomcat采用传统的BIO/NIO连接器架构:

image

Tomcat的架构相对重量级,每个层次都有明确的职责划分,但也带来了额外的开销。

3.2 Undertow的架构设计

Undertow采用更加现代的XNIO基础架构:

image

Undertow的核心特点:

  1. IO线程与工作线程分离:IO线程处理网络IO,工作线程处理业务逻辑
  2. 事件驱动架构:基于回调的事件处理机制
  3. 零拷贝能力:支持直接缓冲区,减少内存拷贝

四、内存管理

4.1 直接内存使用

Undertow在内存管理上更加高效,大量使用直接内存(Direct Buffer):

// Undertow的内存管理示例
public class UndertowMemoryManagement {// 使用直接缓冲区处理请求public void handleRequest(HttpServerExchange exchange) {// 获取直接缓冲区ByteBuffer buffer = exchange.getConnection().getBufferPool().allocate();try {// 直接操作缓冲区,避免拷贝readRequestData(exchange, buffer);processRequest(buffer);writeResponse(exchange, buffer);} finally {// 释放缓冲区exchange.getConnection().getBufferPool().free(buffer);}}// Tomcat通常需要多次内存拷贝public void tomcatHandleRequest(Request request, Response response) {// 从输入流读取数据(内存拷贝)byte[] inputData = readInputStream(request.getInputStream());// 处理数据(可能再次拷贝)byte[] outputData = processData(inputData);// 写入输出流(又一次拷贝)response.getOutputStream().write(outputData);}
}

这种零拷贝的设计在大文件传输和高并发场景下优势明显。

4.2 连接池优化

Undertow的连接管理更加精细:

# Undertow配置示例
server:undertow:# 线程池配置threads:worker: 16io: 4# 缓冲区配置buffer-size: 1024direct-buffers: true# 连接配置max-connections: 10000max-http-post-size: 10485760

对比Tomcat的配置:

# Tomcat配置示例
server:tomcat:# 连接器配置max-connections: 10000max-threads: 200min-spare-threads: 10# 其他配置max-http-post-size: 10485760connection-timeout: 20000

五、并发模型

5.1 Undertow的XNIO架构

Undertow基于JBoss的XNIO库,采用更加现代的并发模型:

// XNIO工作线程模型示例
public class XNIOWorkerModel {public void demonstrateWorkerModel() {// 创建Worker实例XnioWorker worker = Xnio.getInstance().createWorker(OptionMap.create(Options.THREAD_DAEMON, true));// IO线程处理网络事件worker.getIoThread().execute(() -> {// 处理IO就绪事件handleIOReadyEvents();});// 工作线程处理业务逻辑worker.getWorkerThreadPool().execute(() -> {// 执行业务处理executeBusinessLogic();});}
}

这种设计的优势在于:

  1. IO线程专注网络:不被业务逻辑阻塞
  2. 工作线程池弹性:根据业务需求动态调整
  3. 事件驱动高效:基于事件回调,减少线程切换

5.2 Tomcat的线程模型对比

Tomcat的传统线程模型:

image

Tomcat的线程模型在极高并发下会出现:

  • 大量的线程上下文切换开销
  • 线程阻塞等待资源
  • 内存占用随线程数线性增长

六、配置灵活性

6.1 精细化配置能力

Undertow提供了极其细致的配置选项,满足各种复杂场景:

@Configuration
public class UndertowConfig {@Beanpublic UndertowServletWebServerFactory undertowServletWebServerFactory() {UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();factory.addBuilderCustomizers(builder -> {// 配置HTTP/2builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);// 配置缓冲区builder.setSocketOption(Options.RECEIVE_BUFFER, 1024 * 16);builder.setSocketOption(Options.SEND_BUFFER, 1024 * 64);// 配置线程池builder.setIoThreads(Runtime.getRuntime().availableProcessors());builder.setWorkerThreads(200);// 配置连接数限制builder.setServerOption(UndertowOptions.MAX_CONNECTIONS, 10000);});return factory;}
}

6.2 处理器链机制

Undertow的处理器链机制允许深度定制请求处理流程:

public class CustomHandler implements HttpHandler {private final HttpHandler next;public CustomHandler(HttpHandler next) {this.next = next;}@Overridepublic void handleRequest(HttpServerExchange exchange) throws Exception {long startTime = System.currentTimeMillis();try {// 前置处理:认证、日志等preHandle(exchange);// 调用下一个处理器next.handleRequest(exchange);} finally {// 后置处理:统计、清理等postHandle(exchange, startTime);}}private void preHandle(HttpServerExchange exchange) {// 认证检查if (!checkAuthentication(exchange)) {exchange.setStatusCode(401);exchange.endExchange();return;}// 请求日志记录logRequest(exchange);}
}

这种灵活的处理器链机制让Undertow在定制化需求面前游刃有余。

七、实战案例

7.1 某电商平台的容器迁移实践

某大型电商平台在高峰期面临严重的性能瓶颈,迁移到Undertow后的效果:

迁移前(Tomcat):

  • 单机QPS:8000
  • 平均响应时间:25ms
  • 内存占用:2GB
  • CPU使用率:85%

迁移后(Undertow):

  • 单机QPS:15000(+87%)
  • 平均响应时间:12ms(-52%)
  • 内存占用:1.2GB(-40%)
  • CPU使用率:65%(-23%)

7.2 配置优化示例

# 生产环境Undertow优化配置
server:undertow:# IO线程数(通常为CPU核心数)io-threads: 8# 工作线程数(根据业务调整)worker-threads: 200# 直接缓冲区direct-buffers: truebuffer-size: 16384# 连接配置max-connections: 10000max-http-post-size: 10485760# 优雅关闭no-request-timeout: 60000drain-wait-time: 20000# JVM优化配合port: 8080compression:enabled: truemime-types: text/html,text/xml,text/plain,application/json

八、如何迁移?

8.1 Maven配置调整

<!-- 排除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>

8.2 迁移注意事项

有些小伙伴在迁移过程中可能会遇到以下问题:

  1. Servlet API兼容性:确保代码使用标准Servlet API
  2. WebSocket配置:Undertow的WebSocket配置与Tomcat不同
  3. SSL配置:证书和SSL配置可能需要调整
  4. 会话管理:如果使用分布式会话,需要验证兼容性

总结

通过上面的详细分析,我们可以总结出大公司选择Undertow的主要原因:

1 性能优势明显

  • 更高的并发处理能力:XNIO架构更适应高并发场景
  • 更低的内存占用:直接内存和缓冲区优化减少内存使用
  • 更好的响应时间:事件驱动模型减少处理延迟

2 资源利用高效

  • 精细化的资源控制:线程池、缓冲区等可精细配置
  • 更好的可扩展性:适应云原生和容器化部署
  • 更低的运维成本:减少服务器数量和资源消耗

3 技术架构先进

  • 现代化的并发模型:更适应现代硬件架构
  • 灵活的扩展机制:处理器链支持深度定制
  • 更好的未来发展:为HTTP/2、Quic等新协议做好准备

4 业务需求驱动

  • 大规模部署需求:微服务架构下容器性能至关重要
  • 成本控制压力:性能提升直接转化为成本降低
  • 技术竞争力:保持技术栈的先进性和竞争力

有些小伙伴可能会说:"我的项目并发量不大,用Tomcat也挺好"。

确实,对于小型项目或个人项目,Tomcat完全够用。

但对于大公司来说,技术选型要考虑的是规模化效应。

当你有成千上万个微服务实例时,每个实例节省几十MB内存,总体节省的资源就是天文数字。

我的建议是:对于新项目,特别是预期有高并发需求的微服务项目,优先考虑使用Undertow。对于现有项目,如果遇到性能瓶颈,可以考虑迁移到Undertow。

技术选型没有绝对的对错,只有适合与否。

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

更多项目实战在我的技术网站:http://www.susan.net.cn/project

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

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

相关文章

Java作业动手又动脑

一. 枚举定义 enum Size{SMALL,MEDIUM,LARGE}; 定义了包含三个枚举常量的Size枚举类型。 主要测试逻辑 引用比较测试 java Size s=Size.SMALL; Size t=Size.LARGE; System.out.println(s==t); // false 输出:false 原…

学做文案的网站网站内部代码优化

为什么IDEA要对Git进行更新操作的呢&#xff0c;因为当我们提交项目的时候我们必须要更新到最新的项目然后才能够使我们在提交项目的过程中不出现错误。 IDEA Git更新详细步骤 1 . 打开我们的IDEA &#xff0c;首先要确保我们已经从git里面clone项目到我们的IDEA里面。 2 . 当…

PHP 开发者必须掌握的基本 Linux 命令

PHP 开发者必须掌握的基本 Linux 命令 刚开始 PHP 开发时,我并没有特别的理由选择 Linux。既不是出于对开源软件的热情,也不是认为 Linux 比 macOS 或 Windows 更优秀。当时只是希望找到一个更轻量、更可定制的开发环…

维度网络网站建设建筑英才招聘网首页

在线题目链接&#xff1a;斐波那契数列 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 大家都知道斐波那契数列&#xff0c;现在要求输入一个整数n&a…

使用python写一个应用程序要求实现微软常用vc++功能排查与安装功能

import os import sys import subprocess import re import requests import tempfile import platform from bs4 import BeautifulSoup import winregclass VCRedistManager:def __init__(self):self.supported_versi…

网站建设尺寸规范网络营销策划案的形式

给AWS新账户做完了对等连接&#xff0c;因为默认VPC网段都冲突 就换了VPC&#xff0c;然后发现新VPC内创建的实例都没有分配公网IP地址&#xff0c;自动分配公网IP地址变成了禁用。后续建机子需要手动修改成启用太麻烦了。 在VPC里面找到编辑子网设置&#xff0c;勾上启用自动…

网站建设全网营销客户资源心理咨询网站后台

传统蜂窝网络一般基于特定接入技术并针对大规模公共网络设计&#xff0c;无法灵活适配小规模网络以及异构无线技术。本文介绍了Magma在构建低成本异构无线接入方面的探索。原文: Building Flexible, Low-Cost Wireless Access Networks With Magma 摘要 当今仍然有数十亿人受限…

网站内容更新教程泰安网站开发公司

1.三次握手的概述 我们在学网络的概念时&#xff0c;每当讲到TCP都会听到三次握手和四次挥手&#xff0c;一直以来可能都对这个概念模糊不清&#xff0c;那么什么是三次握手和四次挥手呢&#xff1f;简单的举一个例子&#xff0c;如果我们和朋友打游戏&#xff0c;我们要和朋友…

广西壮族自治区住房和城乡建设厅网站手机网站开发源码

目录 一、什么是sql注入 二、sql语句的执行流程 三、内连接和外连接的区别 四、Union和Union All 有什么区别 五、MySql如何取差集 六、DELETE和TRUNCATE有什么区别 七、count&#xff08;*&#xff09;和count&#xff08;1&#xff09;的区别 八、MyISAM和InnoDB的区…

详细介绍:MySQL零基础学习Day4——多表查询

详细介绍:MySQL零基础学习Day4——多表查询pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

MetaGPT实战指南:构建模拟公司运营的多智能体系统 - 教程

MetaGPT实战指南:构建模拟公司运营的多智能体系统 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

2017网站建设报价单营销论坛网站建设

引言 在计算机科学中&#xff0c;数据结构和算法是构建高效软件系统的基石。而排序算法作为算法领域的重要组成部分&#xff0c;一直在各种应用场景中发挥着关键作用。今天我们将聚焦于一种基于插入排序的改进版本——希尔排序&#xff08;Shell Sort&#xff09;&#xff0c;深…

Timeplus Enterprise 3.0 (Linux, macOS) - 流处理平台

Timeplus Enterprise 3.0 (Linux, macOS) - 流处理平台Timeplus Enterprise 3.0 (Linux, macOS) - 流处理平台 Revolutionize Streaming Analytics 请访问原文链接:https://sysin.org/blog/timeplus/ 查看最新版。原创…

《HelloGitHub》第 114 期

兴趣是最好的老师,HelloGitHub 让你对开源感兴趣!简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。github.com/521xueweihan/HelloGitHub这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖…

网站建设与准备乐清城市网官网

这阵子在捣鼓一个将游戏视频打包成本地可播放文件的模块。开始使用avi作为容器&#xff0c;弄了半天无奈avi对aac的支持实在有限&#xff0c;在播放时音视频时无法完美同步。 关于这点avi文档中有提到&#xff1a; For AAC, one RAW AAC frame usually spans over 1024 samples…

重庆网站推广网络推广申请建设部门网站的报告

大数据产业是以数据及数据所蕴含的信息价值为核心生产要素&#xff0c;通过数据技术、数据产品、数据服务等形式&#xff0c;使数据与信息价值在各行业经济活动中得到充分释放的赋能型产业。 大数据产业定义一般分为核心业态、关联业态、衍生业态三大业态。 一、专…

智能微电网 —— 如何无缝集成分布式光伏 / 风电? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【鸿蒙生态共建】一文说清基础类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利 - 详解

【鸿蒙生态共建】一文说清基础类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利 - 详解2025-09-28 08:16 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: p…

一级a做爰片免费网站体验区网站制造

2014年杭州电子科技大学Java期末试卷.doc杭州电子科技大学学生考试卷( A )卷考试课程Java语言程序设计考试日期2014年 6月 16日成 绩课程号教师号任课教师姓名考生姓名学号(8位)年级专业注意&#xff1a;所有答案均写在答卷上&#xff0c;写在试卷上无效;(一)单选题(每题2分&am…