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;
    }
}

 

posted @ 2023-04-27 09:18  HexThinking  阅读(37)  评论(0编辑  收藏  举报