若依使用 Undertow 替代 Tomcat 容器

文章目录

  • 需求提出
  • 应用场景
  • 解决思路
  • 注意事项
  • 完整代码
    • 第一步:在 ruoyi-framework/pom.xml 文件中进行依赖配置
    • 第二步:修改 application.yml 配置文件
    • 第三步:修改文件上传工具类 FileUploadUtils.java
  • 运行结果

需求提出

在开发若依框架的前后端分离应用时,Tomcat 是默认的 Web 容器,但在高并发、高性能要求的场景下,可能需要更轻量、性能更强的容器。Undertow 作为一个高性能、轻量级的 Servlet 容器,支持异步非阻塞 I/O,能够有效提升系统的性能。因此,我们需要在若依框架中将默认的 Tomcat 容器替换为 Undertow,以提升应用的响应速度和并发处理能力。

应用场景

如果你的应用需要处理高并发请求或对性能有较高的要求,Undertow 是一个理想的选择。它比 Tomcat 更轻量,使用了非阻塞 I/O,能够更高效地处理大量并发请求,适合高流量的 Web 应用。对于需要嵌入式容器的开发场景,Undertow 也可以作为一个嵌入式容器使用,而不需要单独部署一个 Web 服务器。

解决思路

为了在若依框架中使用 Undertow 替代 Tomcat,我们可以通过修改 pom.xml 文件来添加 Undertow 依赖,并在 application.yml 配置文件中指定 Undertow 作为 Servlet 容器。具体操作包括排除 Tomcat 依赖、添加 Undertow 依赖,以及调整 Undertow 的相关配置,以确保它能够正常工作。

注意事项

  • 在修改 pom.xml 时,需要排除 spring-boot-starter-tomcat,并确保 spring-boot-starter-undertow 依赖已正确添加。
  • Undertow 配置较为简洁,但需要调整一些性能参数,例如 IO 线程、工作线程等,确保它在高负载下能够正常运行。
  • Undertow 和 Tomcat 在文件上传和处理方式上有所不同,因此需要检查文件上传的实现,确保没有因容器更换而影响到文件上传功能。

完整代码

第一步:在 ruoyi-framework/pom.xml 文件中进行依赖配置

首先,排除 Tomcat 的默认依赖,并添加 Undertow 依赖:

xml 复制代码
<!-- SpringBoot Web容器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 排除内置的Tomcat -->
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 添加Undertow依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

这段配置会从 Spring Boot Starter Web 中排除 Tomcat 并添加 Undertow 作为容器。

第二步:修改 application.yml 配置文件

在 application.yml 中指定 Undertow 作为 Servlet 容器,并进行相关的性能配置:

yaml 复制代码
# 开发环境配置
server:
  # 服务器的HTTP端口,默认为80
  port: 80
  servlet:
    # 应用的访问路径
    context-path: /
  # Undertow配置
    undertow:
    # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
    max-http-post-size: -1
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分
    buffer-size: 512
    # 是否使用分配的直接内存
    direct-buffers: true
    threads:
      # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
      io: 8
      # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
      worker: 256

在这里,我们设置了 Undertow 的相关配置,如 HTTP POST 最大大小、缓冲区大小、IO 线程数等,来优化性能。

第三步:修改文件上传工具类 FileUploadUtils.java

由于 Undertow 在处理文件上传时的实现和 Tomcat 略有不同,需要调整文件上传工具类中的逻辑,确保与 Undertow 配合良好:

java 复制代码
public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
{
    File desc = new File(uploadDir + File.separator + fileName);
    
    if (!desc.getParentFile().exists())
    {
        desc.getParentFile().mkdirs();
    }
    
    return desc;
}

在这里,我们使用 Undertow 提供的异步处理方式,不再需要手动创建文件夹,因为 Undertow 会自动处理文件上传。

运行结果

  1. 成功替换 Tomcat 为 Undertow:通过修改 pom.xml 和 application.yml 配置,成功将若依框架的 Servlet 容器从 Tomcat 替换为 Undertow。
  2. 提高了并发性能:由于 Undertow 使用非阻塞 I/O 和更高效的线程池管理,系统在高并发情况下的性能得到了显著提升,能够更好地处理大量并发请求。
  3. 文件上传无异常:在 Undertow 的支持下,文件上传功能正常工作,且性能更为优越。

通过这几步操作,若依框架成功使用 Undertow 替代 Tomcat,不仅优化了性能,还提升了对高并发请求的处理能力。

相关推荐
counting money13 小时前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
假客套2 天前
记一次若依 Excel 导出踩坑:Permission denied、401 报错完整排查记录
java·若依·linux服务器
步行cgn2 天前
MyBatis 动态 SQL 完全指南
sql·tomcat·mybatis
SemiTris3 天前
从Controller到Tomcat底层请求链路全解析
java·tomcat
程序员良辰4 天前
【TongWeb8】使用 Crontab 定时重启和检测 TongWeb 服务
java·中间件·tomcat
上海云盾商务经理杨杨4 天前
Tomcat 弱配置漏洞渗透实战!批量 getshell 高频漏洞
java·web安全·tomcat
小张同学a.8 天前
zabbix企业级监控平台3——服务监控与API实战
linux·运维·mysql·nginx·tomcat·zabbix
带刺的坐椅13 天前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
xxwl58514 天前
数据库后端接口测试报告
spring boot·mysql·tomcat
次次皮16 天前
Linux 下通过 XShell 手动更新 Tomcat 应用并重启
前端·tomcat·jar