你好 ?
我正在检查Tomcat 的服务器属性,但找不到keepAliveTimeout
和maxKeepAliveRequests
。
目前,我们使用定制器以编程方式配置它们,但我想知道 Spring Boot 公开它们是否可能/有用。
我也发现了这个评论。在我们的例子中,我们有 L7 负载平衡,我们设置maxKeepAliveRequests
为 -1(即无限制),其中keepAliveTimeout
a 高于连接超时。
你好 ?
我正在检查Tomcat 的服务器属性,但找不到keepAliveTimeout
和maxKeepAliveRequests
。
目前,我们使用定制器以编程方式配置它们,但我想知道 Spring Boot 公开它们是否可能/有用。
我也发现了这个评论。在我们的例子中,我们有 L7 负载平衡,我们设置maxKeepAliveRequests
为 -1(即无限制),其中keepAliveTimeout
a 高于连接超时。
想知道同样的事情。 @nikos912000,你得到一些答案了吗?
@nikmanzotti 你能分享你的定制器代码吗?
嗨@philwebb
当然,我的类实现了,TomcatConnectorCustomizer
方法customize
如下:
public void customize(final Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setExecutor(executor);
protocol.setMaxThreads(maxThreads);
protocol.setMaxConnections(maxConnections);
protocol.setAcceptCount(acceptCount);
protocol.setConnectionTimeout(connectionTimeout);
protocol.setKeepAliveTimeout(keepAliveTimeout);
protocol.setMaxKeepAliveRequests(maxKeepAliveRequests);
protocol.setProcessorCache(processorCache);
}
这对我们有用的原因是,当使用 Spring Cloud Gateway 时,默认的 netty httpclient 会进行连接池和 keepalive,我们会看到
reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE response
首先,添加spring.cloud.gateway.httpclient.pool.max-idle-time: 55s
帮助我们避免了 Tomcat 由于空闲而关闭连接的情况。
但现在我们看到 Tomcat 由于达到 maxKeepAliveRequests 而关闭了一些连接。不幸的是,Netty HttpClient 上没有设置可以在丢弃一个连接之前设置一个连接上的最大请求数。我们只能进行设置spring.cloud.gateway.httpclient.pool.max-life-time
,但这并没有什么帮助,因为我们可以在 30 秒内处理 100 个请求。
我们现在将使用 TomcatCustomizer,但如果能够在 Spring Boot 设置中进行设置,那就太好了
感谢您的反馈。我们同意添加这些附加属性是值得的。针对 2.x,但也进行了标记,以防ideal-for-contribution
社区中的任何人有兴趣提交 PR。
你好,我很高兴能解决这个问题。
@parviz-93 我已将问题分配给您。如果你有问题,请告诉我们。
你好,@parviz-93 如果你还没有实现这个,我想提供我的实现。我今天有时间,想第一次尝试为 spring-boot 做出贡献。这是我的公关:https://github.com/spring-projects/spring-boot/pull/25805
@mlubavin 谢谢,但才三天。
@parviz-93 请继续处理此问题,如果您有任何疑问,请告诉我们。
@scottfrederick,@wilkinsona 谢谢。我实际上几天前就完成了,但是关于我周末留下的“keepAliveTimeout”属性有一个问题。
tomcat文档说,在这个字段中我们可以设置-1,当我使用Duration类进行更舒适的声明时,但我不能为类Duration设置-1。在我看来,我们必须有可能为此字段设置-1。
您能告诉我如何解决这个问题吗?所以我可以使用“1ms”和“-1”作为“keepAliveTimeout”。也许,我可以使用 long/int
@parviz-93Duration
确实支持负值,所以我认为我们应该能够Duration
获取属性的类型。 Tomcat 似乎将任何值或小于 0 的值视为这样,-1
因此我认为我们可以获取以毫秒为单位的持续时间并将其传递给 Tomcat,而无需-1
.
@wilkinsona 是的,你是对的!我错了Duration
。
结束有利于 PR #25815