我有一个angular
web应用程序,它使用Spring引导,后端有一个嵌入式tomcat
服务器。我希望使已建立的http连接保持更长的活动时间,以提高后续http请求的响应时间。使用http/1.1
,浏览器被告知通过向response header
添加Connection: Keep-Alive
和类似Keep-Alive: timeout=5, max=1000
的内容来保持http连接的有效性。但是,HTTP/2中禁止使用特定于连接的头字段,如connection和Keep Alive。正因为如此,Chrome和Firefox在HTTP/2响应中忽略了它们。对于HTTP/2,特定于连接的元数据应该通过其他方式传递。
不过,我在任何地方都找不到这些"其他含义"应该是什么。我也找不到如何配置嵌入式Tomcat9服务器以将Keep-alive
元数据添加到HTTP/2
响应中。这就是tomcat现在的配置方式:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return (tomcat) -> tomcat.addConnectorCustomizers((connector) -> {
if (connector.getProtocolHandler() instanceof AbstractHttp11Protocol) {
AbstractHttp11Protocol<?> protocolHandler = (AbstractHttp11Protocol<?>) connector
.getProtocolHandler();
protocolHandler.setDisableUploadTimeout(false);
protocolHandler.setConnectionUploadTimeout(5000);
protocolHandler.setKeepAliveTimeout(4000);
protocolHandler.setMaxKeepAliveRequests(200);
protocolHandler.setUseKeepAliveResponseHeader(true);
}
});
}
但是,如果我想使用HTTP/2
,这些设置将不起作用。有什么想法吗?
使用http/1.1,浏览器会被告知通过在响应标头中添加connection:keep alive和类似keep alive:timeout=5,max=1000来保持http连接的有效性。
事实并非如此。由于HTTP/1.1,除非明确设置为Close
,否则Connection: Keep-Alive
标头默认为这种情况。事实上,我们甚至有了头,这更多的是HTTP/1.0天遗留下来的,不需要设置。响应总是更能说明服务器将要做什么,而不是向客户端发出指令("嘿,仅供参考,我将使用这些设置"(,但这也总是有点毫无意义,因为如果服务器(和客户端(愿意,也可以断开连接。如果服务器的TCP连接用完了,通常情况下,它不应该保留未使用的旧连接,而应该接受新连接。
但是,HTTP/2中禁止连接特定的头字段,如connection和Keep Alive。正因为如此,Chrome和Firefox在HTTP/2响应中忽略了它们。对于HTTP/2,特定于连接的元数据应该通过其他方式传递。
不过,我在任何地方都找不到这些"其他含义"应该是什么。我也找不到如何配置嵌入式Tomcat9服务器以将Keep-alive元数据添加到HTTP/2响应中。这就是tomcat现在的配置方式:
与前面一样,HTTP/2只是去掉了相当无意义的标头,并假设您希望保持它的活力。它在HTTP/2中也没有什么意义,因为它用于多个请求和响应,而HTTP/1.1一次只用于一个,保持活动是一种连接级别设置。那么,如果HTTP/2请求可以指定keep-alive: close
,那么这对该连接上已经在运行的其他请求意味着什么?类似地,将其设置为keep-alive
是HTTP/2多路复用的本质所暗示的。
这取决于客户端和服务器根据其自身的逻辑和资源限制来决定何时最好地断开连接,尽管HTTP/2规范稍后会说:
HTTP/2连接是持久的。为了获得最佳性能,预计客户端不会关闭连接,直到确定不需要与服务器进行进一步通信(例如,当用户导航离开特定网页时(,或者直到服务器关闭连接