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 AllowAllSchemes
false
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:8080
a "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
.