Integrace objektu pro vytváření klienta gRPC v .NET

Autor: James Newton-King

Integrace gRPC s HttpClientFactory nabídkou centralizovaného způsobu vytváření klientů gRPC. Dá se použít jako alternativa ke konfiguraci samostatných instancí klienta gRPC. Integrace továrny je k dispozici v balíčku NuGet Grpc.Net.ClientFactory .

Továrna nabízí následující výhody:

  • Poskytuje centrální umístění pro konfiguraci logických instancí klienta gRPC.
  • Spravuje životnost podkladového HttpClientMessageHandlerobjektu .
  • Automatické šíření termínu a zrušení ve službě ASP.NET Core gRPC.

Registrace klientů gRPC

Chcete-li zaregistrovat klienta gRPC, lze obecnou AddGrpcClient metodu rozšíření použít v instanci vstupního WebApplicationBuilder bodu aplikace v Program.cs, určení třídy klienta a adresy služby typu gRPC:

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

Typ klienta gRPC je registrován jako přechodný pomocí injektáže závislostí (DI). Klient se teď dá vloženého a spotřebovávat přímo v typech vytvořených pomocí DI. ASP.NET řadičů Core MVC, rozbočovačů a služeb gRPC jsou místa, SignalR kde je možné klienty gRPC automaticky vloženého:

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);
            }
        }
    }
}

Konfigurace obslužné rutiny Http

HttpClientFactoryHttpMessageHandler vytvoří použitou klientem gRPC. Standardní HttpClientFactory metody lze použít k přidání middlewaru odchozích požadavků nebo ke konfiguraci podkladového HttpClientpříkazuHttpClientHandler:

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

Další informace najdete v tématu Vytváření požadavků HTTP pomocí IHttpClientFactory.

Konfigurace průsečíků

Průsečíky gRPC je možné přidat do klientů pomocí AddInterceptor metody.

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

Předchozí kód:

  • Zaregistruje GreeterClient typ.
  • Nakonfiguruje LoggingInterceptor pro tohoto klienta. LoggingInterceptor se vytvoří jednou a sdílí se mezi GreeterClient instancemi.

Ve výchozím nastavení se průsečík vytvoří jednou a sdílí se mezi klienty. Toto chování lze přepsat zadáním oboru při registraci průsečíku. Klientská továrna lze nakonfigurovat tak, aby pro každého klienta vytvořila nový průsečík zadáním InterceptorScope.Client.

builder.Services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .AddInterceptor<LoggingInterceptor>(InterceptorScope.Client);

Vytváření průsečíků s vymezeným oborem klienta je užitečné, když průsečík vyžaduje omezené nebo přechodné služby s vymezeným oborem z DI.

Přihlašovací údaje zachytávání gRPC nebo kanálu se dají použít k odesílání Authorization metadat s každou žádostí. Další informace o konfiguraci ověřování najdete v tématu Odeslání nosný token pomocí klientské továrny gRPC.

Konfigurace kanálu

Další konfiguraci lze použít na kanál pomocí ConfigureChannel této metody:

builder.Services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .ConfigureChannel(o =>
    {
        o.Credentials = new CustomCredentials();
    });

ConfigureChannel je předána GrpcChannelOptions instance. Další informace najdete v tématu Konfigurace možností klienta.

Poznámka

Některé vlastnosti jsou nastavené GrpcChannelOptions před spuštěním zpětného ConfigureChannel volání:

Tyto hodnoty lze přepsat .ConfigureChannel

Přihlašovací údaje volání

Ověřovací hlavičku lze přidat do volání gRPC pomocí AddCallCredentials metody:

builder.Services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .AddCallCredentials((context, metadata) =>
    {
        if (!string.IsNullOrEmpty(_token))
        {
            metadata.Add("Authorization", $"Bearer {_token}");
        }
        return Task.CompletedTask;
    });

Další informace o konfiguraci přihlašovacích údajů volání najdete v tématu Nosný token s klientskou továrnou gRPC.

Konečný termín a šíření zrušení

