.NET'te gRPC istemci fabrikası tümleştirmesi
James Newton-King
ile gRPC HttpClientFactory tümleştirmesi, gRPC istemcileri oluşturmak için merkezi bir yol sunar. Tek başına gRPC istemci örneklerini yapılandırmaya alternatif olarak kullanılabilir. Fabrika tümleştirmesi Grpc.Net.ClientFactory NuGet kullanılabilir.
Fabrika aşağıdaki avantajları sunar:
- Mantıksal gRPC istemci örneklerini yapılandırmak için merkezi bir konum sağlar
- Temel alınan
HttpClientMessageHandler - gRPC hizmetlerinde son tarih ve iptal ASP.NET Core otomatik yayılması
gRPC istemcilerini kaydetme
Bir gRPC istemcisini kaydetmek için, içinde genel uzantı yöntemi kullanılabilir ve AddGrpcClient Startup.ConfigureServices gRPC türüne sahip istemci sınıfı ve hizmet adresi belirterek:
services.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
});
gRPC istemci türü, bağımlılık ekleme (DI) ile geçici olarak kaydedilir. İstemci artık doğrudan DI tarafından oluşturulan türlere oluşturulabilir ve kullanılabilir. ASP.NET Core MVC denetleyicileri, SignalR hub'lar ve gRPC hizmetleri, gRPC istemcilerinin otomatik olarak eklenir olduğu yerlerdir:
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);
}
}
}
}
HttpHandler'i yapılandırma
HttpClientFactory , HttpMessageHandler gRPC istemcisi tarafından kullanılan 'yi oluşturur. Giden istek ara yazılımı eklemek veya temel alınan 'yi yapılandırmak HttpClientFactory için standart yöntemler HttpClientHandler HttpClient kullanılabilir:
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigurePrimaryHttpMessageHandler(() =>
{
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(LoadCertificate());
return handler;
});
Daha fazla bilgi için bkz. IHttpClientFactorykullanarak HTTP istekleri yapma.
Kanalı ve KesmeCileri Yapılandırma
gRPC'ye özgü yöntemler şunların için kullanılabilir:
- Bir gRPC istemcisinin temel kanalını yapılandırma.
- İstemcinin
InterceptorgRPC çağrıları yaparken kullanabileceği örnekleri ekleyin.
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddInterceptor(() => new LoggingInterceptor())
.ConfigureChannel(o =>
{
o.Credentials = new CustomCredentials();
});
Her istekle meta verileri göndermek için bir gRPC kesme noktası Authorization veya kanal kimlik bilgileri kullanılabilir. Kimlik doğrulamasını yapılandırma hakkında daha fazla bilgi için bkz. gRPCistemci fabrikası ile taşıyıcı belirteç gönderme.
Son tarih ve iptal yayma
Bir gRPC hizmetteki fabrika tarafından oluşturulan gRPC istemcileri, ile alt çağrılara son tarih ve iptal belirteci otomatik olarak EnableCallContextPropagation() yayacak şekilde yalıtabilirsiniz. Uzantı EnableCallContextPropagation() yöntemi Grpc.AspNetCore.Server.ClientFactory NuGet kullanılabilir.
Çağrı bağlamı yayma, geçerli gRPC istek bağlamından son tarih ve iptal belirteci okunarak ve bunları gRPC istemcisi tarafından yapılan giden çağrılara otomatik olarak yayarak çalışır. Çağrı bağlamı yayma, karmaşık, iç içe geçmiş gRPC senaryolarının her zaman son tarihi ve iptali yaymalarını sağlamanın harika bir yoludur.
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.EnableCallContextPropagation();
Varsayılan olarak, EnableCallContextPropagation istemci bir gRPC çağrısının bağlamı dışında kullanılıyorsa bir hata döndürür. Bu hata, yaymanız gereken bir çağrı bağlamı olmadığını size haber ve etmek için tasarlanmıştır. İstemciyi bir çağrı bağlamı dışında kullanmak için istemci ile yapılandırıldığında hatayı SuppressContextNotFoundErrors engelin:
services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.EnableCallContextPropagation(o => o.SuppressContextNotFoundErrors = true);
Son tarihler ve RPC iptali hakkında daha fazla bilgi için bkz. Son tarihleri ve iptali olan güvenilir gRPC Hizmetleri .
Adlandırılmış istemciler
Genellikle, bir gRPC istemci türü bir kez kaydedilir ve ardından doğrudan DI tarafından bir türün oluşturucus una kaydedilir. Ancak, bir istemci için birden çok yapılandırmaya sahip olmak yararlı olan senaryolar vardır. Örneğin, kimlik doğrulaması ile ve kimlik doğrulaması olmadan gRPC çağrıları yapan bir istemci.
Her istemciye bir ad vererek aynı türe sahip birden çok istemci kayded olabilir. Her adlandırılmış istemcinin kendi yapılandırması olabilir. Genel uzantı AddGrpcClient yönteminin bir ad parametresi içeren bir aşırı yüklemesi vardır:
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();
});
Yukarıdaki kod:
- Türü iki
GreeterClientkez kaydederek her biri için benzersiz bir ad belirtir. - Adlandırılmış her istemci için farklı ayarlar yapılandırıyor. Kayıt,
GreeterAuthenticatedkanalla yapılan gRPC çağrılarını doğrulanacak şekilde kanala kimlik bilgilerini ekler.
kullanılarak uygulama kodunda adlandırılmış bir gRPC istemcisi GrpcClientFactory oluşturulur. İstenen istemcinin türü ve adı genel yöntem kullanılarak GrpcClientFactory.CreateClient belirtilir:
public class AggregatorService : Aggregator.AggregatorBase
{
private readonly Greeter.GreeterClient _client;
public AggregatorService(GrpcClientFactory grpcClientFactory)
{
_client = grpcClientFactory.CreateClient<Greeter.GreeterClient>("GreeterAuthenticated");
}
}