Partager via


Découverte de service dans .NET

Dans cet article, vous allez apprendre à utiliser la Microsoft.Extensions.ServiceDiscovery bibliothèque. La découverte de services 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.

Commencez

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

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Ou, si vous utilisez le Kit de développement logiciel (SDK) .NET 10+ :

dotnet package add Microsoft.Extensions.ServiceDiscovery --prerelease

Pour plus d’informations, consultez dotnet ajouter un package ou Gérer les dépendances de packages 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 services à l'hôte, en configurant les résolveurs de points de terminaison de services par défaut :

builder.Services.AddServiceDiscovery();

Ajoutez la découverte de services à 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 HttpClient instances 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. Service Discovery prend en charge cela en permettant de spécifier une liste prioritaire de schémas d’URI dans la chaîne d’entrée fournie à Service Discovery. La découverte de services tentera de résoudre les services pour les schémas dans l'ordre et s'arrêtera lorsqu'un point de terminaison aura été 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 "basket" service, puis de revenir 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.

Les schémas peuvent être filtrés en configurant les propriétés AllowedSchemes et AllowAllSchemes sur ServiceDiscoveryOptions. La AllowAllSchemes propriété 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 AllowAllSchemesfalse et en ajoutant des schémas autorisés à la AllowedSchemes propriété. 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 ServiceDiscoveryOptions.AllowAllSchemes propriété sur true:

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

Résoudre les points de terminaison des services à partir de la configuration

La AddServiceDiscovery méthode d’extension ajoute par défaut un résolveur 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 IConfiguration source.

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 services a été ajoutée à l'hôte en utilisant la méthode d'extension AddServiceDiscoveryCore sur IServiceCollection, le résolveur de points de terminaison basé sur la configuration peut être ajouté en appelant la méthode d'extension AddConfigurationServiceEndpointProvider sur IServiceCollection.

Paramétrage

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

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

  • ApplyHostNameMetadata : 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. Elle est par défaut une fonction qui retourne false.

Pour configurer ces options, vous pouvez utiliser la méthode d'extension Configure sur la IServiceCollection ou le fichier Startup de la classe 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 des métadonnées de nom d’hôte.

Résoudre 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 services sans nécessiter de bibliothèque de client de découverte de services. 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 résolveur pass-through est conçu pour faciliter ce scénario. Il permet l’utilisation d’autres programmes de résolution, tels que la configuration, dans différents environnements, tels que l’ordinateur d’un développeur. Il est important de réaliser cette flexibilité sans avoir besoin de modifications de code ou de mise en œuvre de gardes conditionnels.

Le programme de résolution directe 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 services via la méthode d'extension AddServiceDiscovery.

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

Voir aussi