Klienti gRPC vytvořená továrnou ve službě gRPC je možné nakonfigurovat tak EnableCallContextPropagation() , aby automaticky rozšířili konečný termín a token zrušení do podřízených volání. Metoda EnableCallContextPropagation() rozšíření je k dispozici v balíčku NuGet Grpc.AspNetCore.Server.ClientFactory .

Šíření kontextu volání funguje tak, že čte konečný termín a token zrušení z aktuálního kontextu požadavku gRPC a automaticky je rozšíří do odchozích volání provedených klientem gRPC. Šíření kontextu volání je vynikající způsob, jak zajistit, aby složité a vnořené scénáře gRPC vždy šířily termín a zrušení.

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

Ve výchozím nastavení vyvolá chybu, EnableCallContextPropagation pokud se klient používá mimo kontext volání gRPC. Tato chyba je navržená tak, aby vás upozornila, že neexistuje kontext volání, který se má rozšířit. Pokud chcete použít klienta mimo kontext volání, potlačit chybu, pokud je klient nakonfigurován pomocí SuppressContextNotFoundErrors:

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

Další informace o termínech a zrušení RPC najdete v tématu Spolehlivé služby gRPC s termíny a zrušením.

Pojmenovaní klienti

Typ klienta gRPC se obvykle zaregistruje jednou a pak se vloží přímo do konstruktoru typu pomocí DI. Existují však scénáře, ve kterých je užitečné mít více konfigurací pro jednoho klienta. Například klient, který provádí volání gRPC s ověřováním i bez ověřování.

Více klientů se stejným typem je možné zaregistrovat tak, že každému klientovi poskytnete název. Každý pojmenovaný klient může mít vlastní konfiguraci. AddGrpcClient Obecná rozšiřující metoda má přetížení, které zahrnuje parametr name:

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

builder.Services
    .AddGrpcClient<Greeter.GreeterClient>("GreeterAuthenticated", o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .ConfigureChannel(o =>
    {
        o.Credentials = new CustomCredentials();
    });

Předchozí kód:

  • Zaregistruje GreeterClient typ dvakrát a zadá jedinečný název pro každý z nich.
  • Konfiguruje různá nastavení pro každého pojmenovaného klienta. Registrace GreeterAuthenticated přidá přihlašovací údaje do kanálu, aby se ověřila volání gRPC.

Pojmenovaný klient gRPC se vytvoří v kódu aplikace pomocí GrpcClientFactory. Typ a název požadovaného klienta se zadává pomocí obecné GrpcClientFactory.CreateClient metody:

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

    public AggregatorService(GrpcClientFactory grpcClientFactory)
    {
        _client = grpcClientFactory.CreateClient<Greeter.GreeterClient>("GreeterAuthenticated");
    }
}

Další prostředky

Integrace gRPC s HttpClientFactory nabídkou centralizovaného způsobu vytváření klientů gRPC. Dá se použít jako alternativa ke konfiguraci samostatných instancí klienta gRPC. Integrace továrny je k dispozici v balíčku NuGet Grpc.Net.ClientFactory .

Továrna nabízí následující výhody:

  • Poskytuje centrální umístění pro konfiguraci logických instancí klienta gRPC.
  • Spravuje životnost podkladového objektu. HttpClientMessageHandler
  • Automatické šíření termínu a zrušení ve službě ASP.NET Core gRPC

Registrace klientů gRPC

Chcete-li zaregistrovat klienta gRPC, lze použít obecnou AddGrpcClient metodu rozšíření v rámci Startup.ConfigureServices, určení třídy klienta a adresy služby typu gRPC:

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

Typ klienta gRPC je registrován jako přechodný pomocí injektáže závislostí (DI). Klient se teď dá vloženého a spotřebovávat přímo v typech vytvořených pomocí DI. ASP.NET řadičů Core MVC, rozbočovačů a služeb gRPC jsou místa, SignalR kde je možné klienty gRPC automaticky vloženého:

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);
            }
        }
    }
}

Konfigurace obslužné rutiny Http

HttpClientFactoryHttpMessageHandler vytvoří použitou klientem gRPC. Standardní HttpClientFactory metody lze použít k přidání middlewaru odchozích požadavků nebo ke konfiguraci podkladového HttpClientpříkazuHttpClientHandler:

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

Další informace najdete v tématu Vytváření požadavků HTTP pomocí IHttpClientFactory.

