閱讀英文

共用方式為


.NET 中的服務探索

在本文中,您將了解如何使用 Microsoft.Extensions.ServiceDiscovery 程式庫。 服務探索是開發人員使用邏輯名稱而非實體位址 (IP 位址和連接埠) 來參考外部服務的方式。

開始使用

若要開始使用 .NET 中的服務探索,請安裝 Microsoft.Extensions.ServiceDiscovery NuGet 套件。

.NET CLI
dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

如需詳細資訊,請參閱 dotnet add package在 .NET 應用程式中管理套件相依性

使用方式範例

在專案的 Program.cs 檔案中,呼叫 AddServiceDiscovery 擴充方法以將服務探索新增至主機,並設定預設服務端點解析器:

C#
builder.Services.AddServiceDiscovery();

藉由呼叫 AddServiceDiscovery 擴充方法,將服務探索新增至個人 IHttpClientBuilder

C#
builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
    {
        client.BaseAddress = new("https://catalog");
    })
    .AddServiceDiscovery();

或者,根據預設,您可以將服務探索新增至所有 HttpClient 執行個體:

C#
builder.Services.ConfigureHttpClientDefaults(static http =>
{
    // Turn on service discovery by default
    http.AddServiceDiscovery();
});

解析 HTTP(S) 端點時的配置選取項目

通常會在本機開發和測試服務時使用 HTTP,以及在部署服務時使用 HTTPS。 服務探索支援這項功能,方法是允許在提供給服務探索的輸入字串中指定 URI 配置的優先順序清單。 服務探索會嘗試依序解析配置的服務,並在找到端點之後停止。 URI 配置會以 + 字元分隔,例如:"https+http://basket"。 服務探索會先嘗試尋找 "basket" 服務的 HTTPS 端點,然後回復為 HTTP 端點。 如果找到任何 HTTPS 端點,服務探索將不會包含 HTTP 端點。

ServiceDiscoveryOptions 上設定 AllowedSchemesAllowAllSchemes 屬性,即可篩選配置。 AllowAllSchemes 屬性可用來指出允許所有配置。 根據預設,AllowAllSchemestrue 且允許所有配置。 將 AllowAllSchemes 設定為 false 並將允許的配置新增至 AllowedSchemes 屬性,即可限制配置。 例如,只允許 HTTPS:

C#
services.Configure<ServiceDiscoveryOptions>(options =>
{
    options.AllowAllSchemes = false;
    options.AllowedSchemes = ["https"];
});

若要明確允許所有配置,請將 ServiceDiscoveryOptions.AllowAllSchemes 屬性設定為 true

C#
services.Configure<ServiceDiscoveryOptions>(
    options => options.AllowAllSchemes = true);

從組態解析服務端點

AddServiceDiscovery 擴充方法預設會新增以組態為基礎的端點解析器。 此解析器會從 .NET 組態系統讀取端點。 程式庫支援透過 appsettings.json、環境變數或任何其他 IConfiguration 來源進行設定。

以下範例示範如何透過 appsettings.json 為名為 catalog 的服務設定端點:

JSON
{
  "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 擴充方法:

C#
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 擴充方法來新增傳遞提供者。

另請參閱