【问题标题】:Can I compose gRPC proto definitions to multiple proto files?我可以将 gRPC 原型定义组合成多个原型文件吗?
【发布时间】:2019-09-21 16:42:54
【问题描述】:

我有一个像这样的 gRPC API 定义(来自 Akka 文档示例),但要长得多(4000 行只是 service 部分)。

service GreeterService {
    rpc SayHello (HelloRequest) returns (HelloReply) {}

    rpc ItKeepsTalking (stream HelloRequest) returns (HelloReply) {}

    rpc ItKeepsReplying (HelloRequest) returns (stream HelloReply) {}

    rpc StreamHellos (stream HelloRequest) returns (stream HelloReply) {}
}

但是,RPC 列表现在变得太长了,我想以某种方式将其“分解”为多个文件,因此该文件更具可读性。像这样的

// file 1:
service GreeterServicePartA {
    rpc SayHello (HelloRequest) returns (HelloReply) {}

    rpc ItKeepsTalking (stream HelloRequest) returns (HelloReply) {}
}

// file 2:
service GreeterServicePartB {
    rpc ItKeepsReplying (HelloRequest) returns (stream HelloReply) {}

    rpc StreamHellos (stream HelloRequest) returns (stream HelloReply) {}
}

// main proto file:
import "file1"
import "file2"
service GreeterService = GreeterServicePartA + GreeterServicePartB

即使只是在不同的文件中分别定义 RPC,然后编写这样的内容也会对我有所帮助:

service GreeterService {
    rpc SayHello = importedSayHello

    rpc ItKeepsTalking = importedKeepsTalking

    rpc ItKeepsReplying = importedKeepsReplying

    rpc StreamHellos = importedStreamHellos
}

是否可以像这样在 gRPC 原型定义中“组合”服务?

【问题讨论】:

    标签: protocol-buffers grpc


    【解决方案1】:

    你不应该有这么大的服务。如果它已经增长到 4000 行,这听起来像是所有方法的垃圾场。我希望其中大部分是文档...通常我希望有更多基于更大 API 子集的服务。例如,假设我有 MyAndroidAppService,它可以成为垃圾场。但我本可以将其设计为 MyAndroidAppConfigService、MyAndroidAppNotificationService、MyAndroidAppChatService(假设一个非常复杂的应用程序具有 很多 方法)。

    但既然您已经拥有这样的服务,那么您能做些什么呢?您不能将service 定义拆分为多个文件。如果您将服务定义拆分为多个新服务,则会破坏 gRPC 的线路兼容性。

    您最多可以将message 定义移动到一个单独的文件中,然后使用普通的import mechanism。由于将消息移动到不同的文件会导致生成的代码中的 API 不兼容,因此您可以改用 import public "path/to/messages.proto"

    【讨论】:

    • 嗨,Eric,定义自己的服务的最佳方式是什么。如果我处于基本 CRUD 样式 API 的规划阶段,但我有几个元素,例如:电影、书籍、音频。您会将这三个定义为单独的服务吗? service MovieService {Create, Get, List, Delete...etc}。还有一个问题,你在哪里定义消息之间的关系?例如,如果一本书有电影改编,有没有办法在消息中但在单独的服务(文件)中创建关系?
    • 是的,电影、书籍、音频将是单独的服务。这种关系很容易只是命名+文档(“字符串 book_id”)。您可以通过在 Book 的一条消息中添加一个字段来包含一些内联信息,但引用通常只是整数 id 或字符串。您可能会发现 cloud.google.com/apis/design 有用,它讨论了制作 REST API,您可能感兴趣也可能不感兴趣。 REST 风格意味着您对 ID 使用 URI 和命名空间,而不是仅使用裸整数和不透明字符串。
    • 欣赏答案,很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-09-13
    • 2021-12-24
    • 1970-01-01
    • 2016-11-20
    • 2016-10-06
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多