我应该为每个方法创建一条消息还是在gRPC中使用共享消息?

时间:2017-08-29 09:03:17

标签: protocol-buffers grpc

目前我正在使用gRPC作为服务器之间的通信,但我不知道哪种模式最好。

我应该创建共享请求消息(UserRequest被视为User个对象):

service User {
    rpc Create (UserRequest) returns (Reply) {}
    rpc Update (UserRequest) returns (Reply) {}
    rpc Delete (UserRequest) returns (Reply) {}
}

message UserRequest {
    string username = 1;
    string password = 2;
    string email = 3;
    string gender = 4;
    string birthday = 5;
}

或者按照这样的方法创建一条消息来定义方法实际需要的字段?但由于这些方法使用了几乎相同的字段,这对我来说有点冗长。

service User {
    rpc Create (CreateUserRequest) returns (Reply) {}
    rpc Update (UpdateUserRequest) returns (Reply) {}
    rpc Delete (DeleteUserRequest) returns (Reply) {}
}

message CreateUserRequest {
    string username = 1;
    string password = 2;
}

message UpdateUserRequest {
    string username = 1;
    string password = 2;
    string email = 3;
    string gender = 4;
    string birthday = 5;
}

//...

1 个答案:

答案 0 :(得分:2)

通常,为每个RPC创建不同的消息,以允许您单独扩展它们。有一些例外,但是当方法执行不同的操作(创建,更新,删除)时,它是不可能的。

作为与您的情况类似的示例,请查看pubsub

rpc CreateSubscription(Subscription) returns (Subscription) {...}
rpc UpdateSubscription(UpdateSubscriptionRequest) returns (Subscription) {...}
rpc DeleteSubscription(DeleteSubscriptionRequest) returns (google.protobuf.Empty) {...}

我会注意到它使用google.protobuf.Empty,我通常不建议您使用CreateSubscriptionRequest,因为它会阻止进一步扩展。创建一个仅包含Subscription的{​​{1}}也没关系。我希望他们不会让REST API感觉更自然(那些google.api.http选项)。