Обнаружение служб в .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
все схемы. Схемы можно ограничить путем установки AllowAllSchemes
false
и добавления разрешенных схем в 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
расширения.