Spring Boot如何优化内嵌的Tomcat示例详解

针对这个问题,我来详细讲解一下Spring Boot如何优化内嵌的Tomcat,包含以下内容:

1. 优化内嵌Tomcat的原因

Spring Boot在内嵌Tomcat作为HTTP服务器的情况下,处理请求效率较低,主要原因是默认的Tomcat设置了大量的属性,例如发送缓存和接收缓存大小、最大线程数等,这些设置并不一定适用于所有应用程序。因此,我们需要对内嵌Tomcat进行优化。

2. 如何优化内嵌Tomcat

2.1. 去掉默认的配置项

  • 方案: 输入以下代码,关闭内置的缓存和Gzip压缩
server:
  tomcat:
    compression: false # 关闭压缩
    max-threads: 150 # 修改最大线程数
  • 优点:这样可以有效减少Tomcat占用的内存和CPU,提高性能。

2.2. 自定义Tomcat配置

  • 方案一:通过ServletWebServerFactory自定义Tomcat
@Bean
public ServletWebServerFactory servletContainer() {

  TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();

  tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
    Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
    //4分钟没有请求则服务器自动断开连接
    protocol.setKeepAliveTimeout(240000);
    //同一连接最大请求1000次后自动断开连接
    protocol.setMaxKeepAliveRequests(1000);
  });

  tomcat.addContextCustomizers(context -> {
    context.addLifecycleListener(new Tomcat.TerminalLifecycleListener());
  });

  return tomcat;
}
  • 方案二:通过TomcatEmbeddedServletContainerFactory自定义Tomcat
@Bean
public TomcatEmbeddedServletContainerFactory servletContainer() {

    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {

        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };
    tomcat.addAdditionalTomcatConnectors(httpConnector());
    return tomcat;
}

private Connector httpConnector() {
    Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    //需要开启代理,否则找不到下面2条配置项
    connector.setProxyName("localhost");
    connector.setProxyPort(8080);
    connector.setPort(8081);
    return connector;
}
  • 优点:以上两种方式可以自定义Tomcat的属性和行为,适用于各种场景的定制化需求。

3. 两种优化方式的示例代码

3.1. 关闭内置的缓存和Gzip压缩

server:
  tomcat:
    compression: false # 关闭压缩
    max-threads: 150 # 修改最大线程数

3.2. 自定义TomcatConnector和TomcatContext

@Bean
  public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
      Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
      protocol.setMaxConnections(2000);
      protocol.setMaxThreads(2000);
      protocol.setConnectionTimeout(30000);
      protocol.setKeepAliveTimeout(300000);
      protocol.setMaxKeepAliveRequests(10000);
      protocol.setCompression("on");
      protocol.setCompressionMinSize(256);
      protocol.setCompressableMimeType("text/html,text/xml,text/javascript,text/css,application/json,application/xml");
    });
    tomcat.addContextCustomizers((TomcatContextCustomizer) context -> {
      StandardRoot standardRoot = new StandardRoot(context);
      standardRoot.setAllowLinking(true);
      context.setResources(standardRoot);
    });
    return tomcat;
  }

4. 总结

Spring Boot内嵌Tomcat是构建Web应用程序的一种常见方式,但默认的配置不一定适合所有场景。因此,我们可以根据具体需求自定义Tomcat的属性和行为,优化其性能,并为用户提供更好的体验。可以根据上述方式进行优化,提高系统性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot如何优化内嵌的Tomcat示例详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Spring Boot构建框架详解

    SpringBoot构建框架详解 什么是SpringBoot SpringBoot是由Pivotal团队在2013年开源的一款基于Java的框架,它旨在让开发者更加便捷地创建Spring应用。SpringBoot具备自动配置、快速开发、无代码生成等特点,同时它也提供了包括Web、数据、消息等在内的一系列开发场景。 如何使用SpringBoot 1. 环境要求…

    Java 2023年5月15日
    00
  • Java JVM原理与调优_动力节点Java学院整理

    Java JVM原理与调优攻略 什么是JVM JVM(Java Virtual Machine)是Java虚拟机的英文缩写,其是Java语言的核心,可运行Java字节码。Java字节码在编译Java源代码时自动生成,可在跨平台的环境下执行。JVM是一个虚拟的计算机,它有自己的指令集,称为字节码(Bytecode),程序在运行时被翻译成特定平台的机器语言执行。…

    Java 2023年5月26日
    00
  • Ajax方式提交带文件上传的表单及隐藏iframe应用

    我将为你详细讲解“Ajax方式提交带文件上传的表单及隐藏iframe应用”的完整攻略。在这个过程中我们将使用两个示例:一个是使用jQuery来进行Ajax文件上传;另一个是使用原生JavaScript的FormData对象来进行Ajax文件上传。 使用jQuery进行Ajax文件上传 首先,我们需要引入jQuery库,然后我们可以使用以下代码来实现使用jQu…

    Java 2023年6月15日
    00
  • JSP Spring ApplicationContext的国际化支持

    JSP Spring ApplicationContext的国际化支持是一种让应用程序可以在不修改源代码的情况下,动态切换不同语言版本的功能。下面就详细讲解一下该功能的实现步骤: 第一步:准备资源文件 在项目的src/main/resources目录下创建多个.properties文件,每个文件对应一个语言版本。例如,可以创建messages.propert…

    Java 2023年6月15日
    00
  • java中如何执行xshell命令

    Java中可以使用Runtime和Process类来执行xshell命令,下面是详细步骤: 1.创建Runtime对象使用Java中Runtime类创建一个Runtime对象,这个对象提供了执行操作系统命令的方法。 Runtime runtime = Runtime.getRuntime(); 2.调用exec方法通过Runtime对象调用exec方法,可以…

    Java 2023年5月26日
    00
  • 详解非spring框架下使用querydsl的方法

    下面为您详细讲解“详解非Spring框架下使用Querydsl的方法”的完整攻略。 什么是Querydsl? Querydsl是一个用于构建类型安全查询的框架,它支持多种关系型数据库和NoSQL数据存储的查询,可以通过Java8 Lambda表达式实现清晰、易读的DSL查询语法。 在非Spring框架下使用Querydsl的方法 1. 引入相关依赖 在Mav…

    Java 2023年5月20日
    00
  • mysql jdbc连接步骤及常见参数

    MySQL是一个常见的开源关系型数据库管理系统,在Java中通常使用JDBC(Java Database Connectivity)连接MySQL数据库。下面是MySQL JDBC连接步骤及常见参数的完整攻略。 JDBC连接MySQL的步骤 连接MySQL需要进行以下步骤: 加载MySQL JDBC驱动程序:Class.forName(“com.mysql.…

    Java 2023年5月20日
    00
  • JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)

    下面是详细讲解“JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)”的完整攻略。 什么是Base64编码 Base64是一种基于64个可打印字符来表示二进制数据的方法。使用Base64编码后,二进制数据可以在HTTP协议、电子邮件、网页表单等面向字符的介质中使用。在Base64中,每三个字节编码成四个字符,因此编码后的字符串…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部