Udostępnij za pośrednictwem


Odnajdywanie usługi na platformie .NET

Z tego artykułu dowiesz się, jak używać Microsoft.Extensions.ServiceDiscovery biblioteki. Odnajdywanie usług to sposób, aby deweloperzy używali nazw logicznych zamiast adresów fizycznych (adres IP i port) w celu odwoływania się do usług zewnętrznych.

Rozpocznij

Aby rozpocząć odnajdywanie usług na platformie .NET, zainstaluj pakiet NuGet Microsoft.Extensions.ServiceDiscovery .

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Lub, jeśli używasz zestawu .NET 10+ SDK:

dotnet package add Microsoft.Extensions.ServiceDiscovery --prerelease

Aby uzyskać więcej informacji, zobacz dotnet package add or Manage package dependencies in .NET applications (Dodawanie pakietów dotnet lub zarządzanie zależnościami pakietów w aplikacjach platformy .NET).

Przykładowe użycie

W pliku Program.cs projektu wywołaj metodę rozszerzającą AddServiceDiscovery, aby dodać odnajdywanie usług do hosta, konfigurując domyślne rozwiązania punktów końcowych usługi:

builder.Services.AddServiceDiscovery();

Aby dodać odnajdywanie usług do IHttpClientBuilder, wywołaj metodę rozszerzenia AddServiceDiscovery.

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

Możesz też domyślnie dodać odnajdywanie usług do wszystkich HttpClient wystąpień:

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

Wybór schematu podczas rozwiązywania punktów końcowych HTTP(S)

Często używa się protokołu HTTP podczas opracowywania i testowania usługi lokalnie i HTTPS podczas wdrażania usługi. Funkcja Service Discovery wspiera to, umożliwiając określenie priorytetowej listy schematów URI w danym ciągu wejściowym. Odkrywanie usług podejmie próbę rozpoznania usług dla schematów w ustalonej kolejności i zatrzyma się po znalezieniu punktu końcowego. Schematy identyfikatorów URI są oddzielone znakiem + , na przykład: "https+http://basket". Odnajdywanie usługi najpierw spróbuje znaleźć punkty końcowe HTTPS dla "basket" usługi, a następnie powróci do punktów końcowych HTTP. Jeśli zostanie znaleziony jakikolwiek punkt końcowy HTTPS, odnajdywanie usługi nie będzie zawierać punktów końcowych HTTP.

Schematy można filtrować, konfigurując właściwości AllowedSchemes i AllowAllSchemes na ServiceDiscoveryOptions. Właściwość AllowAllSchemes służy do wskazywania, że wszystkie schematy są dozwolone. Domyślnie AllowAllSchemes to true, a wszystkie schematy są dozwolone. Schematy mogą być ograniczone przez ustawienie AllowAllSchemes na false oraz dodanie dozwolonych schematów do właściwości AllowedSchemes. Aby na przykład zezwolić tylko na protokół HTTPS:

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

Aby jawnie zezwolić na wszystkie schematy, ustaw ServiceDiscoveryOptions.AllowAllSchemes właściwość na true:

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

Rozwiązywanie problemów z punktami końcowymi usługi z konfiguracji

Metoda AddServiceDiscovery rozszerzenia domyślnie dodaje program rozpoznawania punktów końcowych oparty na konfiguracji. Ten program rozpoznawania kodu odczytuje punkty końcowe z systemu konfiguracji platformy .NET. Biblioteka obsługuje konfigurację za pośrednictwem appsettings.json, zmiennych środowiskowych lub dowolnego innego IConfiguration źródła.

Oto przykład pokazujący sposób konfigurowania punktów końcowych dla usługi o nazwie catalog za pomocą polecenia appsettings.json:

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

W poprzednim przykładzie dodano dwa punkty końcowe dla usługi o nazwie catalog: https://localhost:8080i "https://10.46.24.90:80". Za każdym razem, gdy wykaz jest rozpoznawany, wybierany jest jeden z tych punktów końcowych.

Jeśli odnajdywanie usługi zostało dodane do hosta przy użyciu metody rozszerzenia AddServiceDiscoveryCore w kontekście IServiceCollection, można dodać rozpoznawanie punktów końcowych oparte na konfiguracji, wywołując metodę rozszerzenia AddConfigurationServiceEndpointProvider w pliku IServiceCollection.

Konfiguracja

Program rozpoznawania konfiguracji jest skonfigurowany przy użyciu ConfigurationServiceEndpointProviderOptions klasy , która oferuje następujące opcje konfiguracji:

  • SectionName: nazwa sekcji konfiguracji, która zawiera punkty końcowe usługi. Wartość domyślna to "Services".

  • ApplyHostNameMetadata: delegat używany do określania, czy metadane nazwy hosta powinny być stosowane do rozpoznanych punktów końcowych. Domyślnie jest to funkcja zwracająca wartość false.

Aby skonfigurować te opcje, możesz użyć metody rozszerzenia Configure w klasie IServiceCollection lub pliku Startup w klasie Program aplikacji:

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

W poprzednim przykładzie przedstawiono ustawienie niestandardowej nazwy sekcji dla punktów końcowych usługi oraz zastosowanie dedykowanej logiki warunkowej do stosowania metadanych nazwy hosta.

Rozwiązywanie problemów z punktami końcowymi usługi przy użyciu odnajdywania usług udostępnianych przez platformę

Niektóre platformy, takie jak Azure Container Apps i Kubernetes (skonfigurowane odpowiednio), oferują funkcje odnajdywania usług bez konieczności biblioteki klienta odnajdywania usługi. W przypadkach, gdy aplikacja jest wdrażana w takich środowiskach, korzystanie z wbudowanych funkcji platformy może być korzystne. Rozwiązanie rozpoznawania przekazywanego zostało zaprojektowane w celu ułatwienia tego scenariusza. Umożliwia wykorzystanie alternatywnych rozwiązań rozpoznawania, takich jak konfiguracja, w różnych środowiskach, takich jak maszyna dewelopera. Co ważne, ta elastyczność jest osiągana bez konieczności modyfikacji kodu ani implementacji funkcji ochrony warunkowej.

Rozwiązywacz typu "pass-through" nie wykonuje rozpoznawania zewnętrznego i zamiast tego rozwiązuje punkty końcowe, zwracając nazwę usługi wejściowej reprezentowaną jako DnsEndPoint.

Dostawca pośredniczący jest domyślnie konfigurowany podczas dodawania odkrywania usług za pośrednictwem metody rozszerzenia AddServiceDiscovery.

Jeśli odnajdywanie usługi zostało dodane do hosta przy użyciu metody rozszerzenia AddServiceDiscoveryCore na IServiceCollection, można dodać dostawcę passthrough przez wywołanie metody rozszerzenia AddPassThroughServiceEndpointProvider na IServiceCollection.

Zobacz też