这类似于如何做 akka-http 请求级背压?但对于 Spring 回声系统。
我正在考虑如何在以反应方式使用 Spring WebClient 时为 HTTP 客户端实现背压。对我来说,这听起来像是让 WebClient 意识到 HTTP 语义并对例如状态“429 - 请求过多”施加反压。我没有找到任何关于此的文档,这让我有点怀疑这是否是要走的路。
问题:
Retry-After标头)?或者是否有更好的方法通过 HTTP为非流式(请求-响应)用例进行背压?Retry-After标头中设置的超时重试是否有意义?我想实现一个 WebFilter,它读取传入请求的特定标头,使用此标头的值将 GET 请求调用到另一个反应式 REST 端点,然后使用 GET 响应的值改变原始请求。
我想在 WebFilter 中实现它,因为我不想将此函数调用添加到我的@RestController.
目前我有这个:
@Component
class ExampleWebFilter(val webClients: WebClients) : WebFilter {
override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
println(exchange.request.headers)
println(exchange.request.path)
println(exchange.response)
val test = webClients.internalAuthServiceClient.get()
.uri("/api/authorisation/v1/test")
.header("authToken", "authToken123")
.retrieve().bodyToMono(String::class.java)
println(test)
exchange.mutate().request(
exchange.request.mutate().header("newheader", test).build()
)
return chain.filter(exchange)
}
}
@Component
class WebClients() {
val internalAuthServiceClient = WebClient.builder()
.baseUrl("lb://auth-service")
.build()
}
Run Code Online (Sandbox Code Playgroud)
这显然现在行不通。我的 WebClient 正在返回 Mono,所以我不能直接在我的mutate()调用中使用它,因为这需要一个字符串。由于显而易见的原因,我也无法真正让 WebClient 调用阻塞操作。
有谁知道我如何解决这个问题?