如何将数据从客户端发送到gRPC中的(多服务)服务器

时间:2019-03-13 04:25:42

标签: web-services protocol-buffers grpc protobuf-c

我在我的一个应用程序中使用了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: 
    }
}

OR

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

2。可以为两个服务连接单个存根吗?

如果服务器提供2个服务,而我正在制作一个客户端存根,我将能够从同一个存根连接2个通道到同一台服务器,以访问2个不同的服务吗?

1 个答案:

答案 0 :(得分:2)

问题1

看看this protobuf documentation。特别是:

  

对于proto3中的任何非重复字段,或proto2中的可选字段,   编码后的消息可能具有也可能没有键值对   字段编号。

尽管在实践中,我观察到序列化中省略了具有默认值的可选字段。反序列化protobuf时,解析器会将缺少的字段解释为默认值。您可以在Python protobuf对象上使用SerializeToString()方法来自己观察这种行为。

问题2

绝对有可能将多个gRPC服务附加到同一服务器,并与来自同一客户端通道的多个服务进行交互。 gRPC使用HTTP2 paths区分附加到同一服务器的多个服务。以this gRPC Python generated code为例。 add_GreeterServicer_to_server将用户定义的处理程序与路径/helloworld.Greeter/SayHello关联,然后存根将其用于标识服务器上的该服务。