Servicedetectie in .NET
In dit artikel leert u hoe u de Microsoft.Extensions.ServiceDiscovery
bibliotheek gebruikt. Servicedetectie is een manier voor ontwikkelaars om logische namen te gebruiken in plaats van fysieke adressen (IP-adres en poort) om te verwijzen naar externe services.
Aan de slag
Installeer het NuGet-pakket Microsoft.Extensions.ServiceDiscovery om aan de slag te gaan met servicedetectie in .NET.
dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease
Zie dotnet-pakket toevoegen of pakketafhankelijkheden beheren in .NET-toepassingen voor meer informatie.
Voorbeeld van gebruik
Roep in het Program.cs bestand van uw project de AddServiceDiscovery extensiemethode aan om servicedetectie toe te voegen aan de host, waarbij standaard resolvers voor service-eindpunten worden geconfigureerd:
builder.Services.AddServiceDiscovery();
Voeg servicedetectie toe aan een persoon IHttpClientBuilder door de AddServiceDiscovery
extensiemethode aan te roepen:
builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
{
client.BaseAddress = new("https://catalog");
})
.AddServiceDiscovery();
U kunt ook standaard servicedetectie toevoegen aan alle HttpClient exemplaren:
builder.Services.ConfigureHttpClientDefaults(static http =>
{
// Turn on service discovery by default
http.AddServiceDiscovery();
});
Schemaselectie bij het omzetten van HTTP(S)-eindpunten
Het is gebruikelijk om HTTP te gebruiken tijdens het lokaal ontwikkelen en testen van een service en HTTPS wanneer de service wordt geïmplementeerd. Service Discovery ondersteunt dit door een prioriteitslijst met URI-schema's op te geven in de invoerreeks die aan Service Discovery wordt gegeven. ServiceDetectie probeert de services voor de schema's op volgorde op te lossen en stopt nadat een eindpunt is gevonden. URI-schema's worden gescheiden door een +
teken, bijvoorbeeld: "https+http://basket"
. Service Discovery probeert eerst HTTPS-eindpunten voor de "basket"
service te vinden en valt vervolgens terug op HTTP-eindpunten. Als er een HTTPS-eindpunt wordt gevonden, bevat Service Discovery geen HTTP-eindpunten.
Schema's kunnen worden gefilterd door de AllowedSchemes
en AllowAllSchemes
eigenschappen op ServiceDiscoveryOptions
te configureren. De AllowAllSchemes
eigenschap wordt gebruikt om aan te geven dat alle schema's zijn toegestaan. AllowAllSchemes
Standaard zijn alle true
schema's toegestaan. Schema's kunnen worden beperkt door toegestane schema's in false
te stellen AllowAllSchemes
en toe te voegen aan de AllowedSchemes
eigenschap. Als u bijvoorbeeld alleen HTTPS wilt toestaan:
services.Configure<ServiceDiscoveryOptions>(options =>
{
options.AllowAllSchemes = false;
options.AllowedSchemes = ["https"];
});
Als u alle schema's expliciet wilt toestaan, stelt u de ServiceDiscoveryOptions.AllowAllSchemes
eigenschap in op true
:
services.Configure<ServiceDiscoveryOptions>(
options => options.AllowAllSchemes = true);
Service-eindpunten oplossen vanuit configuratie
Met de AddServiceDiscovery
extensiemethode wordt standaard een op configuratie gebaseerde eindpunt-resolver toegevoegd.
Deze resolver leest eindpunten uit het .NET-configuratiesysteem. De bibliotheek ondersteunt configuratie via appsettings.json, omgevingsvariabelen of een andere IConfiguration bron.
Hier volgt een voorbeeld waarin wordt gedemonstreerd hoe u eindpunten configureert voor de service met de naam catalogus via appsettings.json
:
{
"Services": {
"catalog": {
"https": [
"localhost:8080",
"10.46.24.90:80"
]
}
}
}
In het voorgaande voorbeeld worden twee eindpunten toegevoegd voor de service met de naam catalogus: https://localhost:8080
en "https://10.46.24.90:80"
. Telkens wanneer de catalogus wordt opgelost, wordt een van deze eindpunten geselecteerd.
Als servicedetectie aan de host is toegevoegd met behulp van de AddServiceDiscoveryCore extensiemethode, IServiceCollectionkan de op configuratie gebaseerde eindpunt-resolver worden toegevoegd door de AddConfigurationServiceEndpointProvider extensiemethode aan te roepen op IServiceCollection
.
Configuratie
De configuratie-resolver wordt geconfigureerd met behulp van de ConfigurationServiceEndpointProviderOptions klasse, die deze configuratieopties biedt:
SectionName: de naam van de configuratiesectie die service-eindpunten bevat. Deze wordt standaard ingesteld op
"Services"
.ApplyHostNameMetadata: een gemachtigde die wordt gebruikt om te bepalen of metagegevens van de hostnaam moeten worden toegepast op opgeloste eindpunten. Deze functie wordt standaard ingesteld op een functie die wordt geretourneerd
false
.
Als u deze opties wilt configureren, kunt u de Configure
extensiemethode gebruiken voor de IServiceCollection
klasse of Program
het bestand van Startup
uw toepassing:
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");
};
});
In het voorgaande voorbeeld ziet u hoe u een aangepaste sectienaam instelt voor uw service-eindpunten en aangepaste voorwaardelijke logica biedt voor het toepassen van metagegevens van de hostnaam.
Service-eindpunten oplossen met behulp van door het platform geleverde servicedetectie
Bepaalde platforms, zoals Azure Container Apps en Kubernetes (indien geconfigureerd dienovereenkomstig), bieden servicedetectiemogelijkheden zonder dat hiervoor een clientbibliotheek voor servicedetectie nodig is. In gevallen waarin een toepassing in dergelijke omgevingen wordt geïmplementeerd, kan het gebruik van de ingebouwde functionaliteit van het platform voordelig zijn. De passthrough-resolver is ontworpen om dit scenario te vergemakkelijken. Het maakt het gebruik van alternatieve resolvers, zoals configuratie, mogelijk in verschillende omgevingen, zoals de computer van een ontwikkelaar. Belangrijk is dat deze flexibiliteit wordt bereikt zonder dat codewijzigingen of de implementatie van voorwaardelijke bewakers nodig zijn.
De passthrough-resolver voert geen externe resolutie uit en lost in plaats daarvan eindpunten op door de naam van de invoerservice te retourneren die wordt weergegeven als een DnsEndPoint.
De passthrough-provider wordt standaard geconfigureerd bij het toevoegen van servicedetectie via de AddServiceDiscovery
extensiemethode.
Als servicedetectie aan de host is toegevoegd met behulp van de AddServiceDiscoveryCore
extensiemethode ingeschakeldIServiceCollection
, kan de passthrough-provider worden toegevoegd door de AddPassThroughServiceEndpointProvider extensiemethode aan te roepen.IServiceCollection