Compartilhar via


Descoberta de serviço no .NET

Neste artigo, você aprenderá a usar a Microsoft.Extensions.ServiceDiscovery biblioteca. A descoberta de serviço é uma maneira de os desenvolvedores usarem nomes lógicos em vez de endereços físicos (endereço IP e porta) para se referir a serviços externos.

Comece agora

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

Ou, se você estiver usando o SDK do .NET 10+:

dotnet package add Microsoft.Extensions.ServiceDiscovery --prerelease

Para obter mais informações, consulte dotnet package add 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 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 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 "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.

Esquemas podem ser filtrados configurando as propriedades AllowedSchemes 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 para 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 ServiceDiscoveryOptions.AllowAllSchemes propriedade 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. Este resolver lê endpoints do sistema de configuração do .NET. A biblioteca dá suporte à configuração por meio de appsettings.json, variáveis de ambiente ou qualquer outra IConfiguration origem.

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 para o serviço chamado catálogo: https://localhost:8080e "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 usando a ConfigurationServiceEndpointProviderOptions classe, 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. Ele usa como padrão uma função que retorna false.

Para configurar essas opções, você pode usar o Configure método de extensão na classe Startup ou no arquivo Program do 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 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

Determinadas plataformas, como Aplicativos de Contêiner do Azure e Kubernetes (quando configuradas adequadamente), oferecem recursos de descoberta de serviço sem precisar de uma biblioteca de clientes de descoberta de serviço. Nos casos em que um aplicativo é implantado nesses ambientes, usar a 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 ambientes diferentes, como o computador de um desenvolvedor. É importante ressaltar que essa flexibilidade é obtida sem a necessidade de modificações de código ou a implementação de guardas condicionais.

O resolvedor de passagem não realiza nenhuma resolução externa; em vez disso, ele resolve os endpoints retornando o nome do serviço de entrada tal como representado por 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.

Consulte também