Как данные отправляются от клиента на (мультисервисный) сервер в gRPC

Я использую клиент-серверную структуру gRPC в одном из своих приложений (распознавание речи). Есть несколько важных вещей, которые я хочу прояснить своими наблюдениями.

1. Как отправляется необязательное поле данных, когда оно не заполняется клиентом?

Давайте посмотрим на этот пример ниже: (предположим, что используется proto3, поэтому все поля по умолчанию необязательны)

service NameStudent {
    rpc GetRoll(Student) returns (Details) {}
}

#Student'd details
message Student{
    int32 roll = 1;
    string name = 2;
    string gender = 4;
    int32 age = 3;
    DOB dateofbirth = 5;
}

#Students Date of Birth
message DOB {
    int32 dd = 1;
    int32 mm = 2;
    int32 yy = 3;
}

#Parent's details
message Parent{
    string parent =1;
}

#Students all details (includes student + parent)
message Details {
    Student student = 1;
    Parent parent = 4;
}

Предположим, что служба принимает (ввод от клиента) некоторые из сведений об учащемся, например, численность, имя и возраст, и возвращает (все) данные об этом учащемся < / сильный>

так что теперь, если вместо отправки всех трех деталей (т.е. рулона, имени и возраста), можно отправить даже одну или две детали и (логически предположить, что) служба работает.

В таких случаях будет ли сервер получать все поля (с пробелами / NULL для пропущенных полей) или клиент не будет отправлять эту пропущенную информацию вообще? (см. ниже представления двоичных данных, отправленных от клиента)

// roll and name filled
// age is left blank
// gender and DOB are always sent blank from client
{
    roll: 170012,
    name: "John Doe",
    age: ,
    gender: "",
    dateofbirth: {
           dd: ,
           mm: ,
           yy: 
    }
}

ИЛИ

//only roll and name is sent and rest is just not sent
{
    roll: 170012,
    name: "John Doe"
}

2. Можно ли подключить одну заглушку для двух сервисов?

Если сервер предлагает 2 службы, и я создаю клиентскую заглушку, смогу ли я подключить 2 канала из одной заглушки к одному и тому же серверу, получая доступ к 2 различным его службам?


person RC0993    schedule 13.03.2019    source источник


Ответы (1)


Вопрос 1

Ознакомьтесь с этой документацией по protobuf. Особенно:

Для любых неповторяющихся полей в proto3 или необязательных полей в proto2 закодированное сообщение может иметь или не иметь пару "ключ-значение" с этим номером поля.

Однако на практике я заметил, что необязательные поля со значениями по умолчанию при сериализации опускаются. Когда protobuf десериализуется, синтаксический анализатор интерпретирует отсутствующее поле как значение по умолчанию. Вы можете сами наблюдать за этим поведением, используя метод SerializeToString() на объектах Python protobuf.

Вопрос 2

Абсолютно возможно подключить несколько служб gRPC к одному серверу и взаимодействовать с несколькими службами из одного и того же клиентского канала. gRPC использует пути HTTP2, чтобы различать несколько служб, подключенных к одному серверу. Взгляните на для примера. add_GreeterServicer_to_server связывает определенный пользователем обработчик с путем /helloworld.Greeter/SayHello, который затем используется заглушкой для идентификации этой службы на сервере.

person Richard Belleville    schedule 13.03.2019
comment
Привет, @Richard. Красиво составленный ответ (ПРОДОЛЖИТЕ за это). У меня есть ответ на вопросы, но будет полезно понять пример, которым вы поделились в Answer2. Я не любитель питонов, поэтому я постараюсь изо всех сил разобрать этот пример шаг за шагом. Между тем, если вы можете / хотите добавить дополнительные объяснения по этому поводу, сделайте это ... Еще раз спасибо - person RC0993; 14.03.2019