2016-11-16 17 views
3

我指定了几个独立的gRPC服务将全部托管在同一个服务器进程之外。每个服务都在其自己的protobuf文件中定义。然后,这些工具通过gRPC工具运行,给我目标语言(在我的情况下是c#),然后我可以实现我的服务器和客户端。你如何分享服务之间的gRPC原型定义

每个这些不同的API使用许多通用元素,诸如错误响应枚举,所述消息类型(这似乎是,可以在GRPCWellKnownTypes;但我不知道怎样包括那要么我定义了我自己的)。

目前,我最终将每个proto构建重复枚举和类到自己的名称空间中。虽然我知道我可以在一个共同的原始文件中分享这些定义,并且包含这些定义;我不知道如何最终只将这些代码生成一个通用的命名空间。虽然这样做有效,但将它保留到一套更合适;如果采取诸如在服务之间汇总错误之类的方式,它在转换和等效性方面可能也会遇到问题。

我以为我失去了一些东西是我的东西,如WellKnownTypes命名认为,这应该是可能的,但读书,正如前面提到的,我不看我怎么指的是在原无论是。

SO在目前看起来非常轻巧gRPC目前所以我的搜索没有太多的发现,而我对这个新手这么有指针?

+0

https://developers.google.com/protocol-buffers/docs/proto#other可能是你的事情。 – weismat

回答

4

协议缓冲区通过使用不同的package标识符来解决此问题。每条消息都将放置在不同的协议缓冲区特定包中,该包与C#名称空间无关。例如:

// common.proto 
syntax "proto3"; 
package my.api.common; 

option csharp_namespace = "My.Api.Common"; 

message Shared { 
    // ... 
} 

然后在服务特定的文件:

// service1.proto 
syntax "proto3"; 
package my.api.service1; 

import "common.proto"; 

option csharp_namespace = "My.Api.Service1"; 

message Special { 
    my.api.common.Shared shared = 1; 
} 

你需要确保只有一个共同的原副本,否则他们可能会不同步。您可以将常见消息放入common.proto文件中,并从每个特定的其他原始文件中引用它们。

+0

我太sooooo对不起,我花了这么长时间才回到验证这一点。被拖到另一个任务。 – Wizbit