Я установил пример кода из примера gRPC route_guide
https://github.com/grpc/grpc/tree/v1.19.0/examples/node/dynamic_codegen/route_guide, который использует этот протокол https://github.com/grpc/grpc/blob/v1.19.0/examples/protos/route_guide.proto, который реализует двунаправленную потоковую передачу сообщений следующим образом:
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
где RouteNote это тип сообщения:
message RouteNote {
// The location from which the message is sent.
Point location = 1;
// The message to be sent.
string message = 2;
}
Насколько я понимаю, можно объявить только один тип сообщения для каждого двунаправленного потока, и использование oneof означает, что в этом примере я задаю только местоположение или сообщение.
Но я хочу иметь возможность отправлять сообщения нескольких типов по двунаправленному каналу сообщений.
Поэтому моя идея состоит в том, чтобы объявить только тип int32 для типа сообщения, а затем строку для хранения строкового объекта JSON. Примерно так:
message RouteNote {
int32 msgType = 1;
string jsonMsg = 2;
}
Затем на клиенте и на сервере я могу определить тип сообщения и кодировать / декодировать JSON в известный формат, который я разделяю между двумя сторонами.
Я не сомневаюсь, что это сработает, но мои вопросы
1) Есть ли у этого недостаток?
2) Есть ли лучший способ сделать это в gRPC?
Примечание: я использую nodejs в этом вопросе, но я считаю, что это не зависит от языка для gRPC, и для реализации, над которой я работаю, я могу выбирать между nodejs, C ++ или python.