我可以将gRPC原型定义组成多个原型文件吗?

时间:2019-05-03 06:53:18

标签: protocol-buffers grpc

我有一个这样的gRPC API定义(来自Akka docs示例),但更长(仅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) {} } 部分有4000行)。

// 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
}

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

Froala editor

是否可以通过某种方式在gRPC原型定义中“组合”服务?

1 个答案:

答案 0 :(得分:0)

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

但是既然您已经已经有了这样的服务,您将如何处理?您不能将service定义拆分为多个文件。而且,如果您将服务定义分为多个新服务,这将破坏gRPC的线路兼容性。

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