gRPC服务器和客户端应该位于同一存储库中吗?

时间:2019-12-22 13:35:55

标签: go protocol-buffers grpc proto grpc-go

我正在使用Go来玩gRPC服务器, 我了解gRPC / Protobuf的优点之一是,您可以使用服务器代码中使用的相同消息/服务API,使用它轻松地创建客户端库。

如果我要为我的服务实现一个客户端库,则显然需要导入服务代码和API,因此最终我将拥有一个服务,一个服务器和一个客户端组件。在生产级代码中-所有这些组件都应该存在于同一个存储库中并且仅由go包分隔吗?该服务是否应该是自己的存储库,并作为希望为该服务实现服务器/客户端库的任何人的依赖项?

2 个答案:

答案 0 :(得分:1)

  

所有这些组件都应该存在于同一存储库中并   只被go包分开了吗?

各种gRPC组件不需要全部都存在于同一存储库中。

  

该服务应该是其自己的存储库,并应作为对   是否有人希望为该服务实现服务器/客户端库?

我使用以下回购组织:

  • myapp-proto(常见回购;由客户端和 服务器)
  • myapp-client
  • myapp-service1
  • myapp-service2
  • myapp-service3

例如,一些gRPC服务从各种数据源(REST API,MySQL,LDAP等)中提取数据-这些服务器gRPC服务中的每一个都位于各自的存储库中。有一个gRPC客户端程序包也位于其自己的存储库中。为了保持变更控制的健全性,常见的proto定义(以及生成的go代码)位于单独的单个存储库中。

以上设置利用git version tagginggo modules来确保客户端和所有服务器都使用gRPC消息/服务的兼容版本。向gRPC proto添加方法/字段可以独立于客户端/服务器部分进行-并在成熟时逐步使用。

答案 1 :(得分:0)

以我的经验,最有效的方法是将原型定义和生成的文件保留在服务器中。我通常将它们放在{SERVER}/pkg/grpc中,然后将它们导入客户端{CLIENT}/internal/services/{SERVER}/grpc或类似的对象中,具体取决于您的项目结构。