在本文中,您將瞭解如何使用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 來源進行配置。
以下範例示範如何透過 設定服務具名appsettings.json的端點:
{
"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的函式。
要配置這些選項,你可以在應用程式的Configure類別或IServiceCollection檔案中對Startup呼叫Program擴充方法。
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(根據設定時),提供服務探索功能,而不需要服務探索用戶端連結庫。 在這類環境中部署應用程序的情況下,使用平臺的內建功能可能比較有利。 傳遞解析器的設計目的是為了方便此場景。 它可讓您在不同的環境中使用替代解析程式,例如組態,例如開發人員的計算機。 重要的是,不需要修改任何程式代碼或實作條件式防護,即可達成此彈性。
傳遞解析程式不會執行任何外部解析,而是傳回以 表示的 DnsEndPoint輸入服務名稱來解析端點。
使用 AddServiceDiscovery 擴充方法新增服務探索時,傳遞提供者將會以預設方式設定。
如果使用 AddServiceDiscoveryCore 上的 IServiceCollection 擴充方法將服務探索新增至主機,則可以在 AddPassThroughServiceEndpointProvider 上呼叫 IServiceCollection 擴充方法來新增透過提供者。