Ошибка подключения io.netty.handler.codec.http2.Http2Exception: предисловие клиента HTTP/2 отсутствует или повреждено. Шестнадцатеричный дамп для полученных байтов:

Работа над двунаправленной потоковой передачей Grpc, когда я пытаюсь запустить grpc, получаю ошибку ниже

Connection Error
io.netty.handler.codec.http2.Http2Exception: HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: at io.netty.handler.codec.http2.Http2Exception.connectionError(Http2Exception.java:82)
    at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.readClientPrefaceString(Http2ConnectionHandler.java:322)
    at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.decode(Http2ConnectionHandler.java:263)
    at io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:445)
    at io.netty.handler.codec.ByteToMessageDecoder.decodeLast(ByteToMessageDecoder.java:382)
    at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:286)
    at io.netty.handler.codec.http2.Http2ConnectionHandler.channelInactive(Http2ConnectionHandler.java:421)
    at io.grpc.netty.NettyServerHandler.channelInactive(NettyServerHandler.java:227)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelInactiveNow(ChannelHandlerInvokerUtil.java:56)
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelInactive(DefaultChannelHandlerInvoker.java:92)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:135)
    at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:928)
    at io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:674)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:339)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:356)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:742)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)

В чем может быть проблема?

2 ответа

Есть одна вещь, о которой нужно знать, это разница между поведением по умолчанию NettyServerBuilder а также ManagedChannelBuilder с открытым текстом.

Если вы не включаете TLS на сервере (например, позвонив по sslContext() или же useTransportSecurity() на построителе сервера), то надо позвонить ManagedChannelBuilder.usePlaintext(true) на любом канале подключения к серверу.

Таким образом, другими словами, сервер по умолчанию работает с открытым текстом, но для каналов вам нужно позвонить usePlaintext() разрешить связь с серверами открытого текста. Если нет, вы получите это точно HTTP/2 client preface string missing or corrupt исключение (хотя, в моем случае, с определенной строкой байтов, следующей за hexdump).

Клиент и сервер не согласны. Как правило, это потому, что один является открытым текстом, а другой использует TLS. Но это также может быть связано с HTTP/1 против HTTP/2 в определенных средах.

Hex dump for received bytes пусто, поэтому недостаточно информации для более точной диагностики проблемы. Я никогда не видел, чтобы байты были пустыми, когда я видел этот сбой.

Другие вопросы по тегам