事件
.NET 中的服務探索
在本文中,您將了解如何使用 Microsoft.Extensions.ServiceDiscovery
程式庫。 服務探索是開發人員使用邏輯名稱而非實體位址 (IP 位址和連接埠) 來參考外部服務的方式。
若要開始使用 .NET 中的服務探索,請安裝 Microsoft.Extensions.ServiceDiscovery NuGet 套件。
dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease
如需詳細資訊,請參閱 dotnet add package 或在 .NET 應用程式中管理套件相依性。
在專案的 Program.cs 檔案中,呼叫 AddServiceDiscovery 擴充方法以將服務探索新增至主機,並設定預設服務端點解析器:
builder.Services.AddServiceDiscovery();
藉由呼叫 AddServiceDiscovery
擴充方法,將服務探索新增至個人 IHttpClientBuilder:
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,以及在部署服務時使用 HTTPS。 服務探索支援這項功能,方法是允許在提供給服務探索的輸入字串中指定 URI 配置的優先順序清單。 服務探索會嘗試依序解析配置的服務,並在找到端點之後停止。 URI 配置會以 +
字元分隔,例如:"https+http://basket"
。 服務探索會先嘗試尋找 "basket"
服務的 HTTPS 端點,然後回復為 HTTP 端點。 如果找到任何 HTTPS 端點,服務探索將不會包含 HTTP 端點。
在 ServiceDiscoveryOptions
上設定 AllowedSchemes
和 AllowAllSchemes
屬性,即可篩選配置。 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
為名為 catalog 的服務設定端點:
{
"Services": {
"catalog": {
"https": [
"localhost:8080",
"10.46.24.90:80"
]
}
}
}
此範例會為名為 catalog 的服務新增兩個端點:https://localhost:8080
和 "https://10.46.24.90:80"
。 每次解析 catalog 時,都會選取其中一個端點。
如果使用 IServiceCollection 上的 AddServiceDiscoveryCore 擴充方法將服務探索新增至主機,則可以在 IServiceCollection
上呼叫 AddConfigurationServiceEndpointProvider 擴充方法來新增以組態為基礎的端點解析器。
組態解析器是使用 ConfigurationServiceEndpointProviderOptions 類別來設定,其提供下列組態選項:
SectionName:包含服務端點的組態區段名稱。 其預設為
"Services"
。ApplyHostNameMetadata:用來判斷主機名稱中繼資料是否應套用至已解析端點的委派。 它會預設為傳回
false
的函式。
若要設定這些選項,您可以在應用程式 Startup
類別或 Program
檔案內的 IServiceCollection
上使用 Configure
擴充方法:
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
擴充方法新增服務探索時,預設會設定傳遞提供者。
如果使用 IServiceCollection
上的 AddServiceDiscoveryCore
擴充方法將服務探索新增至主機,則可以在 IServiceCollection
上呼叫 AddPassThroughServiceEndpointProvider 擴充方法來新增傳遞提供者。
其他資源
訓練
模組
在 ASP.NET Core 中設定具有相依性插入的服務 - Training
了解並實作 ASP.NET Core 應用程式中的相依性插入。 使用 ASP.NET Core 的內建服務容器來管理相依性。 向服務容器註冊服務。