Spring WebClient 抛出 javax.net.ssl.SSLException: SSLEngine 在大量使用时已关闭

问题描述 投票:0回答:4

这是我的代码:

WebClient.create().post()
                .uri(URI.create(url))
                .header("Authorization",
                        "Basic " + Base64Utils.encodeToString(("username:password").getBytes(UTF_8)))
                .body(Mono.just(requestBody), Object.class)
                .retrieve()
                .bodyToMono(responseType)

我同时从多个线程调用这个函数。 当我在一次运行中只调用它大约 20~30 次时,它工作得很好。但是当我在大约 2 分钟内调用它 500~600 次(对于同一个 URL)时,它会抛出

javax.net.ssl.SSLException: SSLEngine closed already
    at io.netty.handler.ssl.SslHandler.wrap(...)(Unknown Source)

编辑

我尝试只创建一个

WebClient
实例,但它仍然抛出相同的异常

netty spring-webflux sslengine
4个回答
5
投票

我发现这是由于这个问题而发生的https://github.com/reactor/reactor-netty/issues/413

要解决此问题,您需要像这样创建

WebClient

WebClient webClient = WebClient.builder()
               .clientConnector(new ReactorClientHttpConnector(options -> {
                   options.poolResources(PoolResources.fixed("httpPool")).compression(true);
               })).build();

您可以通过使用第二个参数调用

PoolResources.fixed
来更改池大小

另一种解决方案是将此异步 http 客户端替换为另一个类似的客户端 https://github.com/AsyncHttpClient/async-http-client


1
投票

调用

WebClient.create()
多次重复创建和初始化HTTP资源。

如果没有有关此特定问题的更多详细信息或完整的堆栈跟踪,则很难确定此处的确切问题。但我怀疑为每个调用创建客户端 HTTP 连接器是一种浪费,并且可能会导致在客户端设置 SSL 时出现问题。

你可以尝试一下:

WebClient webClient = WebClient.create();
// then in your for loop
webClient.post() //...

如果您使用 Spring Boot,则应该注入一个

WebClient.Builder
实例并使用它来创建
WebClient
实例。


0
投票

我也遇到了同样的问题,就像OP提到的那样,它是在负载下发生的,但在服务器负载下时,它也很容易被“nginx -s reload”触发。 我在 nginx 论坛上发布了此内容,但到目前为止还没有回复https://forum.nginx.org/read.php?2,281786。 就我而言,我使用单例客户端实例来处理多个请求,因此我认为 Brian 评论不适用。


0
投票

这是由旧版 reactor-netty 库中的

已知问题
引起的。 reactor-netty 不会检查关闭的 ssl 连接,它可以将关闭的连接返回到连接池。然后,这个关闭的连接会被重新使用来发出更多请求,这显然会失败并出现
SSLEngine closed already
错误。该问题应该在
reactor-netty:1.0.18
更改日志

中解决

请注意错误修复列表中的这一行:

如果 SSLEngine 已被释放,请勿将连接返回到池中 由 @violetagg 关闭

要解决这个问题,你只需要更新

reactor-netty
库,或者spring(我知道spring 2.5.13不再有这个问题)

© www.soinside.com 2019 - 2024. All rights reserved.