.NET Core 中的 gRPC 客户端工厂集成gRPC client factory integration in .NET Core

本文内容

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

工厂具有以下优势:

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

注册 gRPC 客户端Register gRPC clients

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

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

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

  1. public class AggregatorService : Aggregator.AggregatorBase
  2. {
  3. private readonly Greeter.GreeterClient _client;
  4. public AggregatorService(Greeter.GreeterClient client)
  5. {
  6. _client = client;
  7. }
  8. public override async Task SayHellos(HelloRequest request,
  9. IServerStreamWriter<HelloReply> responseStream, ServerCallContext context)
  10. {
  11. // Forward the call on to the greeter service
  12. using (var call = _client.SayHellos(request))
  13. {
  14. await foreach (var response in call.ResponseStream.ReadAllAsync())
  15. {
  16. await responseStream.WriteAsync(response);
  17. }
  18. }
  19. }
  20. }

配置 HttpClientConfigure HttpClient

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

  1. services
  2. .AddGrpcClient<Greeter.GreeterClient>(o =>
  3. {
  4. o.Address = new Uri("https://localhost:5001");
  5. })
  6. .ConfigurePrimaryHttpMessageHandler(() =>
  7. {
  8. var handler = new HttpClientHandler();
  9. handler.ClientCertificates.Add(LoadCertificate());
  10. return handler;
  11. });

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

配置通道和侦听器Configure Channel and Interceptors

特定于 gRPC 的方法可用于:

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

截止时间和取消传播Deadline and cancellation propagation

可以使用 EnableCallContextPropagation() 对 gRPC 服务中工厂所创建的 gRPC 客户端进行配置,以自动将截止时间和取消令牌传播到子调用。Grpc.AspNetCore.Server.ClientFactory NuGet 包中提供了 EnableCallContextPropagation() 扩展方法。

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

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

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

其他资源Additional resources