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的属性和行为,优化其性能,并为用户提供更好的体验。可以根据上述方式进行优化,提高系统性能。

阅读剩余 61%

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

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

相关文章

  • 基于Java代码操作Redis过程详解

    下面是“基于Java代码操作Redis过程详解”的完整攻略。 1. 准备工作 在开始使用Java操作Redis之前,首先需要进行以下准备工作: 下载并安装Java开发工具,例如Eclipse、Intellij IDEA等。 下载并安装Redis数据库,这里推荐使用官方提供的稳定版本并进行配置。 导入Redis客户端Java驱动jar包,例如jedis等。 2…

    Java 2023年6月15日
    00
  • java实现简单的学生管理系统

    Java实现简单的学生管理系统 系统概述 本系统主要用于实现学生的增删查改功能,通过控制台输入进行操作,界面简单,操作方便。 系统架构 代码采用Java语言实现,采用MVC模式进行设计。其中,Model层主要负责数据存储与业务逻辑;View层主要负责展示数据和接受用户输入;Controller层主要负责控制Model和View的交互,实现对Model层数据的…

    Java 2023年5月18日
    00
  • Java实现定时任务

    Java实现定时任务可以使用Java内置的Timer和TimerTask类,也可以使用Spring框架提供的ScheduledExecutorService类。下面分别介绍两种方式的实现方法: 使用Timer和TimerTask类实现定时任务 创建一个Timer对象,并指定它的计划任务和执行时间间隔,例如: Timer timer = new Timer()…

    Java 2023年5月18日
    00
  • 解析Oracle数据库中的对象集合schema

    我来详细讲解一下解析Oracle数据库中的对象集合schema的完整攻略。 1. 确定schema名称 首先需要确认要解析的Oracle数据库对象集合schema的名称,可以使用以下SQL语句查询: SELECT username FROM dba_users; 2. 使用Oracle的数据字典 Oracle提供了数据字典来存储关于数据库对象的元数据信息,数…

    Java 2023年5月20日
    00
  • 如何基于Java实现对象List排序

    当我们需要对一个对象List进行排序时,可以使用Java提供的Collections.sort()方法来完成排序操作。以下是基于Java实现对象List排序的完整攻略: 1. 定义一个对象类 首先,我们需要定义一个对象类,并实现Comparable接口。比较方式可以根据具体需求进行定义。假设我们要对学生对象进行排序,比较方式为按照学生年龄从小到大排序,则可以…

    Java 2023年5月26日
    00
  • JSP实现用户登录、注册和退出功能

    下面是详细讲解“JSP实现用户登录、注册和退出功能”的完整攻略。 1. 前置条件 了解Java web开发相关知识 掌握Tomcat服务器的使用方式 下载并安装MySQL数据库 掌握JSP基本语法 2. 构建JSP Web项目 使用Eclipse等常用IDE创建一个JSP Web项目,配置好Tomcat服务器及数据库连接。 3. 数据库设计 用户信息在本案例…

    Java 2023年6月15日
    00
  • 浅谈SpringMVC jsp前台获取参数的方式 EL表达式

    关于浅谈SpringMVC jsp前台获取参数的方式 EL表达式,以下是完整攻略。 一、什么是EL表达式 EL(Expression Language)表达式是JSP 2.0引入的一种表达式语言,它主要用于动态的访问和操作JavaBean中的数据。 二、EL表达式的特点 EL表达式有以下特点: 提供了一种简洁的访问JavaBean属性的方式,不需要借助Jav…

    Java 2023年6月15日
    00
  • 使用Spring Data Jpa查询全部并排序

    对于这个问题,我可以给出一份详细的攻略,包括如何使用Spring Data JPA进行查询和如何进行排序。以下是具体的步骤: 1. 添加依赖 首先,我们需要在项目中添加Spring Data JPA的依赖。 <dependencies> <!– Spring Data JPA –> <dependency> <g…

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