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

Should I create a message per method or use a shared message in gRPC?

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

我是否应该创建一个 shared 请求消息(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;
}

//...

通常,为每个 RPC 创建不同的消息,以允许您单独扩展它们。有例外,但当方法做不同的事情(创建、更新、删除)时不太可能。

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

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

我会注意到它使用 google.protobuf.Empty,我通常不建议将其用于您自己的服务,因为它会阻止进一步扩展。创建一个只包含 SubscriptionCreateSubscriptionRequest 也很好。我希望他们不会让 REST API 感觉更自然(那些 google.api.http 选项)。