Envoy gRPC HTTP/1.1 桥接 java
Envoy gRPC HTTP/1.1 bridge in java
我正在尝试在 Java 中实现 Envoy gRPC Bridge 的示例,请遵循此 https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/grpc_bridge
在 Envoy 示例的源代码中,有代码从 grpc 请求构建 gRPC 框架,然后将其作为数据放入 envoy 代理的 http 请求中
r = kv.GetRequest(key=key)
# Build the gRPC frame
data = r.SerializeToString()
data = pack('!cI', b'[=12=]', len(data)) + data
resp = requests.post(HOST + "/kv.KV/Get", data=data, headers=HEADERS)
return kv.GetResponse().FromString(resp.content[5:])
但我不知道如何在 Java
中做同样的事情(构建 grpc 框架)
请帮我知道我该怎么做?
你们可以在这里找到完整的示例代码https://github.com/envoyproxy/envoy/tree/master/examples/grpc-bridge
谢谢
我按照这个实现了功能https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_http1_bridge_filter
The body should be the serialized grpc body which is:
1 byte of zero (not compressed).
network order 4 bytes of proto message length.
serialized proto message.
public static byte[] serializeGRPCRequest(GeneratedMessageV3 message) {
byte[] bytes = message.toByteArray();
byte[] length = intToNetworkByteOrder(bytes.length);
byte[] data = new byte[bytes.length + 5];
data[0] = (byte) '[=10=]';
System.arraycopy(length, 0, data, 1, length.length);
System.arraycopy(bytes, 0, data, 5, bytes.length);
return data;
}
public static byte[] intToNetworkByteOrder(int num) {
byte[] buf = new byte[4];
for (int i = 3; i >= 0; i--) {
buf[i] = (byte) (num & 0xff);
num >>>= 8;
}
return buf;
}
将它留在这里以供搜索相同问题的任何人使用
我只是试着让它工作,所以如果你们发现我的代码有什么不好的地方,请告诉我:)
您可以使用 Java 的 ByteBuffer
来复制 python 的打包功能。
python pack 调用 pack('!cI', b'[=12=]', len(data))
指定使用 BIG_ENDIAN 字节顺序(默认为 ByteBuffer)并写入一个 char/byte 后跟一个 uint。所以在 java 这将转化为:
public byte[] serializeGrpcRequest(Message message) {
byte[] messageBytes = message.toByteArray();
return ByteBuffer.allocate(messageBytes.length + 5)
.put((byte) 0)
.putInt(messageBytes.length)
.put(messageBytes)
.array();
}
我正在尝试在 Java 中实现 Envoy gRPC Bridge 的示例,请遵循此 https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/grpc_bridge
在 Envoy 示例的源代码中,有代码从 grpc 请求构建 gRPC 框架,然后将其作为数据放入 envoy 代理的 http 请求中
r = kv.GetRequest(key=key)
# Build the gRPC frame
data = r.SerializeToString()
data = pack('!cI', b'[=12=]', len(data)) + data
resp = requests.post(HOST + "/kv.KV/Get", data=data, headers=HEADERS)
return kv.GetResponse().FromString(resp.content[5:])
但我不知道如何在 Java
中做同样的事情(构建 grpc 框架)请帮我知道我该怎么做?
你们可以在这里找到完整的示例代码https://github.com/envoyproxy/envoy/tree/master/examples/grpc-bridge
谢谢
我按照这个实现了功能https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_http1_bridge_filter
The body should be the serialized grpc body which is:
1 byte of zero (not compressed).
network order 4 bytes of proto message length.
serialized proto message.
public static byte[] serializeGRPCRequest(GeneratedMessageV3 message) {
byte[] bytes = message.toByteArray();
byte[] length = intToNetworkByteOrder(bytes.length);
byte[] data = new byte[bytes.length + 5];
data[0] = (byte) '[=10=]';
System.arraycopy(length, 0, data, 1, length.length);
System.arraycopy(bytes, 0, data, 5, bytes.length);
return data;
}
public static byte[] intToNetworkByteOrder(int num) {
byte[] buf = new byte[4];
for (int i = 3; i >= 0; i--) {
buf[i] = (byte) (num & 0xff);
num >>>= 8;
}
return buf;
}
将它留在这里以供搜索相同问题的任何人使用
我只是试着让它工作,所以如果你们发现我的代码有什么不好的地方,请告诉我:)
您可以使用 Java 的 ByteBuffer
来复制 python 的打包功能。
python pack 调用 pack('!cI', b'[=12=]', len(data))
指定使用 BIG_ENDIAN 字节顺序(默认为 ByteBuffer)并写入一个 char/byte 后跟一个 uint。所以在 java 这将转化为:
public byte[] serializeGrpcRequest(Message message) {
byte[] messageBytes = message.toByteArray();
return ByteBuffer.allocate(messageBytes.length + 5)
.put((byte) 0)
.putInt(messageBytes.length)
.put(messageBytes)
.array();
}