首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gRPC接口设计建议-处理创建和更新的正确样式

gRPC接口设计建议-处理创建和更新的正确样式
EN

Stack Overflow用户
提问于 2017-10-10 18:49:07
回答 2查看 1.5K关注 0票数 3

我们正在构建一个新的平台,使用gRPC提供消息层,这将最终公开我们的API所支持的全部功能。

我们正在努力确定命名接口的最佳模式,以避免重复的消息类型,必须一次性处理边缘情况和

我们正在做的一个简单的例子涉及创建、更新和检索用户。下面是我们的服务今天的样子的一个例子:

代码语言:javascript
运行
复制
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中,我们可能只有用户可能存在的可用字段的子集,但理想情况下,我们只需要在一个地方维护这个列表,因为它可能会变得相当大。我们可以:

  • 对于每个调用,定义一个自定义请求/响应消息,并在其中嵌入任何公共消息。这看起来有点像下面的代码。我担心的是,我们最终的结果是每个调用都有一个消息类型,从可维护性的角度来看,这可能会变得非常繁重。

代码

代码语言:javascript
运行
复制
message CreateUserRequest{ 
  core.User user = 1;
}
message UpdateUserRequest{
  int32 id = 1;
  core.User user = 2;
}
  • 我们可以期望/发送公共消息类型,并依赖评论或其他反馈机制来鼓励消费者传递正确的值(我最初的实现演示了什么)。我对这种方法的关注是,我们最终不得不添加大量的验证,以确保它们提供的字段是“正确的”。

我很难在网上找到很多其他人是如何处理这些问题的例子。我提供的示例相当简单,但您可以想象,在整个项目中,我们都会遇到类似的问题。我想看到的是一个非常复杂的gRPC接口的例子,有人在实践中这样做过,或者仅仅是来自那些广泛使用它的人的反馈,以了解他们认为界面设计中哪些模式最有效。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-11 05:22:35

我想你要找的是谷歌网络API设计指南。看看命名公约。特别是该页上的“方法名称”部分。您将看到非常类似的例子,您正在尝试,这是非常常见的。

更具体的例子是,看看etcd是如何编写他们的API在这里的。类似于您的CreateUserRequestUpdateUserRequestetcdMemberAddRequestMemberUpdateRequest

票数 4
EN

Stack Overflow用户

发布于 2019-12-18 06:09:57

您还可以查看UBER的在线设计文档,该文档为单独的响应实现提供了理由,并给出了详细的版本控制和命名约定

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46673879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档