Посланник gRP C HTTP / 1.1 мост в java - PullRequest
2 голосов
/ 12 марта 2020

Я пытаюсь реализовать пример Envoy gRP C Мост в Java. Следуйте этому https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/grpc_bridge

В исходном коде примера от Envoy есть код, создающий фрейм gRP C из запроса grp c, затем поместите его в качестве данных в запросе 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:])

Но я не знаю, как сделать то же самое (сборка GRP c frame) в Java

Пожалуйста, помогите мне узнать, как я могу это сделать?

Вы, ребята, можете найти полный пример кода здесь https://github.com/envoyproxy/envoy/tree/master/examples/grpc-bridge

Спасибо

1 Ответ

0 голосов
/ 13 марта 2020

Я реализовал функции, следующие за этим https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_http1_bridge_filter

Тело должно быть сериализованным телом grp c, которое:

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

Оставьте это здесь для тех, кто ищет ту же проблему

Я просто попытался заставить это работать, так что если вы, ребята, найдете что-то плохое в моем код, пожалуйста, дайте мне знать:)

...