我正在尝试在工作中构建一个利用 gRPC 的 PoC。此处的 google 文档将带我们浏览一个示例应用程序。我想知道 protobuf-net,特别是 protogen,是否有能力理解执行 gRPC 调用所需的服务定义和类?或者这是正在做的事情?如果我使用 google 的 protoc 来生成客户端和服务器代码(涉及服务定义和 RPC 调用)并为我的业务对象使用 protobuf-net,它会起作用吗?
2 回答
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) {}
}
但如果您愿意,可以更明确地配置服务/方法名称。以上是一元示例;对于一元运算,结果可以是T
、Task<T>
、ValueTask<T>
- 或void
//Task
中的任何一个ValueTask
(它们都映射到.google.protobuf.Empty
,就像没有合适输入参数的方法一样)。
IAsyncEnumerable<T>
如果您将(for some T
) 用于输入参数 (client-streaming)、返回类型 (server-streaming) 或两者 (duplex),则会自动推断流/双工操作。
这是我很想解决的问题,但到目前为止,不:我不需要研究这个,它也没有达到我的积压的顶部。我试着密切关注人们想要什么功能,所以很高兴知道你在追求它,但今天:不。大多数情况下,这是一个时间问题——protobuf-net 是在我的空闲/业余时间中取得进展的,除非我有真正的理由在上面花费“工作时间”。
更新:我正在积极与正在为 .NET 开发 gRPC 的 Microsoft 人员交谈,我们似乎可能会尝试在这里合作,以便通过 .NET Core 3.0 中的 gRPC 实现这一点timescale - 意思是:我们将共享服务调用代码的实现,但允许它与多个序列化器 API 一起工作。