Condividi tramite


Individuazione dei servizi in .NET

In questo articolo apprenderai come usare la libreria Microsoft.Extensions.ServiceDiscovery. L'individuazione dei servizi è un modo con cui gli sviluppatori usano nomi logici anziché indirizzi fisici (indirizzo IP e porta) per fare riferimento a servizi esterni.

Operazioni preliminari

Per iniziare a usare l'individuazione dei servizi in .NET, installa il pacchetto NuGet Microsoft.Extensions.ServiceDiscovery.

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Per altre informazioni, vedi dotnet add package o Gestire le dipendenze dei pacchetti nelle applicazioni .NET.

Esempio di utilizzo

Nel file Program.cs del progetto chiama il metodo di estensione AddServiceDiscovery per aggiungere l'individuazione del servizio all'host, configurando i resolver predefiniti dell'endpoint di servizio:

builder.Services.AddServiceDiscovery();

Aggiungi l'individuazione del servizio a un singolo utente IHttpClientBuilder chiamando il metodo di estensione AddServiceDiscovery:

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

In alternativa, puoi aggiungere l'individuazione del servizio a tutte le istanze HttpClient per impostazione predefinita:

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

Selezione dello schema durante la risoluzione degli endpoint HTTP(S)

È comune usare HTTP durante lo sviluppo e il test di un servizio in locale e HTTPS quando il servizio viene distribuito. L'individuazione dei servizi supporta questa funzionalità consentendo di specificare un elenco di priorità di schemi URI nella stringa di input specificata per l'individuazione dei servizi. L'individuazione dei servizi tenterà di risolvere i servizi per gli schemi in ordine e si arresterà dopo che viene trovato un endpoint. Gli schemi URI sono separati da un carattere +, ad esempio: "https+http://basket". L'individuazione dei servizi tenterà prima di tutto di trovare gli endpoint HTTPS per il servizio "basket" e quindi tornare agli endpoint HTTP. Se viene trovato un endpoint HTTPS, l'individuazione dei servizi non includerà gli endpoint HTTP.

Gli schemi possono essere filtrati configurando le proprietà AllowedSchemes e AllowAllSchemes in ServiceDiscoveryOptions. La proprietà AllowAllSchemes viene utilizzata per indicare che tutti gli schemi sono consentiti. Per impostazione predefinita, AllowAllSchemes è true e tutti gli schemi sono consentiti. Gli schemi possono essere limitati impostando AllowAllSchemes su false e aggiungendo schemi consentiti alla proprietà AllowedSchemes. Ad esempio, per consentire solo HTTPS:

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

Per consentire in modo esplicito tutti gli schemi, impostare la proprietà ServiceDiscoveryOptions.AllowAllSchemes su true:

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

Risolvere gli endpoint di servizio dalla configurazione

Il metodo di estensione AddServiceDiscovery aggiunge un sistema di risoluzione degli endpoint basato sulla configurazione per impostazione predefinita. Questo sistema di risoluzione legge gli endpoint dal sistema di configurazione .NET. La libreria supporta la configurazione tramite appsettings.json, variabili di ambiente o qualsiasi altra origine IConfiguration.

Di seguito è riportato un esempio che illustra come configurare gli endpoint per il servizio denominato catalogo tramite appsettings.json:

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

Nell'esempio precedente vengono aggiunti due endpoint per il servizio denominato catalogo: https://localhost:8080 e "https://10.46.24.90:80". Ogni volta che il catalogo viene risolto, viene selezionato uno di questi endpoint.

Se l'individuazione del servizio è stata aggiunta all'host usando il metodo di estensione AddServiceDiscoveryCore in IServiceCollection, il sistema di risoluzione degli endpoint basato sulla configurazione può essere aggiunto chiamando il metodo di estensione AddConfigurationServiceEndpointProvider in IServiceCollection.

Impostazione

Il sistema di risoluzione della configurazione viene configurato usando la classe ConfigurationServiceEndpointProviderOptions, che offre queste opzioni di configurazione:

  • SectionName: nome della sezione di configurazione che contiene gli endpoint di servizio. Il valore predefinito è "Services".

  • ApplyHostNameMetadata: delegato usato per determinare se i metadati del nome host devono essere applicati agli endpoint risolti. L'impostazione predefinita è una funzione che restituisce false.

Per configurare queste opzioni, puoi usare il metodo di estensione Configure su IServiceCollection all’interno della classe Startup dell’applicazione o del file 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");
        };
    });

L'esempio precedente illustra l'impostazione di un nome di sezione personalizzato per gli endpoint di servizio e la logica condizionale personalizzata per l'applicazione dei metadati del nome host.

Risolvere gli endpoint di servizio usando l'individuazione dei servizi fornita dalla piattaforma

Alcune piattaforme, ad esempio App contenitore di Azure e Kubernetes (se configurate di conseguenza), offrono funzionalità di individuazione dei servizi senza richiedere una libreria client di individuazione dei servizi. Nei casi in cui un'applicazione viene distribuita in tali ambienti, l'uso della funzionalità predefinita della piattaforma può risultare vantaggioso. Il sistema di risoluzione pass-through è progettato per facilitare questo scenario. Consente l'utilizzo di resolver alternativi, ad esempio la configurazione, in ambienti diversi, come il computer di uno sviluppatore. È importante notare che questa flessibilità viene ottenuta senza la necessità di alcuna modifica del codice o l'implementazione di guard condizionali.

Il sistema di risoluzione pass-through non esegue alcuna risoluzione esterna e risolve invece gli endpoint restituendo il nome del servizio di input rappresentato come DnsEndPoint.

Il provider pass-through viene configurato per impostazione predefinita quando si aggiunge l'individuazione del servizio tramite il metodo di estensione AddServiceDiscovery.

Se l'individuazione del servizio è stata aggiunta all'host usando il metodo di estensione AddServiceDiscoveryCore in IServiceCollection, il provider pass-through può essere aggiunto chiamando il metodo di estensione AddPassThroughServiceEndpointProvider su IServiceCollection.

Vedi anche