在多个 Grpc 客户端中重用 HttpMessageHandler

问题描述 投票:0回答:1

我有多个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 就像上面的例子一样?这里有什么权衡?

c# asp.net-core httpclient grpc-c#
1个回答
0
投票

根据此文档https://learn.microsoft.com/en-us/aspnet/core/grpc/performance?view=aspnetcore-8.0#reuse-grpc-channels

进行 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));
© www.soinside.com 2019 - 2024. All rights reserved.