关注小程序 找一找教程网-随时随地学编程

gRPC客户端工厂集成

.NET Core 中的 gRPC 客户端工厂集成

gRPC 与 HttpClientFactory 的集成提供了一种集中式方式来创建 gRPC 客户端。 它可用作配置独立 gRPC 客户端实例的替代方法。 工厂集成在Grpc ClientFactory NuGet 包中提供。

工厂具有以下优势:

  • 提供用于配置逻辑 gRPC 客户端实例的中心位置
  • 管理基础 HttpClientMessageHandler 的生存期
  • 在 ASP.NET Core gRPC 服务中自动传播截止时间和取消

注册 gRPC 客户端

若要注册 gRPC 客户端,可在 Startup.ConfigureServices中使用泛型 AddGrpcClient 扩展方法,并指定 gRPC 类型化客户端类和服务地址:

services.AddGrpcClient<Greeter.GreeterClient>(o =>
{
    o.Address = new Uri("https://localhost:5001");
});

GRPC 客户端类型被注册为具有依赖关系注入(DI)的暂时性。 现在可以在 DI 创建的类型中直接注入和使用客户端。 ASP.NET Core MVC 控制器,SignalR 中心和 gRPC 服务是可以自动注入 gRPC 客户端的位置:

public class AggregatorService : Aggregator.AggregatorBase
{
    private readonly Greeter.GreeterClient _client;

    public AggregatorService(Greeter.GreeterClient client)
    {
        _client = client;
    }

    public override async Task SayHellos(HelloRequest request,
        IServerStreamWriter<HelloReply> responseStream, ServerCallContext context)
    {
        // Forward the call on to the greeter service
        using (var call = _client.SayHellos(request))
        {
            await foreach (var response in call.ResponseStream.ReadAllAsync())
            {
                await responseStream.WriteAsync(response);
            }
        }
    }
}

配置 HttpClient

HttpClientFactory 创建 gRPC 客户端使用的 HttpClient 标准 HttpClientFactory 方法可用于添加传出请求中间件或配置 HttpClient的基础 HttpClientHandler

services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        var handler = new HttpClientHandler();
        handler.ClientCertificates.Add(LoadCertificate());
        return handler;
    });

有关详细信息,请参阅使用 IHttpClientFactory 发出 HTTP 请求

配置通道和侦听器

特定于 gRPC 的方法可用于:

  • 配置 gRPC 客户端的基础通道。
  • 添加客户端在进行 gRPC 调用时将使用的 Interceptor 实例。
services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .AddInterceptor(() => new LoggingInterceptor())
    .ConfigureChannel(o =>
    {
        o.Credentials = new CustomCredentials();
    });

截止时间和取消传播

可以使用 EnableCallContextPropagation() 将 gRPC 服务中工厂创建的 gRPC 客户端配置为自动将截止时间和取消标记传播到子调用。 EnableCallContextPropagation() 扩展方法在ClientFactory NuGet 包中提供。

调用上下文传播的工作方式是从当前 gRPC 请求上下文中读取截止时间和取消标记,并自动将其传播到 gRPC 客户端发出的传出调用。 调用上下文传播是确保复杂的嵌套 gRPC 方案始终传播截止时间和取消的极佳方式。

services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .EnableCallContextPropagation();

有关截止时间和 RPC 取消的详细信息,请参阅rpc 生命周期

其他资源