当它在 GRPC 服务器上吐出此消息时,遇到流结束中帧意味着什么?

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

我正在向 grpc 服务发送数据并收到错误消息作为回报:

遇到中帧流结束

这是什么意思。连接中断或其他原因,例如发送的数据不足。 是我的客户端未能发送足够的消息数据,还是处理过程中出现连接中断。我没有得到足够的信息。

如果您不知道这里出了什么问题,请告诉我这是否意味着连接在处理过程中关闭得太早,或者数据馈送的时间没有预期的那么长,但没有连接问题。

我正在使用来自 Envoy 代理 (Lyft) 的此过滤器:

我正在使用 Envoy 的这座桥:

https://www.envoyproxy.io/docs/envoy/latest/configuration/http_filters/grpc_http1_bridge_filter

它要求前面的零字节和长度为大印度的 4 个字节。

对我来说,这是一条又长又丑陋且毫无意义的消息:

Jul 23, 2019 2:26:06 PM io.grpc.netty.shaded.io.grpc.netty.NettyServerStream$TransportState deframeFailed
WARNING: Exception processing message
io.grpc.StatusRuntimeException: INTERNAL: Encountered end-of-stream mid-frame
    at io.grpc.Status.asRuntimeException(Status.java:524)
    at io.grpc.internal.AbstractServerStream$TransportState.deframerClosed(AbstractServerStream.java:238)
    at io.grpc.netty.shaded.io.grpc.netty.NettyServerStream$TransportState.deframerClosed(NettyServerStream.java:155)
    at io.grpc.internal.MessageDeframer.close(MessageDeframer.java:229)
    at io.grpc.internal.MessageDeframer.deliver(MessageDeframer.java:296)
    at io.grpc.internal.MessageDeframer.request(MessageDeframer.java:161)
    at io.grpc.internal.AbstractStream$TransportState.requestMessagesFromDeframer(AbstractStream.java:205)
    at io.grpc.netty.shaded.io.grpc.netty.NettyServerStream$Sink$1.run(NettyServerStream.java:100)
    at io.grpc.netty.shaded.io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
    at io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:333)
    at io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)
    at io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:748)

14:26:06.445 [grpc-default-worker-ELG-3-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyServerHandler - [id: 0xd01ed34c, L:/127.0.0.1:9009 - R:/127.0.0.1:48042] OUTBOUND RST_STREAM: streamId=45 errorCode=8```


Is there something wrong with the client?

//Define a postRequest request
    HttpPost postRequest = new        HttpPost("http://10.10.xx.xx:31380/com.test.EchoService/echo");

//Set the API media type in http content-type header
    postRequest.addHeader("content-type", "application/grpc");


    int messageLength=EchoRequest.newBuilder()
        .setMessage("Hello"+ ": " + Thread.currentThread().getName())
        .build().getMessageBytes().toByteArray().length;

    byte[] lengthBytes =   ByteBuffer.allocate(4).putInt(messageLength).array();

    byte[] zeroByte = {0};

    byte[] messageBytes = EchoRequest.newBuilder()
        .setMessage("Hello" + ": " + Thread.currentThread().getName())
        .build().getMessageBytes().toByteArray();



    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    baos.write(zeroByte);
    baos.write(lengthBytes);
    baos.write(messageBytes);
    byte[] c = baos.toByteArray();

//Set the request post body
    StringEntity userEntity = new StringEntity(content);
    ByteArrayEntity bae = new ByteArrayEntity(baos.toByteArray());
    postRequest.setEntity(userEntity);

    //Send the request; It will immediately return the response in      HttpResponse object if any
    HttpResponse response = httpClient.execute(postRequest);

    //verify the valid error code first
    int statusCode = response.getStatusLine().getStatusCode();
    if (statusCode != 201)
   {
        throw new RuntimeException("Failed with HTTP error code : " +    statusCode);
   }




grpc grpc-java
2个回答
1
投票

错误消息意味着,服务器收到了部分数据,并且由于流结束为真,因此预计不会有更多数据到来。

根据错误消息,长度可能大于实际的原型有效负载。


0
投票

如果您使用的是 Spring Boot 版本 >= 3,请使用:

<dependency>
     <groupId>io.grpc</groupId>
     <artifactId>grpc-netty</artifactId>
     <version>1.65.0</version>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.