Sdílet prostřednictvím


Zjišťování služeb v .NET

V tomto článku se dozvíte, jak knihovnu Microsoft.Extensions.ServiceDiscovery používat. Zjišťování služeb je způsob, jak vývojáři místo fyzických adres (IP adres a portů) používat logické názvy, které odkazují na externí služby.

Začínáme

Pokud chcete začít se zjišťováním služeb v .NET, nainstalujte balíček NuGet Microsoft.Extensions.ServiceDiscovery .

dotnet package add Microsoft.Extensions.ServiceDiscovery --prerelease

Další informace naleznete v tématu dotnet package add nebo Správa závislostí balíčků v aplikacích .NET.

Příklad využití

V souboru Program.cs vašeho projektu zavolejte metodu rozšíření k přidání služby zjišťování do hostitele a konfigurování výchozích překládacích endpointů služby.

builder.Services.AddServiceDiscovery();

Přidejte zjišťování služby k instanci IHttpClientBuilder voláním metody rozšiřující funkce AddServiceDiscovery.

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

Alternativně můžete přidat zjišťování služby do všech HttpClient instancí ve výchozím nastavení:

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

Výběr schématu při řešení koncových bodů HTTP(S)

Při místním vývoji a testování služby a protokolu HTTPS při nasazení služby je běžné používat protokol HTTP. Zjišťování služeb to podporuje tím, že umožňuje zadat seznam priorit schémat identifikátorů URI ve vstupním řetězci poskytnutém službě Zjišťování služby. Zjišťování služeb se pokusí zjistit služby pro schémata podle pořadí a zastaví se, jakmile bude nalezen koncový bod. Schémata identifikátoru URI jsou oddělena znakem + , například: "https+http://basket". Zjišťování služeb se nejprve pokusí najít koncové body HTTPS pro "basket" službu a pak se vrátí na koncové body HTTP. Pokud se najde nějaký koncový bod HTTPS, zjišťování služeb nebude obsahovat koncové body HTTP.

Schémata lze filtrovat konfigurací AllowedSchemes a AllowAllSchemes vlastností .ServiceDiscoveryOptions Vlastnost AllowAllSchemes slouží k označení, že jsou povolena všechna schémata. Ve výchozím nastavení je AllowAllSchemestrue a jsou povolena všechna schémata. Schémata mohou být omezena nastavením AllowAllSchemesfalse a přidáním povolených schémat do AllowedSchemes vlastnosti. Pokud chcete například povolit jenom HTTPS:

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

Pokud chcete explicitně povolit všechna schémata, nastavte ServiceDiscoveryOptions.AllowAllSchemes vlastnost na true:

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

Řešení koncových bodů služby z konfigurace

Metoda rozšíření AddServiceDiscovery přidává ve výchozím nastavení resolver koncových bodů založený na konfiguraci. Tento překladač čte koncové body z konfiguračního systému .NET. Konfiguraci knihovna podporuje prostřednictvím appsettings.json, proměnných prostředí nebo jakéhokoli jiného zdroje IConfiguration.

Tady je příklad ukazující, jak nakonfigurovat koncové body pro katalog služby prostřednictvím appsettings.json:

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

Předchozí příklad přidá dva koncové body pro službu s názvem catalog: https://localhost:8080a "https://10.46.24.90:80". Při každém vyřešení katalogu se vybere jeden z těchto koncových bodů.

Pokud bylo zjišťování služby přidáno do hostitele pomocí AddServiceDiscoveryCore metody rozšíření , IServiceCollectionlze překladač koncových bodů založený na konfiguraci přidat voláním AddConfigurationServiceEndpointProvider metody rozšíření na IServiceCollection.

Konfigurace

Překladač konfigurace se konfiguruje pomocí ConfigurationServiceEndpointProviderOptions třídy, která nabízí tyto možnosti konfigurace:

  • SectionName: Název oddílu konfigurace, který obsahuje koncové body služby. Výchozí hodnota je "Services".

  • ApplyHostNameMetadata: Delegát použitý k určení, zda se mají metadata názvu hostitele použít pro rozlišení koncových bodů. Výchozí hodnota funkce, která vrací false.

Pro konfiguraci těchto možností můžete použít metodu rozšíření Configure na IServiceCollection v rámci třídy Startup nebo souboru Program vaší aplikace.

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");
        };
    });

Předchozí příklad ukazuje nastavení vlastního názvu sekce pro koncové body služby a poskytnutí vlastní podmíněné logiky pro použití metadat názvu hostitele.

Řešení potíží s koncovými body služby pomocí zjišťování služeb poskytovaných platformou

Některé platformy, jako jsou Azure Container Apps a Kubernetes (pokud jsou nakonfigurované odpovídajícím způsobem), nabízejí možnosti zjišťování služeb bez nutnosti klientské knihovny zjišťování služeb. V případech, kdy je aplikace nasazená v takových prostředích, může být výhodné použít integrovanou funkci platformy. Průchozí překladač je navržený tak, aby tento scénář usnadnil. Umožňuje využití alternativních řešitelů, jako je například konfigurace, v různých prostředích, například na počítači vývojáře. Důležité je, že tato flexibilita se dosahuje bez nutnosti jakýchkoli úprav kódu nebo implementace podmíněných stráží.

Průchozí překladač neprovádí žádné externí rozlišení a místo toho překládá koncové body vrácením názvu vstupní služby reprezentované jako DnsEndPoint.

Předávací zprostředkovatel je ve výchozím nastavení nakonfigurovaný při přidávání zjišťování služby prostřednictvím AddServiceDiscovery metody rozšíření.

Pokud bylo zjišťování služeb přidáno do hostitele pomocí AddServiceDiscoveryCore metody rozšíření na IServiceCollection, lze přidat předávací zprostředkovatel voláním AddPassThroughServiceEndpointProvider metody rozšíření na IServiceCollection.

Viz také