文章背景图

升级springboot3.2后踩的坑

2025-04-23
7
-
- 分钟

升级之后,gateway和应用都出现eden space增长越来越快,从而导致gc越来越快,最后cpu飙升。

最后发现是因为gateway中 没有排除undertow,应用中没有排除tomcat相关依赖

整合gateway

在 Spring Cloud 项目中,‌Spring Cloud Gateway‌ 和 ‌Undertow‌ 不能直接一起使用的原因主要与底层架构的差异有关。以下是详细的解释:


1. ‌技术栈的冲突‌

  • Spring Cloud Gateway‌ 是基于 ‌Spring WebFlux‌ 构建的反应式(Reactive)网关,默认依赖 ‌Netty‌ 作为嵌入式服务器。

  • Undertow‌ 是 Servlet 容器(如 Tomcat、Jetty 的替代),适用于传统的阻塞式(Servlet)应用(如 Spring MVC)。

二者的技术栈在本质上是冲突的:

  • WebFlux(Netty)‌:非阻塞、反应式模型,需要 Netty 作为底层服务器。

  • Undertow(Servlet)‌:基于 Servlet API,属于阻塞式模型。

如果尝试将二者混合使用,会导致应用无法启动,因为 Spring Boot 无法同时配置两种不同的 Web 服务器。

tomcat和undertow

1. ‌性能与资源占用‌

特性

Undertow

Tomcat

线程模型

基于 ‌NIO‌(非阻塞式)和事件驱动

默认基于 ‌BIO‌(阻塞式),支持 NIO 但需配置

内存占用

更低(轻量级设计,无冗余功能)

较高(包含大量默认模块)

吞吐量

更高(适用于高并发、低延迟场景)

较低(传统模型在高并发下性能下降)

  • Undertow‌ 的 NIO 模型更适合现代高并发场景,例如微服务、API 网关等。

  • Tomcat‌ 默认的阻塞模型在处理大量并发请求时可能成为瓶颈,需手动配置为 NIO 模式(如 server.tomcat.protocol=NIO)。


2. ‌模块化与灵活性‌

  • Undertow‌:

    • 高度模块化,可按需加载组件(如 Servlet、WebSocket 等)。

    • 支持嵌入式部署,适合微服务架构中的轻量化需求。

    • 提供 ‌低层级 API‌,可直接操作 HTTP 协议,灵活性更高。

  • Tomcat‌:

    • 功能全面但较为臃肿(如默认加载 JSP 支持)。

    • 配置复杂(如 server.xml),适合传统 Web 应用。


3. ‌响应式编程支持‌

  • Undertow‌ 直接支持 ‌非阻塞式处理‌,与 Spring WebFlux 或 Quarkus 等反应式框架配合更高效。

  • Tomcat‌ 虽然支持 NIO,但其线程模型仍以阻塞式为主,与反应式编程的契合度较低。


4. ‌启动速度‌

  • Undertow‌ 启动时间更短,适合需要快速启停的云原生场景。

  • Tomcat‌ 启动较慢(需初始化更多组件)。

评论交流

文章目录