Freigeben über


Dienstermittlung in .NET

In diesem Artikel erfahren Sie, wie Sie die Microsoft.Extensions.ServiceDiscovery Bibliothek verwenden. Die Dienstermittlung ist eine Möglichkeit für Entwickler, logische Namen anstelle physischer Adressen (IP-Adresse und Port) zu verwenden, um auf externe Dienste zu verweisen.

Loslegen

Um mit der Dienstermittlung in .NET zu beginnen, installieren Sie das Microsoft.Extensions.ServiceDiscovery NuGet-Paket.

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Oder, wenn Sie .NET 10+ SDK verwenden:

dotnet package add Microsoft.Extensions.ServiceDiscovery --prerelease

Weitere Informationen finden Sie unter dotnet package add or Manage package dependencies in .NET applications.

Anwendungsbeispiel

Rufen Sie in der Datei Program.cs Ihres Projekts die AddServiceDiscovery-Erweiterungsmethode auf, um dem Host eine Dienstermittlung hinzuzufügen und konfigurieren Sie Standardauflöser für Dienstendpunkte:

builder.Services.AddServiceDiscovery();

Fügen Sie einer einzelnen IHttpClientBuilder die Dienstermittlung hinzu, indem Sie die AddServiceDiscovery-Erweiterungsmethode aufrufen:

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

Alternativ können Sie die Dienstermittlung standardmäßig allen HttpClient Instanzen hinzufügen:

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

Schemaauswahl beim Auflösen von HTTP(S)-Endpunkten

Es ist üblich, HTTP beim Entwickeln und Testen eines Diensts lokal und HTTPS zu verwenden, wenn der Dienst bereitgestellt wird. Die Dienstermittlung unterstützt dies, indem eine Prioritätsliste von URI-Schemas in der eingabezeichenfolge angegeben werden kann, die der Dienstermittlung zugewiesen wird. Die Dienstermittlung versucht, die Dienste für die Schemata der Reihe nach aufzulösen, und hält an, nachdem ein Endpunkt gefunden wurde. URI-Schemas werden durch ein + Zeichen getrennt, z. B.: "https+http://basket". Die Dienstermittlung versucht zunächst, HTTPS-Endpunkte für den "basket" Dienst zu finden und dann auf HTTP-Endpunkte zurückzugreifen. Wenn ein HTTPS-Endpunkt gefunden wird, enthält die Dienstermittlung keine HTTP-Endpunkte.

Schemas können gefiltert werden, indem die Eigenschaften AllowedSchemes und AllowAllSchemes auf ServiceDiscoveryOptions konfiguriert werden. Die AllowAllSchemes Eigenschaft wird verwendet, um anzugeben, dass alle Schemas zulässig sind. Standardmäßig ist AllowAllSchemestrue, und alle Schemata sind zulässig. Schemen können durch Festlegen von AllowAllSchemes auf false und Hinzufügen zulässiger Schemen zur Eigenschaft AllowedSchemes eingeschränkt werden. So lassen Sie z. B. nur HTTPS zu:

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

Um alle Schemas explizit zuzulassen, legen Sie die ServiceDiscoveryOptions.AllowAllSchemes Eigenschaft auf :true

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

Auflösen von Dienstendpunkten aus der Konfiguration

Die AddServiceDiscovery Erweiterungsmethode fügt standardmäßig einen konfigurationsbasierten Endpunktlöser hinzu. Dieser Resolver liest Endpunkte aus dem .NET-Konfigurationssystem. Die Bibliothek unterstützt die Konfiguration über appsettings.json, Umgebungsvariablen oder eine beliebige andere IConfiguration Quelle.

Hier ist ein Beispiel, das veranschaulicht, wie Endpunkte für den Dienst namens Katalog über appsettings.json konfiguriert werden:

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

Im vorangehenden Beispiel werden zwei Endpunkte für den Dienst catalog hinzugefügt: https://localhost:8080, und "https://10.46.24.90:80". Jedes Mal, wenn der Katalog aufgelöst wird, wird einer dieser Endpunkte ausgewählt.

Wenn die Dienstermittlung mithilfe der AddServiceDiscoveryCore Erweiterungsmethode IServiceCollectionzum Host hinzugefügt wurde, kann der konfigurationsbasierte Endpunktlöser durch Aufrufen der AddConfigurationServiceEndpointProvider Erweiterungsmethode IServiceCollectionhinzugefügt werden.

Konfiguration

Der Konfigurationslöser wird mithilfe der ConfigurationServiceEndpointProviderOptions Klasse konfiguriert, die folgende Konfigurationsoptionen bietet:

  • SectionName: Der Name des Konfigurationsabschnitts, der Dienstendpunkte enthält. Es ist standardmäßig "Services".

  • ApplyHostNameMetadata: Ein Delegat, der verwendet wird, um zu bestimmen, ob Hostnamenmetadaten auf aufgelöste Endpunkte angewendet werden sollen. Standardmäßig ist es eine Funktion, die false zurückgibt.

Um diese Optionen zu konfigurieren, können Sie die Configure Erweiterungsmethode in der IServiceCollection Ihrer Anwendungsklasse Startup oder in der Program Datei verwenden.

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

Im vorherigen Beispiel wird das Festlegen eines benutzerdefinierten Abschnittsnamens für Ihre Dienstendpunkte und die Bereitstellung einer benutzerdefinierten bedingten Logik zum Anwenden von Hostnamenmetadaten veranschaulicht.

Auflösen von Dienstendpunkten mithilfe der von der Plattform bereitgestellten Dienstermittlung

Bestimmte Plattformen, z. B. Azure Container-Apps und Kubernetes (wenn sie entsprechend konfiguriert sind), bieten Dienstermittlungsfunktionen, ohne dass eine Dienstermittlungsclientbibliothek erforderlich ist. In Fällen, in denen eine Anwendung in solchen Umgebungen bereitgestellt wird, kann die Verwendung der integrierten Funktionalität der Plattform vorteilhaft sein. Der Pass-Through-Resolver wurde entwickelt, um dieses Szenario zu vereinfachen. Es ermöglicht die Verwendung alternativer Resolver, z. B. konfiguration, in verschiedenen Umgebungen, z. B. auf dem Computer eines Entwicklers. Wichtig ist, dass diese Flexibilität erreicht wird, ohne dass Codeänderungen oder die Implementierung von bedingten Schutzvorrichtungen erforderlich sind.

Der Pass-Through-Resolver führt keine externe Auflösung durch und löst stattdessen Endpunkte auf, indem er den Namen des Eingabediensts zurückgibt, der als DnsEndPoint dargestellt wird.

Der Passthrough-Anbieter wird standardmäßig konfiguriert, wenn die Dienstermittlung über die AddServiceDiscovery-Erweiterungsmethode hinzugefügt wird.

Wenn die Dienstermittlung mithilfe der AddServiceDiscoveryCore-Erweiterungsmethode zum Host mithilfe von IServiceCollection hinzugefügt wurde, kann der Passthrough-Anbieter durch Aufrufen der AddPassThroughServiceEndpointProvider-Erweiterungsmethode hinzugefügt IServiceCollection werden.

Siehe auch