Freigeben über


.NET .NET Aspire Dienstermittlung

In diesem Artikel erfahren Sie, wie die Service Discovery innerhalb eines .NET.NET Aspire Projekts funktioniert. .NET .NET Aspire umfasst Funktionen zum Einrichten der Serviceerkennung während der Entwicklung und des Testens. Die Dienstermittlungsfunktionalität funktioniert, indem die Konfiguration im vom .NET.NET Aspire AppHost-Projekt erwarteten Format für den konfigurationsbasierten Endpunktlöser bereitgestellt wird. Diese Konfiguration wird an die einzelnen Dienstprojekte weitergegeben, die dem Anwendungsmodell hinzugefügt wurden. Weitere Informationen finden Sie unter Service Discovery in .NET.

Implizite Dienstermittlung über Referenz

Die Konfiguration für die Dienstermittlung wird nur für Dienste hinzugefügt, auf die von einem bestimmten Projekt verwiesen wird. Betrachten Sie beispielsweise das folgende AppHost-Programm:

var builder = DistributedApplication.CreateBuilder(args);

var catalog = builder.AddProject<Projects.CatalogService>("catalog");
var basket = builder.AddProject<Projects.BasketService>("basket");

var frontend = builder.AddProject<Projects.MyFrontend>("frontend")
                      .WithReference(basket)
                      .WithReference(catalog);

Im vorherigen Beispiel verweist das -Frontend--Projekt auf das -Katalog--Projekt und auf das -Warenkorb--Projekt. Die beiden WithReference Aufrufe weisen das .NET.NET Aspire Projekt an, Service-Discovery-Informationen für die referenzierten Projekte, denKatalogund den Korb, in das Frontend- Projekt zu übertragen.

Benannte Endpunkte

Einige Dienste machen mehrere benannte Endpunkte verfügbar. Benannte Endpunkte können aufgelöst werden, indem der Endpunktname im Hostanteil des HTTP-Anforderungs-URI, nach dem Format scheme://_endpointName.serviceName, angegeben wird. Wenn beispielsweise ein Dienst namens "basket" einen Endpunkt namens "dashboard" verfügbar macht, kann der URI-scheme+http://_dashboard.basket verwendet werden, um diesen Endpunkt anzugeben, z. B.:

builder.Services.AddHttpClient<BasketServiceClient>(
    static client => client.BaseAddress = new("https+http://basket"));

builder.Services.AddHttpClient<BasketServiceDashboardClient>(
    static client => client.BaseAddress = new("https+http://_dashboard.basket"));

Im vorherigen Beispiel werden zwei HttpClient Klassen hinzugefügt, eine für den Kernkorbdienst und eine für das Dashboard des Korbdiensts.

Benannte Endpunkte mithilfe der Konfiguration

Mit dem konfigurationsbasierten Endpunktlöser können benannte Endpunkte in der Konfiguration angegeben werden, indem dem Endpunktwert _endpointName.vorangestellt wird, wobei endpointName der Endpunktname ist. Betrachten Sie beispielsweise diese appsettings.json Konfiguration, die einen Standardendpunkt (ohne Namen) und einen Endpunkt namens "dashboard" definiert hat:

{
  "Services": {
    "basket":
      "https": "https://10.2.3.4:8080", /* the https endpoint, requested via https://basket */
      "dashboard": "https://10.2.3.4:9999" /* the "dashboard" endpoint, requested via https://_dashboard.basket */
    }
  }
}

Im vorherigen JSON:

  • Der Standardendpunkt beim Auflösen von https://basket ist 10.2.3.4:8080.
  • Der Endpunkt "Dashboard", der über https://_dashboard.basket aufgelöst wird, ist 10.2.3.4:9999.

Benannte Endpunkte in .NET.NET Aspire

var basket = builder.AddProject<Projects.BasketService>("basket")
    .WithHttpsEndpoint(hostPort: 9999, name: "dashboard");

Benannte Endpunkte in Kubernetes mit DNS SRV

Bei der Bereitstellung auf Kuberneteskann der DNS SRV-Dienstendpunkt-Auflöser verwendet werden, um benannte Endpunkte aufzulösen. Die folgende Ressourcendefinition führt beispielsweise dazu, dass sowohl für einen Endpunkt mit dem Namen "default" als auch einen Endpunkt mit dem Namen "dashboard" ein DNS-SRV-Eintrag erstellt wird, die beide zum Dienst mit dem Namen "basket" gehören.

apiVersion: v1
kind: Service
metadata:
  name: basket
spec:
  selector:
    name: basket-service
  clusterIP: None
  ports:
  - name: default
    port: 8080
  - name: dashboard
    port: 9999

Um einen Dienst so zu konfigurieren, dass der Endpunkt "dashboard" im Dienst "basket" aufgelöst wird, fügen Sie den DNS SRV-Dienstendpunkt-Resolver wie folgt zum Host-Builder hinzu:

builder.Services.AddServiceDiscoveryCore();
builder.Services.AddDnsSrvServiceEndpointProvider();

Weitere Informationen finden Sie unter AddServiceDiscoveryCore und AddDnsSrvServiceEndpointProvider.

Der spezielle Portname "default" wird verwendet, um den Standardendpunkt anzugeben, der mithilfe des URI-https://basketaufgelöst wird.

Fügen Sie, wie im vorherigen Beispiel gezeigt, eine Diensterkennung zu einer HttpClient für den Korbdienst hinzu.

builder.Services.AddHttpClient<BasketServiceClient>(
    static client => client.BaseAddress = new("https://basket"));

Ebenso kann der Endpunkt "Dashboard" wie folgt ausgerichtet werden:

builder.Services.AddHttpClient<BasketServiceDashboardClient>(
    static client => client.BaseAddress = new("https://_dashboard.basket"));

Siehe auch