我应该为每个方法创建一条消息还是在 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
,我通常不建议将其用于您自己的服务,因为它会阻止进一步扩展。创建一个只包含 Subscription
的 CreateSubscriptionRequest
也很好。我希望他们不会让 REST API 感觉更自然(那些 google.api.http
选项)。
目前我正在使用 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
,我通常不建议将其用于您自己的服务,因为它会阻止进一步扩展。创建一个只包含 Subscription
的 CreateSubscriptionRequest
也很好。我希望他们不会让 REST API 感觉更自然(那些 google.api.http
选项)。