Undertow
和Tomcat
都是Java Servlet
容器,用于运行Java Web
应用程序,但它们在实现和特性上有一些区别:
Undertow
通常被认为在高并发情况下性能更好,因为它使用了异步非阻塞的IO
处理方式。这意味着它可以更有效地管理连接,减少线程使用量,并在大量并发请求时提供更好的响应性能。
Tomcat
采用传统的阻塞式IO
处理方式,每个请求都会占用一个线程,因此在高并发情况下,Tomcat
可能会消耗更多的系统资源。
Undertow
是一个轻量级的Servlet
容器,具有模块化的设计,允许开发者根据需要选择性地添加功能。它的设计更加灵活,可以根据特定需求进行定制。
Tomcat
是一个功能齐全的Servlet
容器,内置了许多功能,例如JSP
支持、WebSocket
支持等。它是一个完整的Java EE Web
容器,适用于广泛的Web
应用场景。
Undertow
支持嵌入式部署和独立部署两种方式。你可以将Undertow
作为嵌入式容器直接嵌入到应用程序中,也可以将其作为独立的服务器运行。
Tomcat
通常作为一个独立的Servlet
容器来使用,你需要将WAR
文件部署到Tomcat
服务器中才能运行应用程序。
Undertow
的配置通常更简单,可以通过简单的配置文件或者编程方式进行配置。它的配置项相对较少,更加直观。
Tomcat
的配置相对更复杂,因为它是一个完整的Java EE
容器,支持许多功能和扩展。管理Tomcat
可能需要更多的时间和经验。
Tomcat
拥有庞大的用户社区和丰富的生态系统,有大量的文档、教程和第三方扩展可供使用。
虽然Undertow
的用户社区相对较小,但它也在不断发展壮大,有着活跃的开发者和贡献者。
Undertow
更适合于对性能要求较高、需要轻量级和灵活性的场景,而Tomcat
则更适合于传统的企业级Web应用程序开发和部署。下面我们一起看看在若依框架中如何使用Undertow
来替代Tomcat
容器。
ruoyi-framework\pom.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
,指定Undertow
作为Servlet
容器:# 开发环境配置
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
:public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
{
File desc = new File(uploadDir + File.separator + fileName);
//
// if (!desc.exists())
// {
if (!desc.getParentFile().exists())
{
desc.getParentFile().mkdirs();
}
// }
return desc;
}
这里根据Undertow
的特点,不再需要手动创建文件,因为Undertow
在文件上传方面的实现与Tomcat
略有不同。
powered by kaifamiao