Springboot Tomcat容器相关知识点
SpringBoot内嵌Tomcat知多少
在 Spring Boot 框架中,我们使用最多的是 Tomcat,这是 Spring Boot 默认的容器技术,而且是内嵌式的 Tomcat。
Tomcat 是 Apache 基金下的一个轻量级的 Servlet 容器,支持 Servlet 和 JSP。Tomcat 具有 Web 服务器特有的功能,包括 Tomcat 管理和控制平台、安全局管理和 Tomcat 阀等。Tomcat 本身包含了 HTTP 服务器,因此也可以视作单独的 Web 服务器。但是,Tomcat 和 Apache HTTP 服务器不是一个东西,Apache HTTP 服务器是用 C 语言实现的 HTTP Web 服务器。
tomcat配置方法
通过yml中配置
# 设置Tomcat端口号 server.port=8080 # 配置Tomcat线程池参数 server.tomcat.max-threads=200 # Tomcat最大线程数 server.tomcat.min-spare-threads=50 # Tomcat最小空闲线程数 server.tomcat.accept-count=100 # Tomcat请求队列长度 # 配置Tomcat连接器参数 server.tomcat.uri-encoding=UTF-8 # Tomcat编码格式 server.tomcat.connection-timeout=60000 # 连接超时时间(毫秒) server.tomcat.keep-alive-timeout=60000 # 长连接超时时间(毫秒)
通过编写配置类
@Configuration public class TomcatConfig { @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); factory.setPort(8080); factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); protocol.setCompression("on"); protocol.setCompressionMinSize(256); String[] mimeTypes = protocol.getCompressibleMimeTypes(); mimeTypes = Arrays.copyOf(mimeTypes, mimeTypes.length + 1); mimeTypes[mimeTypes.length - 1] = "application/json"; protocol.setCompressibleMimeTypes(mimeTypes); } }); return factory; } }
Undertow服务器
Undertow 是 Red Hat 公司的开源产品,它完全采用 Java 语言开发,是一款灵活的高性能 Web 服务器,支持阻塞 IO 和非阻塞 IO。由于 Undertow 采用 Java 语言开发,可以直接嵌入到 Java 项目中使用。同时,Undertow 完全支持 Servlet 和 Web Socket,在高并发情况下表现非常出色。
服务器对比
在高并发系统中 Tomcat 相对来说比较弱,在相同的机器配置下,模拟相等的请求数,Undertow 在性能和内存使用方面都是最优的。并且 Undertow 新版本默认使用持久连接,这将会进一步提高它的并发吞吐能力。所以,如果是高并发的业务系统,Undertow 是最佳选择。
Sping Boot 中我们既可以使用 Tomcat 作为 HTTP 服务,也可以用 Undertow 来代替。Undertow 在高并发业务场景中,性能优于 Tomcat。所以,如果我们的系统是高并发请求,不妨使用一下 Undertow,你会发现你的系统性能会得到很大的提升。
如何使用undertow
首先重新配置依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除默认的Tomcat依赖 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.undertow</groupId> <artifactId>undertow-servlet</artifactId> <version>${undertow.version}</version> </dependency>
接下来是配置配置文件
server: undertow: accesslog: dir: # 日志存放目录 enabled: false # 是否启动日志 pattern: common # 日志格式 buffer-size: 0 # 设置缓冲区大小 max-headers: 100 # 设置最大请求头数量 direct-buffers: true # 是否使用直接内存缓冲区
之后在Spring Boot的启动类上添加@EnableWebMvc注解,以确保Undertow被正确配置和使用:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @SpringBootApplication @EnableWebMvc public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
如果需要更详细的配置,可以通过实现UndertowServletWebServerFactory
来自定义Undertow的配置:
import io.undertow.Undertow; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class UndertowConfig { @Bean public ServletWebServerFactory servletWebServerFactory() { UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory(); // 在这里可以进一步自定义Undertow的配置 return factory; } }