我正在尝试在Java中实现Envoy gRPC Bridge的示例,请遵循以下https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/grpc_bridge
在来自Envoy的示例的源代码中,有代码从grpc请求构建gRPC框架,然后将其作为数据放入http请求中以发送给envoy代理
r = kv.GetRequest(key=key)
# Build the gRPC frame
data = r.SerializeToString()
data = pack('!cI', b'\0', 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
谢谢
问题来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
我遵循以下https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_http1_bridge_filter实现了功能
该主体应为序列化的grpc主体,即:
1个字节的零(不压缩)。
网络顺序4个字节的原始消息长度。
序列化的原始消息。
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) '\0';
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;
}
将其留在此处以供任何搜索相同问题的人使用
我只是试图使其工作,所以如果你们发现我的代码中有任何不好的地方,请告诉我:)
回答来源:Stack Overflow