Spring Boot 内置 Undertow 容器 MP4 播放异常排查

星野
星野
发布时间:2026-10-16| 6人浏览过
原创

在 Spring Boot 项目开发中,将默认 Web 容器从 Tomcat 替换为高性能的 Undertow 是一个常见需求。但在实测中发现,使用 Spring Boot 2.2.11 至 2.2.13 等特定版本搭配 Undertow 时,通过 WebMvcConfigurer 映射的本地路径静态资源(特别是 MP4 视频文件)会出现无法正常加载的情况。本文总结了环境搭建步骤,分析了潜在问题原因,并给出了调整容器配置、更换服务器组件及优化架构的具体建议。

实验环境与前置准备

为了复现该问题并验证相关容器配置,本次测试的基础环境如下:

  • 操作系统:Windows 7
  • 开发工具:Eclipse
  • JDK 版本:JDK 1.8
  • 构建工具:Maven 3.3.9
  • 核心框架:Spring Boot 2.2.x

第一步:Maven 依赖配置

首先需要移除 Spring Boot 默认的 Tomcat 依赖,并引入 Undertow 容器支持。

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.yelang</groupId>
  <artifactId>undertowdemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>Undertow测试</name>
  
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.10.RELEASE</version>
    <relativePath />
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <!-- 移除掉默认支持的 Tomcat -->
      <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>
  </dependencies>
</project>

第二步:Undertow 参数配置

在 application.yml 中对 Undertow 进行基础参数调优,涉及缓冲区大小、直接内存分配及线程池设置。

# undertow 配置
server:
  undertow:
    max-http-post-size: -1 # HTTP post内容的最大大小
    buffer-size: 512       # buffer的空间大小
    direct-buffers: true   # 是否分配的直接内存
    threads:
      io: 8                # IO线程数,每个CPU核心一个线程
      worker: 256          # 阻塞任务线程池,视系统负载而定

第三步:配置静态资源映射

通过实现 WebMvcConfigurer 接口,将本地物理路径映射到 URL 路径,以便访问外部文件(如上传的视频)。同时保留 Swagger 相关资源的映射。

package com.yelang.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class ResourcesConfig implements WebMvcConfigurer {
 
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    // 本地文件上传路径映射
    registry.addResourceHandler("/profile/**")
            .addResourceLocations("file:D:/wzh/uploadPath/");
    
    // swagger配置
    registry.addResourceHandler("swagger-ui.html")
            .addResourceLocations("classpath:/META-INF/resources/");
    registry.addResourceHandler("/webjars/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/");
  }
}

完成上述配置后,启动项目并将测试用的 MP4 文件放置于 D:/wzh/uploadPath/ 目录下。理论上可以通过 http://localhost:8080/profile/2.mp4 正常访问该视频。

遇到的坑:特定版本的资源加载失败

尽管配置看似完整且符合规范,但在实际测试中使用 Spring Boot 2.2.11、2.2.12 和 2.2.13 版本时,发现 MP4 等资源文件均无法加载。这可能与这些版本底层针对静态资源处理的一些机制变更有关。如果生产环境恰好部署了这几个版本的 Spring Boot + Undertow 组合,将面临业务风险。

Spring Boot 如何选择:Tomcat 还是 Undertow?

Spring Boot 默认内嵌的是 Tomcat 容器,绝大多数开发者对其最为熟悉。然而,随着业务对性能要求的提高,Undertow 逐渐进入视野。它由 Red Hat 开源,完全采用 Java 编写,灵活支持阻塞和非阻塞 I/O,在高并发场景下表现优异。新版 Undertow 默认启用持久连接,进一步提升了并发吞吐能力。

压测性能与内存对比

在相同机器配置与请求模拟条件下,对 Tomcat 和 Undertow 进行 QPS(每秒查询率)及内存占用测试:



从 QPS 测试结果来看:

从内存使用对比来看:

数据显示,在处理相等请求数时,Undertow 在性能和内存利用率上均优于 Tomcat。因此,对于高并发业务系统,Undertow 是更为理想的选择。

生产环境的修复方案建议

如果在生产环境中必须使用受影响的 Spring Boot 2.2.x 系列版本与 Undertow,导致 MP4 等静态资源无法预览,可参考以下解决策略:

  1. 版本回退/升级:尝试调整 Spring Boot 或 Undertow 的版本,避开已知的问题版本区间。
  2. 引入专业 Web 服务器:不再利用 Spring Boot 的内嵌容器提供大文件或视频资源,而是改用 Nginx 等专业静态资源服务器进行代理或直接托管。
  3. 迁移至第三方存储:采用对象存储服务或专用的分布式文件系统来管理非结构化数据。
  4. 换回 Tomcat:如果项目复杂度不高且对极致性能要求不迫切,直接将容器替换回默认的 Tomcat 是最快速的兼容手段。

以上就是关于 Spring Boot 集成 Undertow 引发静态资源无法访问问题的详细内容,更多关于 Spring Boot 容器选型与优化避坑的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。