SpringBoot内嵌Tomcat的坑

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

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

至少在SpringCloud H版,官方并无提供参数来修改这两个值,因此只能本身想办法。幸亏SpringCloud提供了WebServerFactoryCustomizer接口。web

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的形式注入。tomcat