gRPC 消息格式
gRPC message format
我想知道如何正确构造 GRPC REQUEST 和 RESPONSE。我在“编解码器”部分找到的资源只有两个:
- 编码:https://developers.google.com/protocol-buffers/docs/encoding
- HTTP/2: https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#message-encoding
我相信我理解这两份文件。我了解 HTTP/2 框架的工作原理(我在 Rust 中实现了我自己的 HTTP/2 服务器和客户端,所以我详细了解它)但发送的消息总是无效。
让我们以这条简单的消息 (proto3) 为例:
message Test1 {
int32 a = 1;
}
我现在只处理 RESPONSE 部分。值 150
的连线格式(如 google 示例中所指定)应为十六进制 [08, 96, 01] ([00001000, 10010110, 00000001])。我将其打包到数据帧中并将其作为响应发送回 GRPC 客户端。响应如下所示:
...
[ 0.010] recv SETTINGS frame <length=0, flags=0x00, stream_id=0>
(niv=0)
00000000 00 00 00 04 01 00 00 00 00 |.........|
00000009
[ 0.010] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[ 0.010] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
00000000 00 00 0e 01 04 00 00 00 0d 88 5f 8b 1d 75 d0 62 |.........._..u.b|
00000010 0d 26 3d 4c 4d 65 64 |.&=LMed|
00000017
[ 0.012] recv (stream_id=13) :status: 200
[ 0.012] recv (stream_id=13) content-type: application/grpc
[ 0.012] recv HEADERS frame <length=14, flags=0x04, stream_id=13>
; END_HEADERS
(padlen=0)
; First response header
00000000 00 00 03 00 00 00 00 00 0d 08 96 01 |............|
0000000c
[ 0.016] recv DATA frame <length=3, flags=0x00, stream_id=13>
00000000 00 00 0f 01 05 00 00 00 0d 40 0b 67 72 70 63 2d |.........@.grpc-|
00000010 73 74 61 74 75 73 81 07 |status..|
00000018
[ 0.016] recv (stream_id=13) grpc-status: 0
[ 0.016] recv HEADERS frame <length=15, flags=0x05, stream_id=13>
; END_STREAM | END_HEADERS
(padlen=0)
[ 0.021] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
(last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[])
必须缺少 header 或我缺少消息格式。有人可以 post 使用 curl
的工作示例吗?谢谢!
我意识到 Length-Prefixed-Message
实际上是 Length-Prefixed, Message
所以每个数据负载都必须加上前缀。
我想知道如何正确构造 GRPC REQUEST 和 RESPONSE。我在“编解码器”部分找到的资源只有两个:
- 编码:https://developers.google.com/protocol-buffers/docs/encoding
- HTTP/2: https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#message-encoding
我相信我理解这两份文件。我了解 HTTP/2 框架的工作原理(我在 Rust 中实现了我自己的 HTTP/2 服务器和客户端,所以我详细了解它)但发送的消息总是无效。
让我们以这条简单的消息 (proto3) 为例:
message Test1 {
int32 a = 1;
}
我现在只处理 RESPONSE 部分。值 150
的连线格式(如 google 示例中所指定)应为十六进制 [08, 96, 01] ([00001000, 10010110, 00000001])。我将其打包到数据帧中并将其作为响应发送回 GRPC 客户端。响应如下所示:
...
[ 0.010] recv SETTINGS frame <length=0, flags=0x00, stream_id=0>
(niv=0)
00000000 00 00 00 04 01 00 00 00 00 |.........|
00000009
[ 0.010] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
[ 0.010] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
; ACK
(niv=0)
00000000 00 00 0e 01 04 00 00 00 0d 88 5f 8b 1d 75 d0 62 |.........._..u.b|
00000010 0d 26 3d 4c 4d 65 64 |.&=LMed|
00000017
[ 0.012] recv (stream_id=13) :status: 200
[ 0.012] recv (stream_id=13) content-type: application/grpc
[ 0.012] recv HEADERS frame <length=14, flags=0x04, stream_id=13>
; END_HEADERS
(padlen=0)
; First response header
00000000 00 00 03 00 00 00 00 00 0d 08 96 01 |............|
0000000c
[ 0.016] recv DATA frame <length=3, flags=0x00, stream_id=13>
00000000 00 00 0f 01 05 00 00 00 0d 40 0b 67 72 70 63 2d |.........@.grpc-|
00000010 73 74 61 74 75 73 81 07 |status..|
00000018
[ 0.016] recv (stream_id=13) grpc-status: 0
[ 0.016] recv HEADERS frame <length=15, flags=0x05, stream_id=13>
; END_STREAM | END_HEADERS
(padlen=0)
[ 0.021] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
(last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[])
必须缺少 header 或我缺少消息格式。有人可以 post 使用 curl
的工作示例吗?谢谢!
我意识到 Length-Prefixed-Message
实际上是 Length-Prefixed, Message
所以每个数据负载都必须加上前缀。