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.
Erste Schritte
Um mit der Dienstermittlung in .NET zu beginnen, installieren Sie das Microsoft.Extensions.ServiceDiscovery-NuGet-Paket.
dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease
Weitere Informationen finden Sie unter dotnet add package oder Verwalten von Paketabhängigkeiten in .NET-Anwendungen.
Beispielverwendung
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 zu verwenden, wenn ein Dienst lokal entwickelt und getestet wird, und HTTPS, wenn der Dienst bereitgestellt wird. Die Dienstermittlung unterstützt dies, indem sie die Angabe einer Prioritätsliste von URI-Schemata in der Eingabezeichenkette für die Dienstermittlung ermöglicht. 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 AllowAllSchemes
true
und alle Schemas sind zulässig. Schemas können durch Festlegen von AllowAllSchemes
auf false
und durch Hinzufügen zulässiger Schemas zur AllowedSchemes
-Eigenschaft 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 Endpunktauflöser hinzu.
Dieser Aufölser 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 zeigt, wie Sie Endpunkte für den Dienst namens Katalog konfigurieren über appsettings.json
:
{
"Services": {
"catalog": {
"https": [
"localhost:8080",
"10.46.24.90:80"
]
}
}
}
Im vorangehenden Beispiel werden zwei Endpunkte für den Dienst namens Katalog 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 IServiceCollection zum Host hinzugefügt wurde, kann der konfigurationsbasierte Endpunktauflöser durch Aufrufen der AddConfigurationServiceEndpointProvider-Erweiterungsmethode IServiceCollection
hinzugefügt werden.
Konfiguration
Der Konfigurationsauflö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 Hostnamen-Metadaten auf aufgelöste Endpunkte angewendet werden sollen. Standardmäßig wird eine Funktion wiedergegeben, die
false
.
Um diese Optionen zu konfigurieren, können Sie die Configure
-Erweiterungsmethode für die IServiceCollection
-Klasse oder Startup
-Datei Ihrer Program
-Anwendung 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 Bedingungslogik zum Anwenden von Hostnamen-Metadaten 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 Dienstermittlungs-Clientbibliothek 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 Passthrough-Auflöser wurde entwickelt, um dieses Szenario zu vereinfachen. Es ermöglicht die Verwendung alternativer Auflöser, 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 Passthrough-Auflöser führt keine externe Auflösung durch und löst stattdessen Endpunkte auf, indem der Name des Eingabediensts wiedergegeben wird, der als ein DnsEndPoint dargestellt ist.
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.