我正在尝试在使用gRPC的工作中构建PoC。谷歌文档here带我们通过示例应用程序。我想知道protobuf-net,特别是protogen,是否有能力理解执行gRPC调用所需的服务定义和类?或者这是在做什么?如果我使用google的protoc进行客户端和服务器代码生成(涉及服务定义和RPC调用)和protobuf-net用于我的业务对象,它会起作用吗?
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>
(对于某些T
)输入参数(客户端流),返回类型(服务器流)或两者(双工),则会自动推断流/双工操作。
这是我喜欢的东西,但到目前为止,没有:我没有必要调查这个,它没有成为我的积压的顶部。我试着密切关注人们想要什么功能,所以很高兴知道你在追求它,但今天:不。大多数情况下这是一个时间问题 - protobuf-net从我的空闲/空闲时间开始,除非我有真正的理由在其上花费“工作时间”。
更新:我正在积极与正在开发gRPC for .NET的微软人员交谈,看起来我们可能会尝试在这里一起工作,以便通过.NET Core 3.0中的gRPC实现这一点时间刻度 - 意思是:我们共享服务调用代码的实现,但允许它与多个序列化器API一起使用。