我们正在构建一个新的平台,使用gRPC提供消息层,这将最终公开我们的API所支持的全部功能。
我们正在努力确定命名接口的最佳模式,以避免重复的消息类型,必须一次性处理边缘情况和
我们正在做的一个简单的例子涉及创建、更新和检索用户。下面是我们的服务今天的样子的一个例子:
service Users {
rpc GetUser(UserRequest) returns (core.user.User) {}
rpc ListUsers(google.protobuf.Empty) returns (ListUsersResponse) {}
rpc CreateUser(core.user.User) returns (core.user.User) {}
rpc UpdateUser(core.user.User) returns (core.user.User) {}
}
message UserRequest {
string id = 1;
}
message ListUsersResponse{
repeated core.user.User users = 1;
}GetUser非常简单--它接收一个ID的简单UserRequest消息,并返回一个用户(从我们的核心包--应用程序中的许多服务将用户消息作为输入,所以我们把它放在一个共享的位置)。
我的问题特别提到创建/更新用户调用,因为不清楚最优解决方案是什么。这两个函数略有不同,主要是在一种情况下,我们已经有了一个用户,因此有一个ID,而在另一种情况下,我们正在创建一个新用户。在Create中,我们可能只有用户可能存在的可用字段的子集,但理想情况下,我们只需要在一个地方维护这个列表,因为它可能会变得相当大。我们可以:
代码
message CreateUserRequest{
core.User user = 1;
}
message UpdateUserRequest{
int32 id = 1;
core.User user = 2;
}我很难在网上找到很多其他人是如何处理这些问题的例子。我提供的示例相当简单,但您可以想象,在整个项目中,我们都会遇到类似的问题。我想看到的是一个非常复杂的gRPC接口的例子,有人在实践中这样做过,或者仅仅是来自那些广泛使用它的人的反馈,以了解他们认为界面设计中哪些模式最有效。
谢谢!
发布于 2017-10-11 05:22:35
我想你要找的是谷歌网络API设计指南。看看命名公约。特别是该页上的“方法名称”部分。您将看到非常类似的例子,您正在尝试,这是非常常见的。
更具体的例子是,看看etcd是如何编写他们的API在这里的。类似于您的CreateUserRequest和UpdateUserRequest,etcd有MemberAddRequest和MemberUpdateRequest。
发布于 2019-12-18 06:09:57
您还可以查看UBER的在线设计文档,该文档为单独的响应实现提供了理由,并给出了详细的版本控制和命名约定
https://stackoverflow.com/questions/46673879
复制相似问题