Compartilhar via


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.

Confira também