当前位置: 首页 > 知识库问答 >
问题:

我可以将gRPC proto定义合成多个proto文件吗?

邓光赫
2023-03-14

我有这样一个gRPC API定义(来自Akka docs示例),但要长得多(4000行,仅是服务部分)。

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协议定义中以某种方式“组合”服务?

共有1个答案

计和顺
2023-03-14

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

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

您最多只能将消息定义移动到单独的文件中,然后使用正常的导入机制。由于将消息移动到另一个文件可能会导致生成的代码中的API不兼容,因此可以改用“导入公共”路径/to/messages.proto“。

 类似资料:
  • 问题内容: 我有多个JAR文件,必须将其添加到Eclipse中的classpath中。 是否可以将30个文件合并为一个文件并包含该文件? 问题答案: 您可能想看看jarjar。 如果您使用Ant任务,也可以进行以下操作:

  • 这篇文章描述了原始文件中编号标签的用途,在序列化和反序列化数据时基本上匹配字段。我的问题是:如果我更改现有字段的编号会发生什么? 举同样的例子,假设这是原始数据 我想添加一个新字段,在分页字段之前添加这个字段在逻辑上是有意义的-如果我还没有使用

  • 我正在使用由Visual Studio生成的gRPC服务项目。我有两个原型文件位于同一个“原型”目录中。我有一个原型,另一个原型文件有导入。它似乎找到了文件,但我无法引用来自另一个文件的任何消息。当我这样做时,我得到一个“blahblah”是未定义的错误。我已经拍摄了一些情况的屏幕截图。任何帮助都将不胜感激!

  • 如何为一个包含两个(或更多)python包的项目定义和组织gRPC原型文件? 假设我有以下monorepo结构: 我想使用gRPC将这两个服务连接在一起。我可以添加一个目录,其中包含适当的子目录,如下所示: 这是可行的:我可以生成。py文件正确,具有正确的导入语句。这种方法的问题是,我必须复制我的客户机中的所有内容。proto进入my\u服务器。协议。如果需要进行更改,则必须在两个文件中都进行更改

  • 我需要在一个应用程序中为同一个API使用springdocs定义两个不同的OpenApi定义:一个用于内部开发人员,一个用于外部开发人员。外部定义将包括内部定义中的一些操作,但不是所有操作。 我已经考虑过使用GroupedOpenApi创建这两个定义,但这需要我将应该从外部定义中排除的endpoint移动到单独的RestController中,并移动到排除的包中,该包不会包含在外部开发人员的定义中