Descoberta de serviço no .NET
Neste artigo, você aprenderá a usar a Microsoft.Extensions.ServiceDiscovery
biblioteca. A descoberta de serviços é uma maneira de os desenvolvedores usarem nomes lógicos em vez de endereços físicos (endereço IP e porta) para se referirem a serviços externos.
Começar agora
Para começar com a descoberta de serviço no .NET, instale o pacote NuGet Microsoft.Extensions.ServiceDiscovery.
dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease
Para obter mais informações, consulte dotnet add package ou Manage package dependencies in .NET applications.
Exemplo de utilização
No arquivo de Program.cs do seu projeto, chame o método de extensão para adicionar a AddServiceDiscovery descoberta de serviço ao host, configurando resolvedores de ponto de extremidade de serviço padrão:
builder.Services.AddServiceDiscovery();
Adicione a descoberta de serviço a um indivíduo IHttpClientBuilder chamando o AddServiceDiscovery
método de extensão:
builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
{
client.BaseAddress = new("https://catalog");
})
.AddServiceDiscovery();
Como alternativa, você pode adicionar a descoberta de serviço a todas as HttpClient instâncias por padrão:
builder.Services.ConfigureHttpClientDefaults(static http =>
{
// Turn on service discovery by default
http.AddServiceDiscovery();
});
Seleção de esquema ao resolver pontos de extremidade HTTP(S)
É comum usar HTTP durante o desenvolvimento e teste de um serviço localmente e HTTPS quando o serviço é implantado. O Service Discovery oferece suporte a isso, permitindo que uma lista de prioridade de esquemas de URI seja especificada na cadeia de caracteres de entrada fornecida ao Service Discovery. O Service Discovery tentará resolver os serviços para os esquemas em ordem e será interrompido depois que um ponto de extremidade for encontrado. Os esquemas de URI são separados por um +
caractere, por exemplo: "https+http://basket"
. A Descoberta de Serviço primeiro tentará encontrar pontos de extremidade HTTPS para o "basket"
serviço e, em seguida, retornará aos pontos de extremidade HTTP. Se algum ponto de extremidade HTTPS for encontrado, a Descoberta de Serviço não incluirá pontos de extremidade HTTP.
Os esquemas podem ser filtrados configurando as AllowedSchemes
propriedades e AllowAllSchemes
em ServiceDiscoveryOptions
. A AllowAllSchemes
propriedade é usada para indicar que todos os esquemas são permitidos. Por padrão, AllowAllSchemes
é true
e todos os esquemas são permitidos. Os esquemas podem ser restringidos definindo AllowAllSchemes
false
e adicionando esquemas permitidos à AllowedSchemes
propriedade. Por exemplo, para permitir apenas HTTPS:
services.Configure<ServiceDiscoveryOptions>(options =>
{
options.AllowAllSchemes = false;
options.AllowedSchemes = ["https"];
});
Para permitir explicitamente todos os esquemas, defina a ServiceDiscoveryOptions.AllowAllSchemes
propriedade como true
:
services.Configure<ServiceDiscoveryOptions>(
options => options.AllowAllSchemes = true);
Resolver pontos de extremidade de serviço a partir da configuração
O AddServiceDiscovery
método de extensão adiciona um resolvedor de ponto de extremidade baseado em configuração por padrão.
Este resolvedor lê pontos de extremidade do sistema de configuração .NET. A biblioteca suporta configuração através de appsettings.json, variáveis de ambiente ou qualquer outra IConfiguration fonte.
Aqui está um exemplo demonstrando como configurar pontos de extremidade para o serviço chamado catálogo via appsettings.json
:
{
"Services": {
"catalog": {
"https": [
"localhost:8080",
"10.46.24.90:80"
]
}
}
}
O exemplo anterior adiciona dois pontos de extremidade para o serviço chamado catalog:https://localhost:8080
, e "https://10.46.24.90:80"
. Cada vez que o catálogo é resolvido, um desses pontos de extremidade é selecionado.
Se a descoberta de serviço foi adicionada ao host usando o AddServiceDiscoveryCore método extension em , o resolvedor de ponto de extremidade baseado em IServiceCollectionconfiguração pode ser adicionado chamando o AddConfigurationServiceEndpointProvider método de extensão em IServiceCollection
.
Configuração
O resolvedor de configuração é configurado usando a classe, que oferece estas opções de ConfigurationServiceEndpointProviderOptions configuração:
SectionName: O nome da seção de configuração que contém pontos de extremidade de serviço. O padrão é
"Services"
.ApplyHostNameMetadata: um delegado usado para determinar se os metadados do nome do host devem ser aplicados aos pontos de extremidade resolvidos. O padrão é uma função que retorna
false
.
Para configurar essas opções, você pode usar o Configure
método de extensão na IServiceCollection
classe ou Program
arquivo do Startup
seu aplicativo:
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<ConfigurationServiceEndPointResolverOptions>(
static options =>
{
options.SectionName = "MyServiceEndpoints";
// Configure the logic for applying host name metadata
options.ApplyHostNameMetadata = static endpoint =>
{
// Your custom logic here. For example:
return endpoint.EndPoint is DnsEndPoint dnsEp
&& dnsEp.Host.StartsWith("internal");
};
});
O exemplo anterior demonstra a definição de um nome de seção personalizado para seus pontos de extremidade de serviço e o fornecimento de lógica condicional personalizada para aplicar metadados de nome de host.
Resolver pontos de extremidade de serviço usando a descoberta de serviço fornecida pela plataforma
Determinadas plataformas, como Aplicativos de Contêiner do Azure e Kubernetes (quando configuradas de acordo), oferecem recursos de descoberta de serviço sem a necessidade de uma biblioteca de cliente de descoberta de serviço. Nos casos em que um aplicativo é implantado nesses ambientes, usar a funcionalidade integrada da plataforma pode ser vantajoso. O resolvedor de passagem foi projetado para facilitar esse cenário. Ele permite a utilização de resolvedores alternativos, como configuração, em diferentes ambientes, como a máquina de um desenvolvedor. É importante ressaltar que essa flexibilidade é alcançada sem a necessidade de qualquer modificação de código ou a implementação de guardas condicionais.
O resolvedor de passagem não executa nenhuma resolução externa e, em vez disso, resolve pontos de extremidade retornando o nome do serviço de entrada representado como .DnsEndPoint
O provedor de passagem é configurado por padrão ao adicionar a descoberta de serviço por meio do AddServiceDiscovery
método de extensão.
Se a descoberta de serviço foi adicionada ao host usando o AddServiceDiscoveryCore
método extension on IServiceCollection
, o provedor de passagem pode ser adicionado chamando o AddPassThroughServiceEndpointProvider método de extensão em IServiceCollection
.