我需要进行POST使用WebClient,服务器要求对正文进行压缩。我已经检查了此处和此处之前提出的问题,但没有一个问题可以帮助我理解需要做什么。
我的代码看起来像这样:
webClient.post()
.bodyValue(requestBody)
.retrieve()
.bodyToMono(Response.class)
Run Code Online (Sandbox Code Playgroud)
我想requestBody使用 gzip 发送压缩文件。我们使用 RestTemplate 和自定义来完成此操作GZipFilter,但我现在不知道如何使用 WebClient 来完成此操作。
我对Bulkhead模式的理解是它是一种隔离线程池的方式。因此,与不同服务的交互使用不同的线程池:如果共享同一个线程池,一个服务不断超时可能会耗尽整个线程池,从而中断与其他(健康)服务的通信。通过使用不同的,可以减少影响。
根据我的理解,我认为没有任何理由将此模式应用于非阻塞应用程序,因为线程不会被阻塞,因此线程池也不会耗尽。
如果有人能澄清这一点,以防我遗漏了什么,我将不胜感激。
编辑(解释为什么它不重复):
还有另一个(更通用的)问题询问为什么将 Circuit-Breaker 和 Bulkhead 模式与 Reactor 一起使用。这个问题以非常通用的方式得到了回答,解释了为什么所有 Resilience4J 装饰器在使用 Reactor 时都是相关的。
另一方面,我的问题是隔板模式特有的,因为我不明白它在线程不被阻塞的情况下的好处。
我目前正在使用ExchangeFilterFunction记录进入ClientRequest实例内的所有标头,我正在访问它们做request.headers().
执行我的过滤器后,HttpClient下面会添加某些标头,例如那个标头Accept-Encoding,因此不会被记录,因为它们永远不会被添加到ClientRequest实例中。
我的过滤器看起来像这样:
public class WebClientLoggingFilter implements ExchangeFilterFunction {
@Override
public Mono<ClientResponse> filter(final ClientRequest clientRequest, final ExchangeFunction next) {
return Mono.just(clientRequest)
.doOnNext(request -> log(request.headers().toString()))
.flatMap(next::exchange)
.doOnNext(clientResponse -> logData(clientRequestData, message, clientResponse));
}
}
Run Code Online (Sandbox Code Playgroud)
此过滤器将所有内容记录在ClientRequest标头中,但随后HttpClient会发挥其魔力,即使在响应返回之后,它也永远不会到达 ClientRequest。来自 Netty的代码示例。
有没有其他方法可以进行日志记录,以便我可以访问真正通过网络发送的内容?