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

How do you share gRPC proto definitions between services

我指定了一些独立的 gRPC 服务,它们都将托管在同一个服务器进程之外。每个服务都在其自己的 protobuf 文件中定义。然后这些 运行 通过 gRPC 工具给我目标语言(在我的例子中是 c#),然后我可以在其中实现我的服务器和客户端。

这些单独的 API 中的每一个都使用许多公共元素,例如错误响应枚举、Empty 消息类型(似乎在 gRPC WellKnownTypes; 但我看不出我是如何包含它的,所以我定义了自己的)。

目前,我最终将每个原型构建重复的枚举并将 类 构建到它们自己的命名空间中。虽然我知道我可以在一个通用的原型文件中共享定义并将其包含在内;我看不出如何将其中的一个代码生成到一个公共命名空间中。尽管这可行,但将其保留为一组会更整洁;如果执行诸如跨服务聚合错误之类的操作,则稍后在转换和等效性方面也可能会出现问题。

我想我遗漏了一些东西,因为我对诸如 WellKnownTypes 命名空间之类的东西的阅读表明这应该是可能的,但是,如前所述,我不明白我是如何做到的参考 Proto 中的内容。

目前 gRPC 似乎很轻松,所以我的搜索结果并不多,而且我是新手,所以有什么指示吗?

协议缓冲区通过使用不同的 package 标识符解决了这个问题。每条消息将被放置在不同的 Protocol buffer 特定包中,该包独立于 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 文件中,并从每个特定的其他原型文件中引用它们。