将 ProtoBuf-net 与 gRPC 结合使用

Using ProtoBuf-net with gRPC

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

这是我很想解决的问题,但是迄今为止,不:我不需要研究这个,它也没有成功我积压的顶部。我试着关注人们想要什么功能,所以很高兴知道你在追求它,但今天:没有。大多数情况下,这是一个时间问题——protobuf-net 从我的 free/spare 时间中取得进展,除非我有真正的理由在它上面花费 "work time"。


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

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 还是 native/unmanaged 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) {}
}

但如果您愿意,可以更明确地配置 service/method 名称。以上是一个一元的例子;对于一元运算,结果可以是 TTask<T>ValueTask<T> - 或 void / Task / ValueTask 中的任何一个(所有映射.google.protobuf.Empty,就像没有合适输入参数的方法一样。

如果您使用 IAsyncEnumerable<T>(对于某些 T)作为输入参数 (client-streaming),则 streaming/duplex 操作会自动推断,return类型 (server-streaming),或两者(双面)。