卡卷网
当前位置:卡卷网 / 每日看点 / 正文

有些公司为什么禁止SpringBoot项目使用Tomcat?

作者:卡卷网发布时间:2025-01-17 00:33浏览数量:83次评论数量:0次

谢邀!

说到底,Spring Boot和Tomcat这对CP被拆散的根本原因,是Tomcat的设计在某些高并发场景下已经显得力不从心,尤其是在需要高效、稳定的长连接环境中。

从源码来看,Spring Boot内嵌Tomcat实现的核心是`spring-boot-starter-tomcat`包。启动时,Spring Boot会初始化`TomcatServletWebServerFactory`,创建内嵌的Tomcat容器,方便开发却也限制了并发性能。Tomcat底层虽然支持NIO(非阻塞I/O)和APR(原生API),但这些都是“补丁”优化,无法解决根本的并发瓶颈问题。

比如说,Tomcat创建连接的关键代码:

// Tomcat Connector初始化部分 public void initInternal() throws LifecycleException { ... this.endpoint = new NioEndpoint(); // 默认使用NIO模式 ... this.protocolHandler = new Http11NioProtocol(endpoint); ... }

Tomcat默认启用NIO模式来处理请求,但在高并发场景下,这种基于线程池的处理方式仍然存在瓶颈。特别是当请求数量超出线程池容量时,就会出现请求阻塞,甚至出现`RejectedExecutionException`异常。也就是说,Tomcat的同步锁和线程管理方式并不适合高并发的场景。

为了解决这一问题,有些公司会直接用Netty替代Tomcat。Netty的Reactor模型特别适合处理大并发,因为它基于异步非阻塞I/O,允许高效管理大量连接,并能灵活配置事件循环,避免线程资源的竞争。

假设我们用Netty替代Spring Boot中的Tomcat,代码如下:

import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; import org.springframework.boot.web.server.WebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WebServerConfig { @Bean public WebServerFactory webServerFactory() { return new NettyReactiveWebServerFactory(); // 使用Netty替代Tomcat } }

这样Spring Boot启动时会加载Netty容器,放弃默认的Tomcat。Netty的事件驱动模型天生支持高并发场景,比如实时推送服务、大规模的WebSocket应用等,比Tomcat稳定而高效。某金融公司曾在处理数十万实时连接时,因Tomcat频繁出现连接数耗尽问题,改用Netty后,并发处理能力提升了一倍,系统的稳定性也显著提高。

换句话说,Tomcat并不是完全不行,但它对高并发、长连接场景支持有限,且在处理大量请求时的同步锁管理容易造成性能瓶颈。所以,才有些公司在Spring Boot项目中禁止使用Tomcat,选择Netty或Undertow等容器来保证项目的高并发性能与稳定性。

最后,分享一个不错的编程导航网站,里面有大量的免费教程供你学习:

j301.cn/java.html

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

欢迎 发表评论:

请填写验证码