在Spring Boot项目中,可以支持Tomcat、Jetty、Undertow的Web应用服务容器。当我们添加了spring-boot-starter-web依赖后,默认会使用Tomcat作为嵌入式Web容器,不需要我们单独部署,将web应用打成jar包即可运行。
调整SpringBoot应用容器的参数两种配置方法
- 修改配置文件(简单)
- 自定义配置类 (专业调优)
配文视频
嵌入式tomcat容器的运行参数配置
一、配置文件方式
在application.properties / application.yml可以配置Web 容器运行所需要的属性,可以通过该链接在官方网站查看关于server的所有配置项:server-properties。
- server.xx开头的是所有servlet容器通用的配置,
- server.tomcat.xx开头的是tomcat 容器特有的配置参数参数
- server.jetty.xx开头的是Jetty 容器特有的配置参数参数
- server.undertow.xx开头的是undertow容器特有的配置参数参数
1.1.常用配置参数
参数 | 默认值 | 说明 |
---|---|---|
server.port | 8080 | 配置Web容器的端口号 |
server.servlet.session.timeout | 30m(30分钟) | session失效时间。如果不写单位则默认单位是秒。(注意:由于Tomcat中配置session过期时间是以分钟为单位,如果这里设置是秒的话,那么会自动转换为一个不超过所配置秒数的最大分钟数。比如配置了119秒(1分59秒),那么实际session过期时间是1分钟) |
server.servlet.context-path | / | URL访问路径的基础路径 |
server.tomcat.uri-encoding | UTF-8 | 配置Tomcat请求编码 |
server.tomcat.basedir | 配置Tomcat运行日志和临时文件的目录。若不配置,则默认使用系统的临时目录。 |
1.2. tomcat性能优化核心参数
tomcat连接器工作原理图:
- 在Acceptor之前维护一个请求接收队列,该队列的最大长度即:tomcat可以接受的最大请求连接数:server.tomcat.max-connections。
- Acceptor监听连接请求,并生成一个 SocketProcessor 任务提交到线程池去处理
- 当线程池里面的所有线程都被占用,新建的SocketProcessor 任务被放入等待队列,等待队列的最大程度:server.tomcat.accept-count
- 线程池的server.tomcat.threads.max决定了tomcat的极限SocketProcessor 任务处理能力。不是越大越好,线程越多耗费的资源也越多。
- 线程池的server.tomcat.threads.min-spare在应用空闲时,保留一定的线程数在线程池内。避免请求到来后,临时创建线程浪费时间。
参数 | 默认值 | 说明 |
---|---|---|
server.tomcat.max-connections | 8192 | 接受的最大请求连接数 |
server.tomcat.accept-count | 100 | 当所有的线程都被占用,被放入请求队列等待的最大的请求连接数量 |
server.tomcat.threads.max | 200 | 最大的工作线程池数量 |
server.tomcat.threads.min-spare | 10 | 最小的工作线程池数量 |
二、自定义配置类方式
步骤:
1.建立一个配置类,加上@Configuration注解
2.添加定制器ConfigurableServletWebServerFactory
3.将定制器返回
@Configuration
public class TomcatCustomizer {
@Bean
public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(new MyTomcatConnectionCustomizer());
return factory;
}
static class MyTomcatConnectionCustomizer implements TomcatConnectorCustomizer {
public MyTomcatConnectionCustomizer() {
}
@Override
public void customize(Connector connector) {
connector.setPort(Integer.parseInt("8888"));
connector.setProperty("maxConnections", "8192");
connector.setProperty("acceptorThreadCount", "100");
connector.setProperty("minSpareThreads", "10");
connector.setProperty("maxThreads", "200");
}
}
}
这种方法可定制的内容更多,也更灵活。但需要你深入的理解server 容器的底层实现原理及设计机制,也需要你具备一定的TomcatServletWebServerFactory的API熟练度。
更灵活。但需要你深入的理解server 容器的底层实现原理及设计机制,也需要你具备一定的TomcatServletWebServerFactory的API熟练度。