Dela via


Tjänstidentifiering i .NET

I den här artikeln får du lära dig hur du använder Microsoft.Extensions.ServiceDiscovery biblioteket. Tjänstidentifiering är ett sätt för utvecklare att använda logiska namn i stället för fysiska adresser (IP-adress och port) för att referera till externa tjänster.

Kom igång

Kom igång med tjänstidentifiering i .NET genom att installera NuGet-paketet Microsoft.Extensions.ServiceDiscovery .

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Mer information finns i dotnet add package or Manage package dependencies in .NET applications (Dotnet add package or Manage package dependencies in .NET applications).

Exempel på användning

I den Program.cs filen i projektet anropar du AddServiceDiscovery tilläggsmetoden för att lägga till tjänstidentifiering till värden och konfigurerar standardlösning för tjänstslutpunkter:

builder.Services.AddServiceDiscovery();

Lägg till tjänstidentifiering till en individ IHttpClientBuilder genom att anropa AddServiceDiscovery tilläggsmetoden:

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

Du kan också lägga till tjänstidentifiering i alla HttpClient instanser som standard:

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

Schemaval vid matchning av HTTP-slutpunkter

Det är vanligt att använda HTTP när du utvecklar och testar en tjänst lokalt och HTTPS när tjänsten distribueras. Service Discovery stöder detta genom att tillåta att en prioritetslista med URI-scheman anges i indatasträngen som ges till Service Discovery. Service Discovery försöker lösa tjänsterna för scheman i ordning och stoppas när en slutpunkt har hittats. URI-scheman avgränsas med ett + tecken, till exempel: "https+http://basket". Service Discovery försöker först hitta HTTPS-slutpunkter för "basket" tjänsten och återgår sedan till HTTP-slutpunkter. Om någon HTTPS-slutpunkt hittas innehåller Inte Tjänstidentifiering HTTP-slutpunkter.

Scheman kan filtreras genom att AllowedSchemes konfigurera egenskaperna och AllowAllSchemesServiceDiscoveryOptions. Egenskapen AllowAllSchemes används för att ange att alla scheman är tillåtna. Som standard AllowAllSchemes är true och alla scheman tillåts. Scheman kan begränsas genom att ange AllowAllSchemes och lägga till false tillåtna scheman i AllowedSchemes egenskapen. Om du till exempel bara vill tillåta HTTPS:

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

Om du uttryckligen vill tillåta alla scheman anger du ServiceDiscoveryOptions.AllowAllSchemes egenskapen till true:

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

Lösa tjänstslutpunkter från konfiguration

Tilläggsmetoden AddServiceDiscovery lägger till en konfigurationsbaserad slutpunktslösare som standard. Den här matcharen läser slutpunkter från .NET-konfigurationssystemet. Biblioteket stöder konfiguration via appsettings.json, miljövariabler eller någon annan IConfiguration källa.

Här är ett exempel som visar hur du konfigurerar slutpunkter för tjänsten med namnet catalog via appsettings.json:

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

Föregående exempel lägger till två slutpunkter för tjänsten med namnet catalog: https://localhost:8080, och "https://10.46.24.90:80". Varje gång katalogen har lösts väljs en av dessa slutpunkter.

Om tjänstidentifiering har lagts till i värden med hjälp av AddServiceDiscoveryCore tilläggsmetoden på IServiceCollectionkan den konfigurationsbaserade slutpunktslösaren läggas till genom att anropa AddConfigurationServiceEndpointProvider tilläggsmetoden på IServiceCollection.

Konfiguration

Konfigurationslösaren konfigureras med hjälp av ConfigurationServiceEndpointProviderOptions klassen, som erbjuder följande konfigurationsalternativ:

  • SectionName: Namnet på konfigurationsavsnittet som innehåller tjänstslutpunkter. Standardvärdet är "Services".

  • ApplyHostNameMetadata: Ett ombud som används för att avgöra om metadata för värdnamn ska tillämpas på lösta slutpunkter. Den är som standard en funktion som returnerar false.

Om du vill konfigurera de här alternativen kan du använda Configure tilläggsmetoden i IServiceCollection programmets Startup klass eller Program fil:

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

I föregående exempel visas hur du anger ett anpassat avsnittsnamn för tjänstslutpunkterna och tillhandahåller anpassad villkorslogik för att tillämpa metadata för värdnamn.

Lösa tjänstslutpunkter med hjälp av tjänstidentifiering som tillhandahålls av plattformen

Vissa plattformar, till exempel Azure Container Apps och Kubernetes (när de konfigureras i enlighet med detta), erbjuder funktioner för tjänstidentifiering utan att kräva ett klientbibliotek för tjänstidentifiering. I de fall där ett program distribueras i sådana miljöer kan det vara fördelaktigt att använda plattformens inbyggda funktioner. Genomströmningslösaren är utformad för att underlätta det här scenariot. Det möjliggör användning av alternativa matchare, till exempel konfiguration, i olika miljöer, till exempel en utvecklardator. Det är viktigt att den här flexibiliteten uppnås utan att det behövs några kodändringar eller implementering av villkorliga vakter.

Genomströmningslösningen utför ingen extern lösning och löser i stället slutpunkter genom att returnera namnet på indatatjänsten som representeras som en DnsEndPoint.

Direktprovidern konfigureras som standard när du lägger till tjänstidentifiering via AddServiceDiscovery tilläggsmetoden.

Om tjänstidentifiering har lagts till i värden med hjälp av AddServiceDiscoveryCore tilläggsmetoden på IServiceCollectionkan direktprovidern läggas till genom att anropa tilläggsmetoden på AddPassThroughServiceEndpointProviderIServiceCollection.

Se även