【问题标题】:Using ProtoBuf-net with gRPC将 ProtoBuf-net 与 gRPC 一起使用
【发布时间】:2019-08-03 05:46:50
【问题描述】:

我正在尝试在工作中构建一个利用 gRPC 的 PoC。 google 文档here 带我们浏览了一个示例应用程序。我想知道 protobuf-net,特别是 protogen,是否有能力理解执行 gRPC 调用所需的服务定义和类?或者这是正在做的事情?如果我使用 google 的 protoc 来生成客户端和服务器代码(这涉及到服务定义和 RPC 调用)并为我的业务对象使用 protobuf-net,它会起作用吗?

【问题讨论】:

  • 查看更新,注意

标签: protocol-buffers protobuf-net protogen


【解决方案1】:

protobuf-net.Grpc 现在是一个东西......虽然在预览中。当 .NET Core 3 出来时,我们应该能够提供它。

它受到 WCF 方法的启发,因此您的服务接口通过以下方式定义:

namespace Whatever {
    [ServiceContract]
    public interface IMyAmazingService {
        ValueTask<SearchResponse> SearchAsync(SearchRequest request);
        // ... etc
    }
}

服务器只是实现接口:

public class MyServer : IMyAmazingService {
    // ...
}

(托管它们的方式取决于您使用的是 ASP.NET Core,还是使用本机/非托管 gRPC 库;两者都有效)

而客户只是请求接口:

var client = http.CreateGrpcService<IMyAmazingService>();
var result = await client.SearchAsync(query);

在上述情况下,这将被推断为 gRPC 术语中的 Whatever.MyAmazingService / Search 服务,即

package Whatever;
// ...
service MyAmazingService {
    rpc Search (SearchRequest) returns (SearchResponse) {}
}

但如果您愿意,可以更明确地配置服务/方法名称。以上是一元示例;对于一元运算,结果可以是 TTask&lt;T&gt;ValueTask&lt;T&gt;void / Task / ValueTask 中的任何一个(它们都映射到 .google.protobuf.Empty,就像没有合适的方法一样输入参数)。

如果您将IAsyncEnumerable&lt;T&gt;(对于某些T)用于输入参数(客户端流)、返回类型(服务器流)或两者(双工),则会自动推断流/双工操作。

【讨论】:

  • 你是明星马克。 gRPC 绝对是前进的方向。很高兴这得到了爱和关注。
  • .net 框架也会支持它吗? (可能针对 .net 标准 2.x)
  • @barakcaf 到 .NET 4.6.1
【解决方案2】:

这是我很想解决的问题,但是迄今为止,不:我不需要研究这个,它还没有达到我积压的顶部.我试着密切关注人们想要什么功能,所以很高兴知道你在追求它,但今天:不。大多数情况下,这是一个时间问题 - protobuf-net 会在我的空闲/业余时间中取得进展,除非我有真正的理由将“工作时间”花在上面。


更新:我正在积极与正在为 .NET 开发 gRPC 的 Microsoft 人员交谈,我们似乎很可能会尝试在这里合作,以便在 . NET Core 3.0 时间尺度 - 意思是:我们将共享服务调用代码的实现,但允许它与多个序列化器 API 一起使用。

【讨论】:

  • 感谢您的快速回复。您是否预见到使用 protobuf-net 与 gRPC 的组合会遇到麻烦,通过使用 google 提供的工具来编写服务定义等并坚持使用 protobuf-net 来定义我的模型/业务对象?归根结底,它们都将成为 .NET 类,只是实现方式对于应用程序的不同部分会有所不同。
  • @Sai google API 基于 google 处理 protobuf 对象的方法;我期望 protobuf-net 类型与 gRPC API 的 google 实现一起使用。
猜你喜欢
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2023-03-22
  • 2020-07-12
  • 2021-08-07
相关资源
最近更新 更多