我正在使用Grpc进行一些测试,我意识到存在两种类型的渠道,但是我不知道两者之间的区别。
但是当我使用证书时,可以使用Grpc.Net.Client.GrpcChannel设置证书,但会收到一个错误,指出DNS无法解决。如果我使用Grpc.Core.Channel,则可以调用该服务,但是由于证书的原因,我会收到一个错误,错误是-在仅HTTP / 2的终结点上未协商TLS上的HTTP / 2。
两个频道之间有什么区别?
谢谢。
答案 0 :(得分:5)
Grpc.Core.Channel基于C核心库,该库构成了它支持的所有语言变体(C ++,C#,PHP,Objective-C,Python,Ruby等)的基本代码库
Grpc.Net.Client.GrpcChannel是使用熟悉的HttpClient对象为.NET Core构建的,该对象现在支持Http / 2。
grpc-dotnet的首页指出:
针对.NET的GRPC不会替代针对C#的gRPC(通过本机实现的gRPC C#API C核心二进制文件)。这些实现共存并共享许多 避免锁定的相同API。目前没有计划 实施以替代另一种。 用于C#的gRPC是 gRPC for .NET不提供的框架的推荐解决方案 支持,例如.NET Framework。
在检查Grpc.Net.Client.GrpcChannel的代码时,您会看到一个内部Httpclient 对象用于进行异步调用和取消挂起的请求。
Grpc.Core.Channel的代码似乎将其调用委托给本地生成的grpc代码。这是我在有限的时间内可以花的时间。
有趣的是,在Net.Client.GrpcChannel的ssl验证部分中,它实际上声明在异常消息中使用HttpClient。
if (!string.IsNullOrEmpty(rootCertificates) ||
keyCertificatePair != null ||
verifyPeerCallback != null)
{
throw new InvalidOperationException(
$"{nameof(SslCredentials)} with non-null arguments is not supported by {nameof(GrpcChannel)}. " +
$"{nameof(GrpcChannel)} uses HttpClient to make gRPC calls and HttpClient automatically loads root certificates from the operating system certificate store. " +
$"Client certificates should be configured on HttpClient. See https://aka.ms/AA6we64 for details.");
}