Как данные отправляются с клиента на (мультисервисный) сервер в gRPC - PullRequest
0 голосов
/ 13 марта 2019

Я использую клиент-серверную среду 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;
}

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

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

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

// 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 канала от одной заглушки кодин и тот же сервер, имеющий доступ к двум его службам?

1 Ответ

2 голосов
/ 13 марта 2019

Вопрос 1

Взгляните на эту документацию по протоколу .В частности:

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

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

Вопрос 2

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

...