如何在服务之间共享gRPC原型定义

时间:2016-11-16 12:06:44

标签: c# protocol-buffers protobuf-net grpc

我正在指定一些独立的 gRPC 服务,这些服务都将在同一服务器进程中托管。每个服务都在自己的protobuf文件中定义。然后通过 gRPC 工具运行这些工具,为我提供目标语言(在我的情况下为c#),然后我可以在其中实现我的服务器和客户端。

每个单独的API都使用了许多常见元素,例如错误响应枚举, Empty 消息类型(似乎可以在 gRPC WellKnownTypes ;但是我无法看到我是如何包含它的,所以我定义了自己的。)

目前,我最终将每个proto构建重复的枚举和类放入他们自己的命名空间。虽然我知道我可以在一个共同的原型文件中共享这些定义并包含它;我不知道如何只将这些代码生成一个共同的命名空间。虽然这是有效的,但将它保持在一组是最整洁的;如果在服务中聚合错误等事情,它在转换和等效性方面也可能会出现问题。

我认为我遗漏了一些内容,因为我对 WellKnownTypes 命名空间等内容的阅读表明这应该是可行的,但如前所述,我不知道我是如何在Proto要么。

目前在 gRPC 上看起来很轻松,所以我的搜索量并没有太大,我是新手,所以任何指针?

1 个答案:

答案 0 :(得分:9)

协议缓冲区通过使用不同的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文件中,并从每个特定的其他原型文件中引用它们。