Compartir a través de


Detección de servicios en .NET

En este artículo, aprenderá a usar la biblioteca de Microsoft.Extensions.ServiceDiscovery. La detección de servicios es una manera de que los desarrolladores usen nombres lógicos en lugar de direcciones físicas (dirección IP y puerto) para hacer referencia a servicios externos.

Introducción

Para empezar a trabajar con la detección de servicios en .NET, instale el paquete NuGet Microsoft.Extensions.ServiceDiscovery .

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Para obtener más información, consulte dotnet add package o Administración de dependencias de paquetes en aplicaciones .NET.

Ejemplo de uso

En el archivo Program.cs del proyecto, llame al método de extensión de AddServiceDiscovery para agregar la detección de servicios al host y configure los solucionadores de puntos de conexión de servicio predeterminados:

builder.Services.AddServiceDiscovery();

Agregue la detección de servicios a un IHttpClientBuilder individual llamando al método de extensión de AddServiceDiscovery:

builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
    {
        client.BaseAddress = new("https://catalog");
    })
    .AddServiceDiscovery();

Como alternativa, puede agregar la detección de servicios a todas las instancias de HttpClient de forma predeterminada:

builder.Services.ConfigureHttpClientDefaults(static http =>
{
    // Turn on service discovery by default
    http.AddServiceDiscovery();
});

Selección de esquema al resolver puntos de conexión HTTP(S)

Es habitual usar HTTP al desarrollar y probar un servicio localmente y HTTPS cuando se implementa el servicio. La detección de servicios admite esto, ya que permite especificar una lista de prioridades de esquemas de URI en la cadena de entrada dada a Detección de servicios. La detección de servicios intentará resolver los servicios de los esquemas en orden y se detendrá después de encontrar un punto de conexión. Los esquemas de URI están separados por un carácter +, por ejemplo: "https+http://basket". La detección de servicios intentará primero buscar puntos de conexión HTTPS para el servicio "basket" y, a continuación, revertirá a los puntos de conexión HTTP. Si se encuentra algún punto de conexión HTTPS, La detección de servicios no incluirá puntos de conexión HTTP.

Los esquemas se pueden filtrar configurando las propiedades AllowedSchemes y AllowAllSchemes en ServiceDiscoveryOptions. La propiedad AllowAllSchemes se usa para indicar que se permiten todos los esquemas. De forma predeterminada, AllowAllSchemes es true y se permiten todos los esquemas. Los esquemas se pueden restringir estableciendo AllowAllSchemes en false y agregando esquemas permitidos a la propiedad AllowedSchemes. Por ejemplo, para permitir solo HTTPS:

services.Configure<ServiceDiscoveryOptions>(options =>
{
    options.AllowAllSchemes = false;
    options.AllowedSchemes = ["https"];
});

Para permitir explícitamente todos los esquemas, establezca la propiedad ServiceDiscoveryOptions.AllowAllSchemes en true:

services.Configure<ServiceDiscoveryOptions>(
    options => options.AllowAllSchemes = true);

Resolución de puntos de conexión de servicio desde la configuración

El método de extensión de AddServiceDiscovery agrega de forma predeterminada un solucionador de puntos de conexión basado en configuración. Este solucionador lee los puntos de conexión del sistema de configuración de .NET. La biblioteca admite la configuración a través de appsettings.json, variables de entorno o cualquier otro origen IConfiguration.

Este es un ejemplo que muestra cómo configurar puntos de conexión para el servicio denominado catálogo mediante appsettings.json:

{
  "Services": {
    "catalog": {
      "https": [
        "localhost:8080",
        "10.46.24.90:80"
      ]
    }
  }
}

En el ejemplo anterior se agregan dos puntos de conexión para el servicio denominado catálogo: https://localhost:8080 y "https://10.46.24.90:80". Cada vez que se resuelva el catálogo, se seleccionará uno de estos puntos de conexión.

Si la detección de servicios se agregó al host mediante el método de extensión de AddServiceDiscoveryCore en IServiceCollection, el solucionador de puntos de conexión basado en configuración se puede agregar llamando al método de extensión de AddConfigurationServiceEndpointProvider en IServiceCollection.

Configuración

La resolución de configuración se configura mediante la clase ConfigurationServiceEndpointProviderOptions, que ofrece estas opciones de configuración:

  • SectionName: el nombre de la sección de configuración que contiene puntos de conexión de servicio. Se establece de forma predeterminada en "Services".

  • ApplyHostNameMetadata: delegado que se usa para determinar si se deben aplicar metadatos de nombre de host a los puntos de conexión resueltos. El valor predeterminado es una función que devuelve false.

Para configurar estas opciones, puede usar el método de extensión de Configure en IServiceCollection sin la clase Startup de la aplicación o el archivo Program:

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");
        };
    });

En el ejemplo anterior se muestra cómo establecer un nombre de sección personalizado para los puntos de conexión de servicio y proporcionar una lógica condicional personalizada para aplicar metadatos de nombre de host.

Resolución de puntos de conexión de servicio mediante la detección de servicios proporcionados por la plataforma

Algunas plataformas, como Azure Container Apps y Kubernetes (cuando se configuran en consecuencia), ofrecen funcionalidades de detección de servicios sin necesidad de una biblioteca cliente de detección de servicios. En los casos en los que se implementa una aplicación en estos entornos, el uso de la funcionalidad integrada de la plataforma puede ser ventajoso. La resolución de tránsito está diseñada para facilitar este escenario. Permite el uso de solucionadores alternativos, como la configuración, en entornos diferentes, como la máquina del desarrollador. Importantemente, esta flexibilidad se logra sin necesidad de modificaciones de código ni de la implementación de guardias condicionales.

El solucionador de tránsito no realiza ninguna resolución externa y, en su lugar, resuelve los puntos de conexión devolviendo el nombre del servicio de entrada representado como un DnsEndPoint.

El proveedor de tránsito se configura de forma predeterminada al agregar la detección de servicios a través del método de extensión de AddServiceDiscovery.

Si la detección de servicios se agregó al host mediante el método de extensión de AddServiceDiscoveryCore en IServiceCollection, el proveedor de tránsito se puede agregar llamando al método de extensión de AddPassThroughServiceEndpointProvider en IServiceCollection.

Consulte también