当前位置: 首页 > 知识库问答 >
问题:

如何为Spring WebFlux配置netty connection-timeout

丁曦哲
2023-03-14

我在AWS loadbalancer后面运行spring cloud gateway(我知道它是构建在spring Webflux上的),我收到了502个断断续续的错误。经过调查,问题似乎与loadbalancer和我的节点之间的连接超时有关。从一些调查中可以看出,底层netty服务器的默认超时时间为10秒。我使用以下命令确定了这一点...

time nc -vv 10.10.xx.xxx 5100
Connection to 10.10.xx.xxx 5100 port [tcp/*] succeeded!

real    0m10.009s
user    0m0.000s
sys     0m0.000s

虽然我可以将负载均衡器上的idleTimeout设置为10秒以下,但这感觉非常低效。如果可能的话,我想保持在30秒以上。相反,我希望增加netty服务器上的连接超时。我已经尝试在我的应用程序中设置server.connection-timeout属性...

server:
  connection-timeout: 75000

也可以通过指定秒...

server:
  connection-timeout: 75s

但是当我运行time命令查看连接持续多长时间时,超时没有变化,它仍然在10秒结束...

time nc -vv 10.10.xx.xxx 5100
Connection to 10.10.xx.xxx 5100 port [tcp/*] succeeded!

real    0m10.009s
user    0m0.000s
sys     0m0.000s

共有1个答案

锺离边浩
2023-03-14

Netty服务器不支持server.connection-timeout配置键(但是),我提出了spring-boot#15368来解决这个问题。

连接超时大约是我们应该等待连接建立的最长时间。如果您希望自定义读/写超时,这是不同的选项。您可以添加ReadTimeOutHandler,如果服务器在配置的持续时间内没有从客户端接收数据,则该ReadTimeOutHandler将关闭连接。WriteTimeOuthandler也是如此,但这次是关于服务器将数据写入客户端。

下面是一个完整的例子:

@Configuration
public class ServerConfig {

    @Bean
    public WebServerFactoryCustomizer serverFactoryCustomizer() {
        return new NettyTimeoutCustomizer();
    }

    class NettyTimeoutCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

        @Override
        public void customize(NettyReactiveWebServerFactory factory) {
            int connectionTimeout = //...;
            int writetimeout = //...;
            factory.addServerCustomizers(server -> server.tcpConfiguration(tcp ->
                    tcp.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout)
                            .doOnConnection(connection ->
                                    connection.addHandlerLast(new WriteTimeoutHandler(writetimeout)))));
        }
    }

}
@RestController
public class TestController {

    @GetMapping(path = "/", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> textStream() {
        return Flux.interval(Duration.ofSeconds(5)).map(String::valueOf);
    }
}

我已经在本地机器上测试了这个netcat命令,到目前为止还没有超时。

time nc -vv 192.168.0.28 8080
192.168.0.28 8080 (http-alt) open
^CExiting.
Total received bytes: 0
Total sent bytes: 0
nc -vv 192.168.0.28 8080  0.01s user 0.00s system 0% cpu 2:36.53 total

也许这是在OS级别配置的东西,或者也许网络设备被配置为关闭这样的连接?我刚刚看到您添加了spring-cloud-gateway标签--也许这是该项目的特定内容?

 类似资料:
  • 问题内容: 突然在JUnit测试期间这种情况一直发生。一切正常,我编写了一些新测试,并且发生了此错误。如果我还原它,它不会消失。这是为什么? 问题答案: 您(直接或间接)编写的新测试使用 使用Log4j记录的类 。 需要配置Log4J才能使此日志正常运行。 将 log4j.properties (或log4j.xml)文件放在 测试类路径 的 根目录中 。 它应该具有一些基本配置,例如 默认情况下

  • 我试图在postgresql中使用HikariCP,但我在任何地方都找不到postgresql的配置。 请给我指出任何示例postgresql与HikariCP或任何配置教程相同。 我试着像下面那样使用它,但它不起作用,然后我意识到它是为MySQL设计的

  • 也许我做错了什么。 CORS策略阻止从来源“https://www.keycloak.org”访问“https://accounts.zoodexchange.com/auth/realms/development/protocol/openid-connect/token”处的XMLHttpRequest:请求的资源上没有“access-control-allow-orgin”标头。 您可以使用

  • 问题内容: 这是MySQL的配置文件: 为SQL Server 2005指定什么?我这样做是这样的: 我的问题更确切地说是如何指定必须连接的数据库? 在MySQL中,我曾经这样做: 问题答案: 特定于数据库的 属性是: :JDBC驱动程序类 :JDBC URL :数据库用户 :数据库密码 :Hibernate的类名,它允许Hibernate生成针对特定关系数据库优化的SQL。 要更改数据库,您必须

  • 我想为我的项目添加Java8支持。我找到的唯一合适的解决方案是retrolambda gradle插件项目。这是我的身材。项目和模块的gradle文件。 注意:请不要建议迁移到Android Studio 3,因为我想了解它为什么不工作。 项目build.gradle 模块构建。格拉德尔 这个应用程序本身非常简单。它只有一个默认活动,带有Java8代码,如下所示: 启动应用程序时,我发现以下错误:

  • 问题内容: 这是MySQL的配置文件: 为SQL Server 2005指定什么?我这样做是这样的: 我的问题更确切地说是如何指定必须连接的数据库? 在MySQL中,我曾经这样做: 问题答案: 特定于数据库的 属性是: :JDBC驱动程序类 :JDBC URL :数据库用户 :数据库密码 :Hibernate的类名称,它允许Hibernate生成针对特定关系数据库优化的SQL。 要更改数据库,您必