我试图调用一项服务,并想为其设置超时。我找到了两种方法可以做到这一点。
HttpClient
中的读写超时,然后使用它 ClientHttpConnector
。HttpClient httpClient = HttpClient.create()
.tcpConfiguration(client ->
client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
.doOnConnected(c -> c
.addHandlerLast(new ReadTimeoutHandler(10))
.addHandlerLast(new WriteTimeoutHandler(10))));
ClientHttpConnector conn = new ReactorClientHttpConnector(httpClient.wiretap(true));
return WebClient.builder()
.baseUrl("http://localhost:8080")
.clientConnector(conn)
.build();
timeout()
。return webClient.get()
.uri("/someUri")
.retrieve()
.bodyToFlux(Foo.class)
.timeout(Duration.ofMillis(10_000));
这两种实施方式以及性能影响之间的主要区别是什么?
还有
Connect
、Read
和 Write
第一次实现中的超时与 HttpClient
有什么区别?
HtttClient 是较新版本,与 WebClient 相比具有附加功能。这不是超时方法的差异,而是整个客户端系统的差异。准确地说,WebClient 使您的代码比 HttpClient 少。
.NET 中的 System.Net.WebClient 类在 HttpWebRequest 之上提供了高级抽象。 WebClient 只是 HttpWebRequest 的包装,因此在内部使用 HttpWebRequest。因此,与 HttpWebRequest 相比,WebClient 有点慢,但需要编写的代码少得多。您可以使用 WebClient 来以简单的方式连接和使用 HTTP 服务。它通常是比 HttpWebRequest 更好的选择,除非您需要利用 HttpWebRequest 提供的附加功能。
HttpClient 是在 .NET Framework 4.5 中引入的。对于使用 .NET 4.5 或更高版本的开发人员来说,这是使用 HTTP 请求的首选方式,除非您有特定原因不使用它。从本质上讲,HttpClient 结合了 HttpWebRequest 的灵活性和 WebClient 的简单性,为您提供两全其美的优点。
HttpWebRequest 类提供了对请求/响应对象的大量控制。但是,您应该知道 HttpClient 从来没有被设计为 WebClient 的替代品。当您需要 HttpWebRequest 提供的附加功能时,您应该使用 HttpWebRequest 而不是 HttpClient。此外,与 WebClient 不同,HttpClient 缺乏对进度报告和自定义 URI 方案的支持。
虽然HttpClient不支持FTP,但是模拟和测试HttpClient更容易。 HttpClient 中的所有 I/O 绑定方法都是异步的,您也可以使用同一个 HttpClient 实例来发出并发请求。
这里有一个链接,可以帮助您更有效地理解它:https://www.infoworld.com/article/3198673/when-to-use-webclient-vs-httpclient-vs-httpwebrequest.html
连接超时:表示客户端尝试与服务器建立连接时等待的最长时间。
读取超时:表示客户端等待从服务器接收数据的最长时间。
写入超时:表示客户端向服务器发送数据时等待的最长时间。例如,如果您尝试发送大文件,写入超时将确定客户端在将数据传输到服务器时应等待多长时间。
第二个实现中的timeout()函数表示从建立连接到检索响应的整个操作的最长时间。
有关 webflux 超时的更多信息: