本文介绍如何使用 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上配置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 源进行配置。
以下是一个示例,演示如何通过
{
"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主机,那么可以通过调用扩展方法AddPassThroughServiceEndpointProvider在IServiceCollection上添加传递提供程序。