【问题标题】:Envoy gRPC HTTP/1.1 bridge in javaJava 中的 Envoy gRPC HTTP/1.1 桥接器
【发布时间】:2020-03-12 14:55:16
【问题描述】:

我正在尝试在 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

谢谢

【问题讨论】:

    标签: java grpc envoyproxy python-envoy


    【解决方案1】:

    我按照这个https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_http1_bridge_filter实现了功能

    body 应该是序列化的 grpc body,即:

    • 1 个字节的零(未压缩)。

    • 网络订购 4 字节的 proto 消息长度。

    • 序列化的原始消息。

    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;
    }
    

    留在这里给任何搜索相同问题的人

    我只是试着让它工作,所以如果你们发现我的代码有什么不好的地方,请告诉我:)

    【讨论】:

      【解决方案2】:

      您可以使用 Java 的 ByteBuffer 来复制 python 的 pack 函数。 python pack 调用 pack('!cI', b'\0', 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();
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 2011-07-20
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        相关资源
        最近更新 更多