若依使用 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 依赖:

<!-- 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 容器,并进行相关的性能配置:

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

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

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

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

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,不仅优化了性能,还提升了对高并发请求的处理能力。

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

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

相关文章

第 23 章 JSON

第 23 章 JSON 23.1 语法 JSON 语法支持表示 3 种类型的值。 ❑ 简单值&#xff1a;字符串、数值、布尔值和 null 可以在 JSON 中出现&#xff0c;就像在 JavaScript 中一样。特殊值 undefined 不可以。 ❑ 对象&#xff1a;第一种复杂数据类型&#xff0c;对象表示有序键/值…

STM32-笔记34-4G遥控灯

4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…

数据结构考前一天

线性表&#xff1a;矩阵&#xff0c;链表&#xff08;单链表必考&#xff09; 栈和队列&#xff1a;出入判断&#xff0c;括号匹配&#xff0c;中缀转后缀 字符串数组&#xff1a;模式匹配next&#xff0c;nextval数组&#xff0c;数组寻址&#xff0c;三角矩阵对应一维数组k…

Frontend - 分页(针对 python / Django )

目录 一、同个文件内&#xff08;方式一&#xff09; 1. 前端 html 2. 定义分页界面 3. 获取分页数据 4.后端根据前端分页需求&#xff0c;整理分页数据 5.显示情况 6. JsonResponse 相关知识 二、不同文件内依旧有效&#xff08;方式二&#xff0c;更优化&#xff09;…

【快速实践】深度学习 -- 数据曲线平滑化

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; 在观察数据结果时&#xff0c;我们通常希望获得整体趋…

SQLite 进阶:扩展功能与最佳实践

在前两篇文章中&#xff0c;我们探讨了 SQLite 的基础知识和高级功能。本篇将进一步探讨 SQLite 的扩展功能&#xff0c;包括加密、与其他工具的集成、多线程使用、性能优化&#xff0c;以及如何实现跨平台兼容性。 数据加密 SQLite 本身不直接支持加密&#xff0c;但可以通过…

Postgresql 命令还原数据库

因为PgAdmin打不开&#xff0c;但是数据库已经安装成功了&#xff0c;这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

minikube安装k8s

一、安装k8s版本 export REGISTRY_MIRRORhttps://registry.cn-hangzhou.aliyuncs.com curl -sSL https://kuboard.cn/install-script/v1.30.x/install_kubelet.sh | sh -s 1.30.0 二、安装docker及minikube useradd docker passwd docker 密码也设置为docker #创建docker组…

JavaScript 基础2

js的运算符 算数运算符 相加求和&#xff0c;如果用在字符串则是拼接 -相减求差 *相乘求积 /相除求商 %模除求余 具体用法如下 let num 154 let num2 15 document.write(numnum2) document.write(<br>) document.write(num-num2) document.write(<br>) do…

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开&#xff0c;本次讲座中来自Xsens的人形机器人与动捕技术专家Jeffrey Muller与Dennis Kloppenburg不仅将就Xsens动作捕捉系统与人形机器人行为训练中的实际应用进行详细讲解&#xff0c;同时还会对目前大家所关注…

ArcGIS Server 10.2授权文件过期处理

新的一年&#xff0c;arcgis server授权过期了&#xff0c;服务发不不了。查看ecp授权文件&#xff0c;原来的授权日期就到2024.12.31日。好吧&#xff0c;这里直接给出处理方法。 ArcGIS 10.2安装时&#xff0c;有的破解文件中会有含一个这样的注册程序&#xff0c;没有的话&…

Fabric部署-docker安装

一&#xff1a;安装docker 1.先卸载旧docker apt-get remove docker docker-engine docker.io containerd runc PS&#xff1a;新开的虚拟机输入命令后是这样的。 2.更新软件包 在终端中执行以下命令来更新Ubuntu软件包列表和已安装软件的版本: sudo apt update sudo apt …

Scrum中敏捷项目经理(Scrum Master)扮演什么角色?

敏捷开发模式已经逐渐被主流的软件研发团队所接受&#xff0c;其中Scrum是最具代表性的敏捷方法之一。Scrum框架中有三个核心角色&#xff1a;Product Owner&#xff08;PO&#xff09;、Scrum Master&#xff08;SM&#xff09;和Development Team&#xff08;DT&#xff09;。…

计算机毕设-基于springboot的教务管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

Lianwei 安全周报|2025.1.2

以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 国家数据局等五部门印发《关于促进企业数据资源开发利用的意见》 为充分释放企业…

ROS导航使用贝塞尔曲线对全局路径进行平滑处理

文章目录 前言一、贝塞尔曲线的使用二、全局路经修改三、结果对比 前言 ROS原生的全局路径规划GlobalPlanner包含A*和Dijkstra&#xff0c;两者原理基本相同&#xff0c;能够规划出从起点到终点的路径&#xff0c;但是由于栅格地图存在锯齿形&#xff0c;得到的全局路径也会出…

矩阵简单问题(Java)

问题&#xff1a; 顺时针打印二维方阵&#xff1a; 1 2 3 4 15 5 6 7 8 14 9 10 11 12 13 13 14 15 16 public class Test1 {public static void main(String[] args) {int[][] arr new int[][]{{1, 2, 3, 4,100},{5, 6, 7, 8,101},{9, 10, 11, 12,102},{13, 14, 15, 16,…

python实现,outlook每接收一封邮件运行检查逻辑,然后发送一封邮件给指定邮箱

以下是一个使用 Python 和 win32com.client 模块实现的示例代码&#xff0c;每当 Outlook 接收到一封新邮件时&#xff0c;执行检查逻辑并发送一封邮件到指定邮箱。这个代码依赖于 Windows 系统和安装了 Microsoft Outlook。 环境准备 确保安装了 pywin32 库&#xff1a;pip …

【Vue】v-if 和 :is 都是 Vue 中的指令,但它们用于不同的目的和场景

v-if v-if 是一个条件渲染指令&#xff0c;用于根据表达式的真假值来决定是否渲染一块内容。当 v-if 的表达式为真&#xff08;truthy&#xff09;时&#xff0c;Vue 会确保元素被渲染到 DOM 中&#xff1b;当表达式为假&#xff08;falsy&#xff09;时&#xff0c;元素不会被…

GIT 企业级开发学习 1

本节主要命令&#xff1a; git init ls 不能列出 .git ls -a 列出 .git 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库&#xff0c;在当前目录下生成一个 .git 隐藏文件夹&#xff0c;用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls -a 显示隐藏文件…