【发布时间】:2021-05-09 23:56:18
【问题描述】:
关于向启用了 HTTP2 的服务器发送 HTTP2 请求时出现的问题的小问题
原因:io.netty.handler.codec.http2.Http2Exception:第一个接收到的帧不是 SETTINGS。前 5 个字节的十六进制转储:485454502f
设置: 在服务器端,Spring Webflux 应用程序 2.4.2,其中启用了带有 mTLS 的 http2。 java版本是11,netty版本是4。
server.http2.enabled=true
server.ssl.client-auth=need
server.ssl.enabled-protocols=TLSv1.3
server.ssl.enabled=true
server.ssl.key-alias=server
server.ssl.key-password=x
server.ssl.key-store-password=x
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS
server.ssl.key-store=keystore.p12
server.ssl.trust-store-password=x
server.ssl.trust-store-provider=SUN
server.ssl.trust-store-type=JKS
server.ssl.trust-store=truststore.p12
我知道它已成功启用 HTTP2,因为当我 curl 它时,我看到 curl 响应。
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 4294967295)!
< HTTP/2 200
在服务器端日志中,我确实看到了Feb/2021:+0000] "GET /route HTTP/2.0" 200 288448 24 ms
现在,问题:
一个使用Webflux Webclient的客户端,初始化如下:
WebClient.create().mutate().defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).clientConnector(new ReactorClientHttpConnector(HttpClient.create().protocol(HttpProtocol.H2).wiretap(true).secure(sslContextSpec -> sslContextSpec.sslContext(getSslContext())))).build();
注意 .protocol(HttpProtocol.H2)
当使用这个 Webclient 向这个启用 http2 的服务器发送完全相同的请求时,我看到了这个异常: 第一个接收到的帧不是 SETTINGS。前 5 个字节的十六进制转储:485454502f;
org.springframework.web.reactive.function.client.WebClientRequestException: First received frame was not SETTINGS. Hex dump for first 5 bytes: 485454502f; nested exception is io.netty.handler.codec.http2.Http2Exception: First received frame was not SETTINGS. Hex dump for first 5 bytes: 485454502f
at org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction.lambda$wrapException$9(ExchangeFunctions.java:137) ~[spring-webflux-5.3.3.jar!/:5.3.3]
网上查了一下,485454502f代表HTTP/,但是我的服务器是启用了HTTP2的!
它不是 gRPC 服务器,只是启用了 HTTP2。
因此,我不明白我为什么会遇到这个问题。
感谢您的帮助。
【问题讨论】:
-
请贴出你的java版本、spring框架版本、reactor netty版本
-
当然,更新了
-
netty 版本不能是 4,当前的 netty 版本是 1.0.3 github.com/reactor/reactor-netty/releases 我也想要客户端版本
-
明白。我正在使用 Spring Boot Webflux,所以 Netty 代表我“管理”
-
我可以在我的 bom 中看到
io.netty netty-bom ${netty.version} pom import 4.1.58.Final
标签: java spring-webflux http2