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 add package Microsoft.Extensions.ServiceDiscovery --prerelease

Další informace naleznete v tématu dotnet add package or Manage package dependencies in .NET applications.

Příklad využití

V souboru Program.cs projektu zavolejte metodu AddServiceDiscovery rozšíření, která přidá do hostitele zjišťování služby a nakonfiguruje výchozí překladače koncových bodů služby:

builder.Services.AddServiceDiscovery();

Přidejte zjišťování služby k jednotlivci IHttpClientBuilder voláním AddServiceDiscovery metody rozšíření:

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 překladu koncových bodů HTTP

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í vyřešit služby pro schémata v pořadí a zastaví se po nalezení koncového bodu. 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í do koncových bodů 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í AllowAllSchemes jsou true povolená 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 AddServiceDiscovery rozšíření ve výchozím nastavení přidá překladač koncových bodů založený na konfiguraci. Tento překladač čte koncové body z konfiguračního systému .NET. Knihovna podporuje konfiguraci prostřednictvím appsettings.json, proměnných prostředí nebo jakéhokoli jiného IConfiguration zdroje.

Tady je příklad ukazující, jak nakonfigurovat koncové body pro katalog služby prostřednictvímappsettings.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í, jestli se mají metadata názvu hostitele použít pro přeložené koncové body. Výchozí hodnota funkce, která vrací false.

Ke konfiguraci těchto možností můžete použít metodu Configure rozšíření v IServiceCollection rámci třídy nebo Program souboru vaší aplikaceStartup:

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 oddílu 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 překladačů, jako je konfigurace, v různých prostředích, jako je počítač 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žby přidáno do hostitele pomocí AddServiceDiscoveryCore metody rozšíření na IServiceCollection, předávací zprostředkovatel lze přidat voláním AddPassThroughServiceEndpointProvider metody rozšíření na IServiceCollection.

Viz také