[spring-projects/spring-boot]公开 Tomcat keepAliveTimeout 和 maxKeepAliveRequests 属性

2020-09-30 843 views
6

你好 ?

我正在检查Tomcat 的服务器属性,但找不到keepAliveTimeoutmaxKeepAliveRequests

目前,我们使用定制器以编程方式配置它们,但我想知道 Spring Boot 公开它们是否可能/有用。

我也发现了这个评论。在我们的例子中,我们有 L7 负载平衡,我们设置maxKeepAliveRequests为 -1(即无限制),其中keepAliveTimeouta 高于连接超时。

回答

2

想知道同样的事情。 @nikos912000,你得到一些答案了吗?

2

@nikmanzotti 你能分享你的定制器代码吗?

3

嗨@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);
}
9

这对我们有用的原因是,当使用 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 设置中进行设置,那就太好了

9

感谢您的反馈。我们同意添加这些附加属性是值得的。针对 2.x,但也进行了标记,以防ideal-for-contribution社区中的任何人有兴趣提交 PR。

0

你好,我很高兴能解决这个问题。

0

@parviz-93 我已将问题分配给您。如果你有问题,请告诉我们。

7

@mlubavin 谢谢,但才三天。

@parviz-93 请继续处理此问题,如果您有任何疑问,请告诉我们。

4

@scottfrederick,@wilkinsona 谢谢。我实际上几天前就完成了,但是关于我周末留下的“keepAliveTimeout”属性有一个问题。

tomcat文档说,在这个字段中我们可以设置-1,当我使用Duration类进行更舒适的声明时,但我不能为类Duration设置-1。在我看来,我们必须有可能为此字段设置-1。

您能告诉我如何解决这个问题吗?所以我可以使用“1ms”和“-1”作为“keepAliveTimeout”。也许,我可以使用 long/int

3

@parviz-93Duration确实支持负值,所以我认为我们应该能够Duration获取属性的类型。 Tomcat 似乎将任何值或小于 0 的值视为这样,-1因此我认为我们可以获取以毫秒为单位的持续时间并将其传递给 Tomcat,而无需-1.

3

@wilkinsona 是的,你是对的!我错了Duration

8

结束有利于 PR #25815