Поделиться через


Обнаружение служб в .NET

Из этой статьи вы узнаете, как использовать библиотеку Microsoft.Extensions.ServiceDiscovery . Обнаружение служб — это способ использования логических имен вместо физических адресов (IP-адресов и портов) для ссылки на внешние службы.

Начать

Чтобы приступить к обнаружению служб в .NET, установите пакет NuGet Microsoft.Extensions.ServiceDiscovery .

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

Дополнительные сведения см. в разделе dotnet add package or Manage package dependencies in .NET applications.

Пример использования

В файле Program.cs проекта вызовите AddServiceDiscovery метод расширения, чтобы добавить обнаружение служб на узел, настроив разрешения конечных точек службы по умолчанию:

builder.Services.AddServiceDiscovery();

Добавьте обнаружение служб в отдельный пользователь IHttpClientBuilder , вызвав AddServiceDiscovery метод расширения:

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

Кроме того, можно добавить обнаружение служб ко всем HttpClient экземплярам по умолчанию:

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

Выбор схемы при разрешении конечных точек HTTP(S)

Обычно при разработке и тестировании службы локально используется HTTP и HTTPS при развертывании службы. Обнаружение служб поддерживает это, позволяя указывать список приоритетных схем URI в входной строке, заданной службе Обнаружения служб. Обнаружение служб попытается разрешить службы для схем в порядке и остановится после обнаружения конечной точки. Схемы URI разделяются символом+, например: "https+http://basket" Обнаружение служб сначала попытается найти конечные точки HTTPS для "basket" службы, а затем вернуться к конечным точкам HTTP. Если обнаружена любая конечная точка HTTPS, обнаружение служб не будет включать конечные точки HTTP.

Схемы можно отфильтровать, настроив AllowedSchemes параметры и AllowAllSchemes свойства ServiceDiscoveryOptions. Свойство AllowAllSchemes используется для указания того, что разрешены все схемы. По умолчанию AllowAllSchemes разрешены true все схемы. Схемы можно ограничить путем установки AllowAllSchemesfalse и добавления разрешенных схем в AllowedSchemes свойство. Например, чтобы разрешить только HTTPS:

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

Чтобы явно разрешить все схемы, задайте ServiceDiscoveryOptions.AllowAllSchemes для свойства trueзначение :

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

Разрешение конечных точек службы из конфигурации

Метод AddServiceDiscovery расширения добавляет сопоставитель конечной точки на основе конфигурации по умолчанию. Этот сопоставитель считывает конечные точки из системы конфигурации .NET. Библиотека поддерживает настройку с помощью appsettings.json, переменных среды или любого другого IConfiguration источника.

Ниже приведен пример настройки конечных точек для именованного каталога службы с помощью appsettings.json:

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

В предыдущем примере добавляются две конечные точки для именованного каталога службы: https://localhost:8080и "https://10.46.24.90:80". Каждый раз при разрешении каталога выбирается одна из этих конечных точек.

Если обнаружение служб было добавлено на узел с помощью AddServiceDiscoveryCore метода IServiceCollectionрасширения, можно добавить сопоставитель конечных точек на основе конфигурации, вызвав AddConfigurationServiceEndpointProvider метод IServiceCollectionрасширения.

Настройка

Сопоставитель конфигурации настраивается с помощью ConfigurationServiceEndpointProviderOptions класса, который предлагает следующие параметры конфигурации:

  • SectionName: имя раздела конфигурации, содержащего конечные точки службы. По умолчанию имеет значение "Services".

  • ApplyHostNameMetadata: делегат, используемый для определения того, следует ли применять метаданные имени узла к разрешенным конечным точкам. Он по умолчанию использует функцию, возвращающую false.

Чтобы настроить эти параметры, можно использовать Configure метод расширения в IServiceCollection классе или Program файле приложенияStartup:

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

В предыдущем примере показано, как задать имя пользовательского раздела для конечных точек службы и предоставить пользовательскую условную логику для применения метаданных имени узла.

Разрешение конечных точек службы с помощью обнаружения служб, предоставляемых платформой

Некоторые платформы, такие как приложения контейнеров Azure и Kubernetes (при настройке соответствующим образом), предлагают возможности обнаружения служб без необходимости в клиентской библиотеке обнаружения служб. В случаях, когда приложение развертывается в таких средах, использование встроенной функции платформы может быть выгодной. Сопоставитель сквозной передачи предназначен для упрощения этого сценария. Он позволяет использовать альтернативные сопоставители, такие как конфигурация, в разных средах, например компьютер разработчика. Важно отметить, что эта гибкость достигается без необходимости каких-либо изменений кода или реализации условных охранников.

Сопоставитель сквозной передачи не выполняет внешнего разрешения и вместо этого разрешает конечные точки, возвращая имя входной службы, представленное как .DnsEndPoint

Поставщик сквозной передачи настраивается по умолчанию при добавлении обнаружения служб с помощью AddServiceDiscovery метода расширения.

Если обнаружение служб было добавлено на узел с помощью AddServiceDiscoveryCore метода IServiceCollectionрасширения, поставщик может быть добавлен путем вызова AddPassThroughServiceEndpointProvider метода IServiceCollectionрасширения.

См. также