Tjänstidentifiering i .NET
I den här artikeln får du lära dig hur du använder Microsoft.Extensions.ServiceDiscovery
biblioteket. Tjänstidentifiering är ett sätt för utvecklare att använda logiska namn i stället för fysiska adresser (IP-adress och port) för att referera till externa tjänster.
Kom igång
Kom igång med tjänstidentifiering i .NET genom att installera NuGet-paketet Microsoft.Extensions.ServiceDiscovery .
dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease
Mer information finns i dotnet add package or Manage package dependencies in .NET applications (Dotnet add package or Manage package dependencies in .NET applications).
Exempel på användning
I den Program.cs filen i projektet anropar du AddServiceDiscovery tilläggsmetoden för att lägga till tjänstidentifiering till värden och konfigurerar standardlösning för tjänstslutpunkter:
builder.Services.AddServiceDiscovery();
Lägg till tjänstidentifiering till en individ IHttpClientBuilder genom att anropa AddServiceDiscovery
tilläggsmetoden:
builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
{
client.BaseAddress = new("https://catalog");
})
.AddServiceDiscovery();
Du kan också lägga till tjänstidentifiering i alla HttpClient instanser som standard:
builder.Services.ConfigureHttpClientDefaults(static http =>
{
// Turn on service discovery by default
http.AddServiceDiscovery();
});
Schemaval vid matchning av HTTP-slutpunkter
Det är vanligt att använda HTTP när du utvecklar och testar en tjänst lokalt och HTTPS när tjänsten distribueras. Service Discovery stöder detta genom att tillåta att en prioritetslista med URI-scheman anges i indatasträngen som ges till Service Discovery. Service Discovery försöker lösa tjänsterna för scheman i ordning och stoppas när en slutpunkt har hittats. URI-scheman avgränsas med ett +
tecken, till exempel: "https+http://basket"
. Service Discovery försöker först hitta HTTPS-slutpunkter för "basket"
tjänsten och återgår sedan till HTTP-slutpunkter. Om någon HTTPS-slutpunkt hittas innehåller Inte Tjänstidentifiering HTTP-slutpunkter.
Scheman kan filtreras genom att AllowedSchemes
konfigurera egenskaperna och AllowAllSchemes
på ServiceDiscoveryOptions
. Egenskapen AllowAllSchemes
används för att ange att alla scheman är tillåtna. Som standard AllowAllSchemes
är true
och alla scheman tillåts. Scheman kan begränsas genom att ange AllowAllSchemes
och lägga till false
tillåtna scheman i AllowedSchemes
egenskapen. Om du till exempel bara vill tillåta HTTPS:
services.Configure<ServiceDiscoveryOptions>(options =>
{
options.AllowAllSchemes = false;
options.AllowedSchemes = ["https"];
});
Om du uttryckligen vill tillåta alla scheman anger du ServiceDiscoveryOptions.AllowAllSchemes
egenskapen till true
:
services.Configure<ServiceDiscoveryOptions>(
options => options.AllowAllSchemes = true);
Lösa tjänstslutpunkter från konfiguration
Tilläggsmetoden AddServiceDiscovery
lägger till en konfigurationsbaserad slutpunktslösare som standard.
Den här matcharen läser slutpunkter från .NET-konfigurationssystemet. Biblioteket stöder konfiguration via appsettings.json, miljövariabler eller någon annan IConfiguration källa.
Här är ett exempel som visar hur du konfigurerar slutpunkter för tjänsten med namnet catalog via appsettings.json
:
{
"Services": {
"catalog": {
"https": [
"localhost:8080",
"10.46.24.90:80"
]
}
}
}
Föregående exempel lägger till två slutpunkter för tjänsten med namnet catalog: https://localhost:8080
, och "https://10.46.24.90:80"
. Varje gång katalogen har lösts väljs en av dessa slutpunkter.
Om tjänstidentifiering har lagts till i värden med hjälp av AddServiceDiscoveryCore tilläggsmetoden på IServiceCollectionkan den konfigurationsbaserade slutpunktslösaren läggas till genom att anropa AddConfigurationServiceEndpointProvider tilläggsmetoden på IServiceCollection
.
Konfiguration
Konfigurationslösaren konfigureras med hjälp av ConfigurationServiceEndpointProviderOptions klassen, som erbjuder följande konfigurationsalternativ:
SectionName: Namnet på konfigurationsavsnittet som innehåller tjänstslutpunkter. Standardvärdet är
"Services"
.ApplyHostNameMetadata: Ett ombud som används för att avgöra om metadata för värdnamn ska tillämpas på lösta slutpunkter. Den är som standard en funktion som returnerar
false
.
Om du vill konfigurera de här alternativen kan du använda Configure
tilläggsmetoden i IServiceCollection
programmets Startup
klass eller Program
fil:
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");
};
});
I föregående exempel visas hur du anger ett anpassat avsnittsnamn för tjänstslutpunkterna och tillhandahåller anpassad villkorslogik för att tillämpa metadata för värdnamn.
Lösa tjänstslutpunkter med hjälp av tjänstidentifiering som tillhandahålls av plattformen
Vissa plattformar, till exempel Azure Container Apps och Kubernetes (när de konfigureras i enlighet med detta), erbjuder funktioner för tjänstidentifiering utan att kräva ett klientbibliotek för tjänstidentifiering. I de fall där ett program distribueras i sådana miljöer kan det vara fördelaktigt att använda plattformens inbyggda funktioner. Genomströmningslösaren är utformad för att underlätta det här scenariot. Det möjliggör användning av alternativa matchare, till exempel konfiguration, i olika miljöer, till exempel en utvecklardator. Det är viktigt att den här flexibiliteten uppnås utan att det behövs några kodändringar eller implementering av villkorliga vakter.
Genomströmningslösningen utför ingen extern lösning och löser i stället slutpunkter genom att returnera namnet på indatatjänsten som representeras som en DnsEndPoint.
Direktprovidern konfigureras som standard när du lägger till tjänstidentifiering via AddServiceDiscovery
tilläggsmetoden.
Om tjänstidentifiering har lagts till i värden med hjälp av AddServiceDiscoveryCore
tilläggsmetoden på IServiceCollection
kan direktprovidern läggas till genom att anropa tilläggsmetoden på AddPassThroughServiceEndpointProviderIServiceCollection
.