众所周知,SpringCloud集成的Feign通过使用ApacheHttpClient,是可以支持长连接的。
但是我们测试却发现,长连接会被频繁的关闭。
调查发现,关闭连接是tomcat主动发起的,也就是说,ApacheHttpClient发起了长连接,但是Tomcat却把它关闭了。
Tomcat关闭长连接的条件有2个:
至少在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的形式注入。