Delen via


Servicedetectie in .NET

In dit artikel leert u hoe u de Microsoft.Extensions.ServiceDiscovery bibliotheek gebruikt. Servicedetectie is een manier voor ontwikkelaars om logische namen te gebruiken in plaats van fysieke adressen (IP-adres en poort) om te verwijzen naar externe services.

Aan de slag

Installeer het NuGet-pakket Microsoft.Extensions.ServiceDiscovery om aan de slag te gaan met servicedetectie in .NET.

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Zie dotnet-pakket toevoegen of pakketafhankelijkheden beheren in .NET-toepassingen voor meer informatie.

Voorbeeld van gebruik

Roep in het Program.cs bestand van uw project de AddServiceDiscovery extensiemethode aan om servicedetectie toe te voegen aan de host, waarbij standaard resolvers voor service-eindpunten worden geconfigureerd:

builder.Services.AddServiceDiscovery();

Voeg servicedetectie toe aan een persoon IHttpClientBuilder door de AddServiceDiscovery extensiemethode aan te roepen:

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

U kunt ook standaard servicedetectie toevoegen aan alle HttpClient exemplaren:

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

Schemaselectie bij het omzetten van HTTP(S)-eindpunten

Het is gebruikelijk om HTTP te gebruiken tijdens het lokaal ontwikkelen en testen van een service en HTTPS wanneer de service wordt geïmplementeerd. Service Discovery ondersteunt dit door een prioriteitslijst met URI-schema's op te geven in de invoerreeks die aan Service Discovery wordt gegeven. ServiceDetectie probeert de services voor de schema's op volgorde op te lossen en stopt nadat een eindpunt is gevonden. URI-schema's worden gescheiden door een + teken, bijvoorbeeld: "https+http://basket". Service Discovery probeert eerst HTTPS-eindpunten voor de "basket" service te vinden en valt vervolgens terug op HTTP-eindpunten. Als er een HTTPS-eindpunt wordt gevonden, bevat Service Discovery geen HTTP-eindpunten.

Schema's kunnen worden gefilterd door de AllowedSchemes en AllowAllSchemes eigenschappen op ServiceDiscoveryOptionste configureren. De AllowAllSchemes eigenschap wordt gebruikt om aan te geven dat alle schema's zijn toegestaan. AllowAllSchemes Standaard zijn alle true schema's toegestaan. Schema's kunnen worden beperkt door toegestane schema's in false te stellen AllowAllSchemes en toe te voegen aan de AllowedSchemes eigenschap. Als u bijvoorbeeld alleen HTTPS wilt toestaan:

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

Als u alle schema's expliciet wilt toestaan, stelt u de ServiceDiscoveryOptions.AllowAllSchemes eigenschap in op true:

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

Service-eindpunten oplossen vanuit configuratie

Met de AddServiceDiscovery extensiemethode wordt standaard een op configuratie gebaseerde eindpunt-resolver toegevoegd. Deze resolver leest eindpunten uit het .NET-configuratiesysteem. De bibliotheek ondersteunt configuratie via appsettings.json, omgevingsvariabelen of een andere IConfiguration bron.

Hier volgt een voorbeeld waarin wordt gedemonstreerd hoe u eindpunten configureert voor de service met de naam catalogus via appsettings.json:

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

In het voorgaande voorbeeld worden twee eindpunten toegevoegd voor de service met de naam catalogus: https://localhost:8080en "https://10.46.24.90:80". Telkens wanneer de catalogus wordt opgelost, wordt een van deze eindpunten geselecteerd.

Als servicedetectie aan de host is toegevoegd met behulp van de AddServiceDiscoveryCore extensiemethode, IServiceCollectionkan de op configuratie gebaseerde eindpunt-resolver worden toegevoegd door de AddConfigurationServiceEndpointProvider extensiemethode aan te roepen op IServiceCollection.

Configuratie

De configuratie-resolver wordt geconfigureerd met behulp van de ConfigurationServiceEndpointProviderOptions klasse, die deze configuratieopties biedt:

  • SectionName: de naam van de configuratiesectie die service-eindpunten bevat. Deze wordt standaard ingesteld op "Services".

  • ApplyHostNameMetadata: een gemachtigde die wordt gebruikt om te bepalen of metagegevens van de hostnaam moeten worden toegepast op opgeloste eindpunten. Deze functie wordt standaard ingesteld op een functie die wordt geretourneerd false.

Als u deze opties wilt configureren, kunt u de Configure extensiemethode gebruiken voor de IServiceCollection klasse of Program het bestand van Startup uw toepassing:

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

In het voorgaande voorbeeld ziet u hoe u een aangepaste sectienaam instelt voor uw service-eindpunten en aangepaste voorwaardelijke logica biedt voor het toepassen van metagegevens van de hostnaam.

Service-eindpunten oplossen met behulp van door het platform geleverde servicedetectie

Bepaalde platforms, zoals Azure Container Apps en Kubernetes (indien geconfigureerd dienovereenkomstig), bieden servicedetectiemogelijkheden zonder dat hiervoor een clientbibliotheek voor servicedetectie nodig is. In gevallen waarin een toepassing in dergelijke omgevingen wordt geïmplementeerd, kan het gebruik van de ingebouwde functionaliteit van het platform voordelig zijn. De passthrough-resolver is ontworpen om dit scenario te vergemakkelijken. Het maakt het gebruik van alternatieve resolvers, zoals configuratie, mogelijk in verschillende omgevingen, zoals de computer van een ontwikkelaar. Belangrijk is dat deze flexibiliteit wordt bereikt zonder dat codewijzigingen of de implementatie van voorwaardelijke bewakers nodig zijn.

De passthrough-resolver voert geen externe resolutie uit en lost in plaats daarvan eindpunten op door de naam van de invoerservice te retourneren die wordt weergegeven als een DnsEndPoint.

De passthrough-provider wordt standaard geconfigureerd bij het toevoegen van servicedetectie via de AddServiceDiscovery extensiemethode.

Als servicedetectie aan de host is toegevoegd met behulp van de AddServiceDiscoveryCore extensiemethode ingeschakeldIServiceCollection, kan de passthrough-provider worden toegevoegd door de AddPassThroughServiceEndpointProvider extensiemethode aan te roepen.IServiceCollection

Zie ook