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

Wiz*_*bit 8 c# protocol-buffers protobuf-net grpc

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

每个这些不同的API使用一些共同的元素,诸如错误响应枚举,该消息类型(这似乎是在可用GRPC WellKnownTypes ;但我不能看我怎么有,要么让我定义我自己).

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

我假设我遗漏了一些东西,因为我对WellKnownTypes命名空间这样的东西的阅读表明这应该是可能的,但如前所述,我也没有看到我在Proto中如何引用它.

因此目前在gRPC上似乎相当轻松,所以我的搜索量不会太多,我是新手,所以任何指针?

Car*_*elo 13

协议缓冲区通过使用不同的package标识符来解决此问题.每条消息都将放在一个不同的协议缓冲区特定包中,该包独立于C#命名空间.例如:

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

option csharp_namespace = "My.Api.Common";

message Shared {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

然后在服务特定文件中:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

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