java - Java 中的 Envoy gRPC HTTP/1.1 桥接器
问题描述
我正在尝试在 Java 中实现 Envoy gRPC Bridge 的示例,请遵循此https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/grpc_bridge
在 Envoy 的 example 的源代码中,有代码从 grpc 请求构建 gRPC 框架,然后将其作为数据放入到 envoy 代理的 http 请求中
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
谢谢
解决方案
主体应该是序列化的 grpc 主体,即:
1 个字节的零(未压缩)。
network order 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;
}
把它留在这里给任何搜索相同问题的人
我只是试着让它工作,所以如果你们发现我的代码有什么不好的地方,请告诉我:)
推荐阅读
- amazon-web-services - 用户只能查看自己的实例的 IAM 权限
- celery - 芹菜接受比工人并发更多的任务
- python-3.x - 检查目标时出错:预期 dense_10 的形状为 (1,) 但得到的数组的形状为 (10,)
- reactjs - 如何访问 React 中存储中不存在的状态?
- javascript - 在某个子元素之后停止事件传播
- session - 如何使用烧瓶修复 json 中的会话
- arangodb - ArangoDB 的可视化查询支持
- c# - 如何在单击时将数据从数据网格行(form2)发送到已打开 form2 的用户控件(form1)中的另一个
- python - Pip 的 Python 问题,缺少已安装的模块?
- javascript - html2pdf.js 和 Webpack 出现“未安装 jsPDF 画布插件”错误