SpringBoot内嵌Tomcat的坑

众所周知,SpringCloud集成的Feign通过使用ApacheHttpClient,是可以支持长连接的。
但是我们测试却发现,长连接会被频繁的关闭。
调查发现,关闭连接是tomcat主动发起的,也就是说,ApacheHttpClient发起了长连接,但是Tomcat却把它关闭了。
Tomcat关闭长连接的条件有2个:

  • 单个连接的空闲时间超过60秒
  • 单个连接处理的请求数量超过100个

至少在SpringCloud H版,官方并没有提供参数来修改这两个值,所以只能自己想办法。幸好SpringCloud提供了WebServerFactoryCustomizer接口。

public class MyWebCustomizer implements WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory> {
@Value("${tomcat.keepalivetimeout}")
private Integer keepAliveTimeout;  //空闲等待时间
@Value("${tomcat.maxKeepAliveRequests}")
private Integer maxKeepAliveRequests;  //最大处理请求数
@Override
public void customize(ConfigurableTomcatWebServerFactory factory){
  factory.addConnectorCustomizers((connector) -> {
    ProtocolHandler handler = connector.getProtocolHandler();
    if(handler instanceof AbstractHttp11Protocol){
        AbstractHttp11Protocol<?> protocol = (AbstractHttp11Protocol)handler;
        protocol.setKeepAliveTimeout(keepAliveTimeout);
        protocol.setMaxKeepAliveRequests(maxKeepAliveRequests);
    }
  }

}
}

当然上述类需要以Bean的形式注入。

你可能感兴趣的:(SpringBoot内嵌Tomcat的坑)