Partager via


Découverte de service dans .NET

Dans cet article, vous allez apprendre à utiliser la bibliothèque Microsoft.Extensions.ServiceDiscovery. La découverte de service permet aux développeurs d’utiliser des noms logiques au lieu d’adresses physiques (adresse IP et port) pour faire référence à des services externes.

Bien démarrer

Pour commencer à utiliser la découverte de service dans .NET, installez le package NuGet Microsoft.Extensions.ServiceDiscovery.

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Pour plus d’informations, consultez dotnet ajouter package ou Gérer les dépendances de package dans les applications .NET.

Exemple d’utilisation

Dans le fichier Program.cs de votre projet, appelez la méthode d’extension AddServiceDiscovery pour ajouter la découverte de service à l’hôte, en configurant les programme de résolution de point de terminaison de service par défaut :

builder.Services.AddServiceDiscovery();

Ajoutez la découverte de service à un individu IHttpClientBuilder en appelant la méthode d’extension AddServiceDiscovery :

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

Vous pouvez également ajouter la découverte de service à toutes les instances HttpClient par défaut :

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

Sélection de schémas lors de la résolution des points de terminaison HTTP(S)

Il est courant d’utiliser HTTP lors du développement et du test d’un service localement et HTTPS lors du déploiement du service. La découverte de service prend en charge cette opération en autorisant la spécification d’une liste de schémas d’URI prioritaire dans la chaîne d’entrée donnée à la découverte de service. La découverte de service tente de résoudre les services des schémas dans l’ordre et s’arrête une fois qu’un point de terminaison est trouvé. Les schémas d’URI sont séparés par un caractère +, par exemple : "https+http://basket". La découverte de service essaie d’abord de trouver des points de terminaison HTTPS pour le service "basket", puis revient aux points de terminaison HTTP. Si un point de terminaison HTTPS est trouvé, la découverte de service n’inclut pas de points de terminaison HTTP.

Vous pouvez filtrer les schémas en configurant les propriétés AllowedSchemes et AllowAllSchemes sur ServiceDiscoveryOptions. La propriété AllowAllSchemes est utilisée pour indiquer que tous les schémas sont autorisés. Par défaut, AllowAllSchemes est true et tous les schémas sont autorisés. Les schémas peuvent être limités en définissant AllowAllSchemes sur false et en ajoutant des schémas autorisés à la propriété AllowedSchemes. Par exemple, pour autoriser uniquement HTTPS :

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

Pour autoriser explicitement tous les schémas, définissez la propriété ServiceDiscoveryOptions.AllowAllSchemes sur true :

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

Résolvez les points de terminaison de service à partir de la configuration

La méthode d’extension AddServiceDiscovery ajoute par défaut un programme de résolution de point de terminaison basé sur la configuration. Ce programme de résolution lit les points de terminaison du système de configuration .NET. La bibliothèque prend en charge la configuration via appsettings.json, les variables d’environnement ou toute autre source IConfiguration.

Voici un exemple illustrant comment configurer des points de terminaison pour le service nommé catalogue via appsettings.json :

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

L’exemple précédent ajoute deux points de terminaison pour le service nommé catalogue : https://localhost:8080, et "https://10.46.24.90:80". Chaque fois que le catalogue est résolu, l’un de ces points de terminaison est sélectionné.

Si la découverte de service a été ajoutée à l’hôte à l’aide de la méthode d’extension AddServiceDiscoveryCore sur IServiceCollection, le programme de résolution de point de terminaison basé sur la configuration peut être ajouté en appelant la méthode d’extension AddConfigurationServiceEndpointProvider sur IServiceCollection.

Configuration

Le programme de résolution de configuration est configuré à l’aide de la classe ConfigurationServiceEndpointProviderOptions, qui offre ces options de configuration :

  • SectionName : le nom de la section de configuration qui contient des points de terminaison de service. Sa valeur par défaut est "Services".

  • ApplyHostNameMetadata : un délégué utilisé pour déterminer si les métadonnées de nom d’hôte doivent être appliquées aux points de terminaison résolus. Par défaut, il s’agit d’une fonction qui retourne false.

Pour configurer ces options, vous pouvez utiliser la méthode d’extension Configure sur le IServiceCollection dans la classe Startup ou le fichier Program de votre application :

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

L’exemple précédent montre comment définir un nom de section personnalisé pour vos points de terminaison de service et fournir une logique conditionnelle personnalisée pour l’application de métadonnées de nom d’hôte.

Résolvez les points de terminaison de service à l’aide de la découverte de service fournie par la plateforme

Certaines plateformes, telles qu’Azure Container Apps et Kubernetes (lorsqu’elles sont configurées en conséquence), offrent des fonctionnalités de découverte de service sans nécessiter de bibliothèque de client de découverte de service. Dans les cas où une application est déployée dans de tels environnements, l’utilisation des fonctionnalités intégrées de la plateforme peut être avantageuse. Le programme de résolution Pass-through est conçu pour faciliter ce scénario. Il permet d’utiliser d’autres programmes de résolution, tels que la configuration, dans différents environnements, comme l’ordinateur d’un développeur. Il est important que cette flexibilité soit obtenue sans qu’il soit nécessaire de modifier le code ou de mettre en œuvre des protections conditionnelles.

Le programme de résolution Pass-through n’effectue aucune résolution externe et résout plutôt les points de terminaison en retournant le nom du service d’entrée représenté sous la forme d’un DnsEndPoint.

Le fournisseur Pass-through est configuré par défaut lors de l’ajout de la découverte de service via la méthode d’extension AddServiceDiscovery.

Si la découverte de service a été ajoutée à l’hôte à l’aide de la méthode d’extension AddServiceDiscoveryCore sur IServiceCollection, le fournisseur de Pass-through peut être ajouté en appelant la méthode d’extension AddPassThroughServiceEndpointProvider sur IServiceCollection.

Voir aussi