integrace klientské továrny gRPC v .NET

Od James Newton – král

integrace gRPC s HttpClientFactory nabízí centralizovaný způsob vytváření klientů gRPC. Dá se použít jako alternativa ke konfiguraci samostatných klientských gRPC instancí. integration Factory je k dispozici v balíčku NuGet .net. ClientFactory pro Grpc .

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

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

Registrace klientů gRPC

Pokud chcete zaregistrovat klienta gRPC, AddGrpcClient můžete použít obecnou metodu rozšíření v rámci Startup.ConfigureServices , zadáním klientské třídy gRPC typu a adresy služby:

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

Typ klienta gRPC je zaregistrován jako přechodný s vkládáním závislostí (DI). Klienta se teď dá vložit a spotřebovat přímo v typech vytvořených pomocí DI. ASP.NET Core Řadiče MVC, SignalR centra a gRPC služby jsou místa, kde je možné automaticky vložit gRPC klienty:

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 HttpHandler

HttpClientFactory vytvoří klienta, který HttpMessageHandler používá klient gRPC. Standardní HttpClientFactory metody lze použít pro přidání middlewaru pro odchozí žádosti nebo pro konfiguraci podkladu HttpClientHandler HttpClient :

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 kanálů a zachycení

k dispozici jsou metody specifické pro gRPC:

  • Konfigurace základního kanálu klienta gRPC.
  • Přidejte Interceptor instance, které klient použije při volání gRPC.
services
    .AddGrpcClient<Greeter.GreeterClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .AddInterceptor(() => new LoggingInterceptor())
    .ConfigureChannel(o =>
    {
        o.Credentials = new CustomCredentials();
    });

K posílání Authorization metadat s každým požadavkem se dá použít zachytávací gRPC nebo přihlašovací údaje kanálu. Další informace o konfiguraci ověřování najdete v tématu odeslání nosného tokenu s objektem pro vytváření klientů gRPC.

Termín a zrušení šíření

gRPC klienti, které vytvořila továrna ve službě gRPC, se dají nakonfigurovat EnableCallContextPropagation() tak, aby automaticky rozšířily konečný termín a token zrušení do podřízených volání. EnableCallContextPropagation()metoda rozšíření je k dispozici v balíčku Grpc. AspNetCore. Server. ClientFactory NuGet.

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

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

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

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

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

Pojmenovaná klienti

Obvykle je typ klienta gRPC registrován jednou a následně vložen přímo do konstruktoru typu pomocí DI. Existují však situace, kdy je vhodné mít pro jednoho klienta více konfigurací. Například klient, který provádí volání gRPC s ověřováním a bez něj.

Několik klientů stejného typu lze zaregistrovat tak, že každému klientovi zadáte název. Každý pojmenovaný klient může mít vlastní konfiguraci. Obecná AddGrpcClient metoda rozšíření 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 určí jedinečný název.
  • Konfiguruje různá nastavení pro každého pojmenovaného klienta. GreeterAuthenticatedRegistrace přidá do kanálu přihlašovací údaje, aby se gRPC volání, která provedla s ním, byla ověřena.

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ší materiály