Netty HttpClient - 响应超时与读取超时

asc*_*eta 9 netty reactor-netty spring-webflux

HttpClientfrom 提供了各种要配置的“超时”,其中两个让我有点困惑:

  • 响应超时:This is time that takes to receive a response after sending a request
  • 读取超时处理程序:Raises a ReadTimeoutException when no data was read within a certain period of time

有人可以解释一下它们之间的主要区别吗?


通用场景 - 使用 spring reactive 进行调用,它在幕后WebClient使用:HttpClient

  1. 建立与远程服务器的连接>>>在这里我们利用ChannelOption.CONNECT_TIMEOUT_MILLIS
  2. TLS 握手>>> 这里我们利用,ReadTimeoutHandler我是对的吗?
  3. 发送请求
  4. ...等待...
  5. 接收响应>>> 此处哪个“超时”优先:响应/读取?

小智 3

如果您使用 WebFlux 和 Netty,则httpClient应该是 Netty httpClient。你去那里看过吗?https://projectreactor.io/docs/netty/release/api/reactor/netty/http/client/HttpClient.html

  1. 连接超时 -> 这是正确的,如果由于任何原因无法连接到远程服务器,则将使用此超时。

  2. TLS 握手,检查:reactor.netty.http.client.HttpClient#secure():如果没有另外配置,Netty 将假设握手超时 10 秒。如果您想定义另一个超时,请使用 reactor.netty.tcp.sslHandshakeTimeout https://projectreactor.io/docs/netty/release/api/reactor/netty/http/client/HttpClient.html#secure--

  3. 连接现已建立,您可以发送请求。通过使用,ReadTimeoutHandler您可以定义通过连接接收数据之前等待的时间。例如,这可以是一次性的整个响应,如果响应是流式传输的,则可以是字节。responseTimeouthttpClient做同样的事情。TcpClient两者都使用给定的设置创建timeOut。ReadTimeoutHandler 的好处是,您可以获得一个回调,该回调在发生超时时执行您定义的逻辑。

  • 我不建议使用 ReadTimeoutHandler ,原因在 https://github.com/reactor/reactor-netty/issues/1159 (2认同)