Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 AllowAllSchemes
true
, 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 IServiceCollection
hinzugefü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.