Partilhar via


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 AllowAllSchemesfalse 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.

Consulte também