我有多个Grpc客户端,每个客户端都需要打包一个客户端证书。我正在使用 Grpc.Net.ClientFactory 来注册我的所有客户端。
不明白应该如何重用 HttpMessageHandler,我担心为每个注册为 Microsoft 的 Grpc 客户端创建一个新的 HttpMessageHandler docs 表明
每个处理程序通常管理其自己的底层 HTTP 连接;创建过多的处理程序可能会导致连接延迟
// register serviceAClient
builder.Services.AddGrpcClient<ServiceA.ServiceAClient>(o => o.Address = new Uri(serviceUrl))
.ConfigureChannel(o => o.HttpHandler = GetHttpHandler(certThumbprint));
// register serviceBClient
builder.Services.AddGrpcClient<ServiceB.ServiceBClient>(o => o.Address = new Uri(serviceUrl))
.ConfigureChannel(o => o.HttpHandler = GetHttpHandler(certThumbprint));
// creates a new HttpMessageHandler
private static HttpMessageHandler GetHttpHandler(string certThumbprint)
{
var httpHandler = new SocketsHttpHandler()
{
PooledConnectionIdleTimeout = Timeout.InfiniteTimeSpan,
KeepAlivePingDelay = TimeSpan.FromSeconds(60),
KeepAlivePingTimeout = TimeSpan.FromSeconds(30),
EnableMultipleHttp2Connections = true,
SslOptions = new SslClientAuthenticationOptions
{
ClientCertificates = LoadClientCertificates(certThumbprint)
};
return httpHandler;
}
在多个 Grpc 客户端场景中处理 HttpMessageHandler 的更好方法是什么 - 每个客户端都应该注册一个 HttpMessageHandler 吗?或者每个客户端都应该有自己的 HttpMessageHandler 就像上面的例子一样?这里有什么权衡?
进行 gRPC 调用时应重用 gRPC 通道。重用通道允许通过现有 HTTP/2 连接进行多路复用调用。
一个通道可以创建多个 gRPC 客户端,包括不同类型的客户端。
最好为多个客户端重复使用相同的通道。
var channel = GrpcChannel.ForAddress(new Uri(serviceUrl), new GrpcChannelOptions
{
HttpHandler = new SocketsHttpHandler
{
SslOptions = new SslClientAuthenticationOptions
{
ClientCertificates = LoadClientCertificates(certThumbprint)
},
...
}
});
builder.Services.AddGrpcClient<ServiceA.ServiceAClient>(o => new ServiceA.ServiceAClient(channel));
builder.Services.AddGrpcClient<ServiceB.ServiceBClient>(o => new ServiceB.ServiceBClient(channel));