通过


.NET 中的服务发现

本文介绍如何使用 Microsoft.Extensions.ServiceDiscovery 库。 服务发现是开发人员使用逻辑名称而不是物理地址(IP 地址和端口)来引用外部服务的一种方法。

开始

若要在 .NET 中开始使用服务发现,请安装 Microsoft.Extensions.ServiceDiscovery NuGet 包。

dotnet add package Microsoft.Extensions.ServiceDiscovery

或者,如果使用的是 .NET 10+ SDK:

dotnet package add Microsoft.Extensions.ServiceDiscovery

有关详细信息,请参阅 .NET 应用程序中 的 dotnet 包添加管理包依赖项

示例用法

在项目的 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上配置AllowAllSchemesServiceDiscoveryOptions属性来筛选方案。 该 AllowAllSchemes 属性用于指示允许所有方案。 默认情况下,AllowAllSchemestrue,并且所有方案都是允许的。 可以通过设置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 源进行配置。

以下是一个示例,演示如何通过 为名为 catalog 的服务配置终结点。

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

前面的示例为名为 catalog 的服务添加两个终结点: https://localhost:8080"https://10.46.24.90:80"。 每次解析 目录 时,都会选择其中一个终结点。

如果使用扩展方法AddServiceDiscoveryCore在主机IServiceCollection上添加服务发现,可以通过调用AddConfigurationServiceEndpointProvider扩展方法在IServiceCollection上添加基于配置的终结点解析程序。

配置

配置解析程序使用提供以下配置选项的 ConfigurationServiceEndpointProviderOptions 类进行配置:

  • SectionName:包含服务终结点的配置节的名称。 默认为 "Services".

  • ApplyHostNameMetadata:用于确定是否应将主机名元数据应用于解析的终结点的委托。 它默认为返回 false的函数。

若要配置这些选项,可以在应用程序的Startup 类或Program 文件中调用Configure 上的IServiceCollection 扩展方法。

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<ConfigurationServiceEndpointProviderOptions>(
    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,提供服务发现功能,无需服务发现客户端库。 在此类环境中部署应用程序的情况下,使用平台的内置功能可能很有利。 直通解析程序旨在促进此方案。 它允许在不同环境中,例如开发人员的计算机上,使用替代解析器,例如配置。 重要的是,无需进行任何代码修改或条件防护的实现,即可实现这种灵活性。

直通解析程序不执行外部解析,而是通过返回表示为 a DnsEndPoint的输入服务名称来解析终结点。

通过 AddServiceDiscovery 扩展方法添加服务发现时,系统会默认配置直通提供程序。

如果通过使用扩展方法AddServiceDiscoveryCore将服务发现添加到IServiceCollection主机,那么可以通过调用扩展方法AddPassThroughServiceEndpointProviderIServiceCollection上添加传递提供程序。

另请参阅