springboot内嵌tomcat优化

在外挂的配置文件application.properties中优化tomcat配置

在spring-configuration-metadata.json文件中相关tomcat配置

server.tomcat.accept-count:等待队列长度,默认100

server.tomcat.max-connections:最大可连接数,默认10000

server.tomcat.max-threads:最大工作线程数,默认200

server.tomcat.min-spare-threads:最小工作线程数,默认10

server.tomcat.accesslog.enabled=true  开启access日志

server.tomcat.accesslog.directory=/var/www//tomcat  日志存放的路径

server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D  日志格式为:请求的host主机地址,时间,方式,路径,协议,状态,返回字节数,处理时间

注意:默认配置下,连接数超过10000后出现拒接连接情况;触发的请求超过200+100后拒绝处理

定制内嵌tomcat开发

相关参数:

keepAliveTimeOut:多少毫秒后不响应的断开keepalive

maxKeepAliveRequests:多少次请求后keepalive断开失效

keepAlive简介:参考这里
优点: Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。,长连接能够保证服务器和客户端的socket能够高效利用,减少握手等额外的开销。

缺点:但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连 接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep-Alive功能对资源利用的影响尤其突出。

内嵌tomcat设置方法:
实现 WebServerFactoryCustomizer

具体如下:

 1 import org.apache.catalina.connector.Connector;
 2 import org.apache.coyote.http11.Http11NioProtocol;
 3 import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
 4 import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
 5 import org.springframework.boot.web.server.ConfigurableWebServerFactory;
 6 import org.springframework.boot.web.server.WebServerFactoryCustomizer;
 7 import org.springframework.stereotype.Component;
 8 
 9 //当Spring容器中没有TomcatEmbeddedServletContainerFactory这个bean时,会把此bean加载进容器
10 @Component
11 public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
12 
13     @Override
14     public void customize(ConfigurableWebServerFactory factory) {
15         //使用工厂类定制tomcat connector
16         ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
17             @Override
18             public void customize(Connector connector) {
19                 Http11NioProtocol protocol= (Http11NioProtocol) connector.getProtocolHandler();
20                 //设置30秒无响应则断开keepalive
21                 protocol.setKeepAliveTimeout(30000);
22                 //设置最大10000次请求后则断开keepalive
23                 protocol.setMaxKeepAliveRequests(10000);
24             }
25         });
26     }
27 }