Konfigurace průsečíků

Průsečíky gRPC je možné přidat do klientů pomocí AddInterceptor metody.

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

Předchozí kód:

  • Zaregistruje GreeterClient typ.
  • Nakonfiguruje LoggingInterceptor pro tohoto klienta. LoggingInterceptor se vytvoří jednou a sdílí se mezi GreeterClient instancemi.

Ve výchozím nastavení se průsečík vytvoří jednou a sdílí se mezi klienty. Toto chování lze přepsat zadáním oboru při registraci průsečíku. Klientská továrna lze nakonfigurovat tak, aby pro každého klienta vytvořila nový průsečík zadáním InterceptorScope.Client.

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

Vytváření průsečíků s vymezeným oborem klienta je užitečné, když průsečík vyžaduje omezené nebo přechodné služby s vymezeným oborem z DI.

Přihlašovací údaje zachytávání gRPC nebo kanálu se dají použít k odesílání Authorization metadat s každou žádostí. Další informace o konfiguraci ověřování najdete v tématu Odeslání nosný token pomocí klientské továrny gRPC.

Konfigurace kanálu

Další konfiguraci lze použít na kanál pomocí ConfigureChannel této metody:

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

ConfigureChannel je předána GrpcChannelOptions instance. Další informace najdete v tématu Konfigurace možností klienta.

Poznámka

Některé vlastnosti jsou nastavené GrpcChannelOptions před spuštěním zpětného ConfigureChannel volání:

Tyto hodnoty lze přepsat .ConfigureChannel

Konečný termín a šíření zrušení

Klienti gRPC vytvořená továrnou ve službě gRPC je možné nakonfigurovat tak EnableCallContextPropagation() , aby automaticky rozšířili konečný termín a token zrušení do podřízených volání. Metoda EnableCallContextPropagation() rozšíření je k dispozici v balíčku NuGet Grpc.AspNetCore.Server.ClientFactory .

Šíření kontextu volání funguje tak, že čte konečný termín a token zrušení z aktuálního kontextu požadavku gRPC a automaticky je rozšíří do odchozích volání provedených klientem gRPC. Šíření kontextu volání je vynikající způsob, jak zajistit, aby složité a vnořené scénáře gRPC vždy šířily termín a zrušení.

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

Ve výchozím nastavení vyvolá chybu, EnableCallContextPropagation pokud se klient používá mimo kontext volání gRPC. Tato chyba je navržená tak, aby vás upozornila, že neexistuje kontext volání, který se má rozšířit. Pokud chcete použít klienta mimo kontext volání, potlačit chybu, pokud je klient nakonfigurován pomocí SuppressContextNotFoundErrors:

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

Další informace o termínech a zrušení RPC najdete v tématu Spolehlivé služby gRPC s termíny a zrušením.

Pojmenovaní klienti

Typ klienta gRPC se obvykle zaregistruje jednou a pak se vloží přímo do konstruktoru typu pomocí DI. Existují však scénáře, ve kterých je užitečné mít více konfigurací pro jednoho klienta. Například klient, který provádí volání gRPC s ověřováním i bez ověřování.

Více klientů se stejným typem je možné zaregistrovat tak, že každému klientovi poskytnete název. Každý pojmenovaný klient může mít vlastní konfiguraci. AddGrpcClient Obecná rozšiřující metoda má přetížení, které zahrnuje parametr name:

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

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

Předchozí kód:

  • Zaregistruje GreeterClient typ dvakrát a zadá jedinečný název pro každý z nich.
  • Konfiguruje různá nastavení pro každého pojmenovaného klienta. Registrace GreeterAuthenticated přidá přihlašovací údaje do kanálu, aby se ověřila volání gRPC.

Pojmenovaný klient gRPC se vytvoří v kódu aplikace pomocí GrpcClientFactory. Typ a název požadovaného klienta se zadává pomocí obecné GrpcClientFactory.CreateClient metody:

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

    public AggregatorService(GrpcClientFactory grpcClientFactory)
    {
        _client = grpcClientFactory.CreateClient<Greeter.GreeterClient>("GreeterAuthenticated");
    }
}

Další prostředky