Compartilhar via


.NET .NET Aspire service discovery

Neste artigo, você aprenderá como a descoberta de serviço funciona em um projeto de .NET.NET Aspire. .NET .NET Aspire inclui funcionalidade para configurar a descoberta de serviço durante o desenvolvimento e os testes. Service discovery functionality works by providing configuration in the format expected by the configuration-based endpoint resolver from the .NET.NET Aspire AppHost project to the individual service projects added to the application model. For more information, see Service discovery in .NET.

Descoberta de serviço implícita por referência

A configuração para descoberta de serviço só é adicionada para serviços referenciados por um determinado projeto. Por exemplo, considere o seguinte programa AppHost:

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

In the preceding example, the frontend project references the catalog project and the basket project. The two WithReference calls instruct the .NET.NET Aspire project to pass service discovery information for the referenced projects (catalog, and basket) into the frontend project.

Named endpoints

Some services expose multiple, named endpoints. Os pontos de extremidade nomeados podem ser resolvidos especificando o nome do ponto de extremidade na parte de host do URI de solicitação HTTP, seguindo o formato scheme://_endpointName.serviceName. Por exemplo, se um serviço chamado "basket" expor um ponto de extremidade chamado "dashboard", o URI https+http://_dashboard.basket poderá ser usado para especificar esse ponto de extremidade, por exemplo:

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

No exemplo anterior, duas classes HttpClient são adicionadas, uma para o serviço de cesta básica e outra para o painel do serviço de cesta.

Named endpoints using configuration

Com o resolvedor de ponto de extremidade baseado em configuração, os pontos de extremidade nomeados podem ser especificados na configuração prefixando o valor do ponto de extremidade com _endpointName., em que endpointName é o nome do ponto de extremidade. Por exemplo, considere essa configuração appsettings.json que definiu um ponto de extremidade padrão (sem nome) e um ponto de extremidade chamado "dashboard":

{
  "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 */
    }
  }
}

In the preceding JSON:

  • Ao resolver https://basket, o ponto de extremidade padrão é 10.2.3.4:8080.
  • The "dashboard" endpoint, resolved via https://_dashboard.basket is 10.2.3.4:9999.

Pontos de extremidade nomeados em .NET.NET Aspire

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

Named endpoints in Kubernetes using DNS SRV

When deploying to Kubernetes, the DNS SRV service endpoint resolver can be used to resolve named endpoints. Por exemplo, a definição de recurso a seguir resultará na criação de um registro SRV de DNS para um ponto de extremidade chamado "padrão" e um ponto de extremidade chamado "dashboard", ambos no serviço chamado "basket".

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

To configure a service to resolve the "dashboard" endpoint on the "basket" service, add the DNS SRV service endpoint resolver to the host builder as follows:

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

Para obter mais informações, consulte AddServiceDiscoveryCore e AddDnsSrvServiceEndpointProvider.

The special port name "default" is used to specify the default endpoint, resolved using the URI https://basket.

As in the previous example, add service discovery to an HttpClient for the basket service:

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

Similarly, the "dashboard" endpoint can be targeted as follows:

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

Consulte também