Descoberta de serviço no .NET
Neste artigo, você aprenderá a usar a biblioteca Microsoft.Extensions.ServiceDiscovery
. A descoberta de serviço é uma forma 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.
Introdução
Para começar a usar 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 Gerenciar dependências de pacotes em aplicativos .NET.
Exemplo de uso
No arquivo Program.cs do projeto, chame o método de extensão AddServiceDiscovery para adicionar a 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 IHttpClientBuilder individual chamando o método de extensão AddServiceDiscovery
:
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 instâncias de HttpClient 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 ao desenvolver e testar um serviço localmente e HTTPS quando o serviço é implantado. A Descoberta de Serviços dá suporte a isso permitindo que uma lista de prioridades de esquemas de URI seja especificada na cadeia de caracteres de entrada fornecida à Descoberta de Serviço. A Descoberta de Serviços tentará resolver os serviços para os esquemas em ordem e será interrompida 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ços primeiro tentará encontrar pontos de extremidade HTTPS para o serviço "basket"
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á os pontos de extremidade HTTP.
Os esquemas podem ser filtrados configurando as propriedades AllowedSchemes
e AllowAllSchemes
em ServiceDiscoveryOptions
. A propriedade AllowAllSchemes
é 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
como false
e adicionando esquemas permitidos à propriedade AllowedSchemes
. Por exemplo, para permitir apenas HTTPS:
services.Configure<ServiceDiscoveryOptions>(options =>
{
options.AllowAllSchemes = false;
options.AllowedSchemes = ["https"];
});
Para permitir explicitamente todos os esquemas, defina a propriedade ServiceDiscoveryOptions.AllowAllSchemes
como true
:
services.Configure<ServiceDiscoveryOptions>(
options => options.AllowAllSchemes = true);
Resolver pontos de extremidade de serviço por meio da configuração
O método de extensão AddServiceDiscovery
adiciona um resolvedor de ponto de extremidade baseado em configuração por padrão.
Esse resolvedor lê os pontos de extremidade do sistema de configuração do .NET. A biblioteca dá suporte à configuração por meio do appsettings.json, de variáveis de ambiente ou de qualquer outra fonte de IConfiguration.
Veja um exemplo que demonstra como configurar pontos de extremidade para o serviço chamado catalog por meio de appsettings.json
:
{
"Services": {
"catalog": {
"https": [
"localhost:8080",
"10.46.24.90:80"
]
}
}
}
O exemplo anterior adiciona dois pontos de extremidade ao serviço chamado catalog: https://localhost:8080
e "https://10.46.24.90:80"
. Cada vez que o catalog é resolvido, um desses pontos de extremidade é selecionado.
Se a descoberta de serviço foi adicionada ao host por meio do método de extensão AddServiceDiscoveryCore em IServiceCollection, o resolvedor de ponto de extremidade baseado em configuração pode ser adicionado chamando o método de extensão AddConfigurationServiceEndpointProvider em IServiceCollection
.
Configuração
O resolvedor de configuração é configurado por meio da classe ConfigurationServiceEndpointProviderOptions, que oferece estas opções de configuração:
SectionName: o nome da seção de configuração que contém os pontos de extremidade de serviço. O padrão é
"Services"
.ApplyHostNameMetadata: um representante usado para determinar se os metadados do nome do host devem ser aplicados aos pontos de extremidade resolvidos. Usa como padrão uma função que retorna
false
.
Para configurar essas opções, use o método de extensão Configure
em IServiceCollection
na classe Startup
ou no arquivo Program
do 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 uma lógica condicional personalizada para aplicar os metadados do nome do host.
Resolver os pontos de extremidade de serviço usando a descoberta de serviço fornecida pela plataforma
Algumas plataformas, como os Aplicativos de Contêiner do Azure e o Kubernetes (quando configuradas de acordo), oferecem funcionalidades de descoberta de serviço sem a necessidade de uma biblioteca de clientes de descoberta de serviço. Nos casos em que um aplicativo é implantado nesses ambientes, o uso da funcionalidade interna 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 um computador do desenvolvedor. É importante ressaltar que essa flexibilidade é alcançada sem a necessidade de nenhuma modificação de código ou da implementação de proteções condicionais.
O resolvedor de passagem não executa nenhuma resolução externa e, em vez disso, resolve os pontos de extremidade retornando o nome do serviço de entrada representado como um DnsEndPoint.
O provedor de passagem é configurado por padrão ao adicionar a descoberta de serviço por meio do método de extensão AddServiceDiscovery
.
Se a descoberta de serviço foi adicionada ao host por meio do método de extensão AddServiceDiscoveryCore
em IServiceCollection
, o provedor de passagem pode ser adicionado chamando o método de extensão AddPassThroughServiceEndpointProvider em IServiceCollection
.