přehled síťového propojení ve vnitřní smyčce .NET.NET Aspire
Jednou z výhod vývoje pomocí .NET.NET Aspire je, že umožňuje místně vyvíjet, testovat a ladit aplikace nativní pro cloud. Sítě vnitřních smyček jsou klíčovým aspektem .NET.NET Aspire, který umožňuje, aby vaše aplikace vzájemně komunikují ve vašem vývojovém prostředí. V tomto článku se dozvíte, jak .NET.NET Aspire zpracovávat různé síťové scénáře s proxy servery, koncovými body, konfiguracemi koncových bodů a profily spuštění.
Síťování ve vnitřní smyčce
Vnitřní smyčka je proces vývoje a testování aplikace místně před nasazením do cílového prostředí. .NET .NET Aspire poskytuje několik nástrojů a funkcí pro zjednodušení a vylepšení síťového prostředí ve vnitřní smyčce, například:
- profily spuštění: Spouštěcí profily jsou konfigurační soubory, které určují, jak aplikaci spustit místně. Profily spuštění (například launchSettings.json soubor) můžete použít k definování koncových bodů, proměnných prostředí a nastavení spuštění aplikace.
- Konfigurace Kestrel: Konfigurace Kestrel umožňuje zadat koncové body, na které naslouchá web Kestrel server. Koncové body Kestrel můžete nakonfigurovat v nastavení aplikace a .NET.NET Aspire tato nastavení automaticky použije k vytváření koncových bodů.
- Koncové body/Konfigurace koncových bodů: Koncové body jsou spojení mezi vaší aplikací a službami, na které spoléhá, jako jsou databáze, fronty zpráv nebo rozhraní API. Koncové body poskytují informace, jako je název služby, port hostitele, schéma a proměnná prostředí. Do aplikace můžete přidat koncové body implicitně (prostřednictvím profilů spuštění) nebo explicitně voláním WithEndpoint.
- proxy servery: .NET.NET Aspire automaticky spustí proxy server pro každou vazbu služby, kterou přidáte do aplikace, a přiřadí port proxy serveru, na který bude naslouchat. Proxy pak přesměruje požadavky na port, na kterém vaše aplikace naslouchá, což se může lišit od portu proxy serveru. Tímto způsobem se můžete vyhnout konfliktům portů a přistupovat k aplikacím a službám pomocí konzistentních a předvídatelných adres URL.
Jak fungují koncové body
Vazba služby v .NET.NET Aspire zahrnuje dvě integrace: službu představující externí prostředek, který vaše aplikace vyžaduje (například databáze, fronta zpráv nebo rozhraní API) a vazby, která vytváří připojení mezi vaší aplikací a službou a poskytuje potřebné informace.
.NET .NET Aspire podporuje dva typy vazeb služby: implicitní, automaticky vytvořené na základě zadaných spouštěcích profilů definující chování aplikace v různých prostředích a explicitní, ručně vytvořené pomocí WithEndpoint.
Při vytváření vazby bez ohledu na to, jestli je implicitní nebo explicitní, .NET.NET Aspire na zadaném portu spustí jednoduchý reverzní proxy server, který bude zpracovávat směrování a vyrovnávání zatížení pro požadavky z vaší aplikace do služby. Proxy je prvek implementace .NET.NET Aspire, který nevyžaduje žádné starosti s konfigurací nebo správou.
Abyste lépe pochopili, jak koncové body fungují, zvažte síťový diagram vnitřní smyčky v rámci úvodních šablon .NET.NET Aspire:
Spouštěcí profily
Při volání AddProjecthledá hostitel aplikace v Properties/launchSettingsjson pro určení výchozí sady koncových bodů. Hostitel aplikace vybere konkrétní spouštěcí profil pomocí následujících pravidel:
- Explicitní
launchProfileName
argument předaný při voláníAddProject
. - Proměnná prostředí
DOTNET_LAUNCH_PROFILE
. Další informace najdete v tématu .NET proměnných prostředí. - První profil spuštění definovaný v launchSettings.json.
Zvažte následující launchSettings.json soubor:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "https://localhost:7239;http://localhost:5066",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Ve zbývající části tohoto článku si představte, že jste vytvořili IDistributedApplicationBuilder přiřazenou k proměnné s názvem builder
pomocí rozhraní CreateBuilder() API:
var builder = DistributedApplication.CreateBuilder(args);
Pokud chcete zadat profily spuštění http a https, nakonfigurujte hodnoty applicationUrl
pro oba v launchSettingsjson souboru. Tyto adresy URL slouží k vytváření koncových bodů pro tento projekt. Toto je ekvivalent:
builder.AddProject<Projects.Networking_Frontend>("frontend")
.WithHttpEndpoint(port: 5066)
.WithHttpsEndpoint(port: 7239);
Důležitý
Pokud neexistuje žádný launchSettings.json (nebo profil spuštění), ve výchozím nastavení neexistují žádné vazby.
Další informace naleznete v .NET.NET Aspire a v profilech spouštění.
Koncové body Kestrel nakonfigurované
Konfiguraci koncového bodu Kestrel podporuje .NET.NET Aspire. Představte si například nastavení aplikace.json soubor projektu, který definuje koncový bod Kestrel se schématem HTTPS a portem 5271:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://*:5271"
}
}
}
}
Předchozí konfigurace určuje koncový bod Https
. Vlastnost Url
je nastavená na https://*:5271
, což znamená, že koncový bod naslouchá na všech rozhraních na portu 5271. Další informace najdete v tématu Konfigurace koncových bodů pro webový ASP.NET CoreserverKestrel.
U nakonfigurovaného koncového bodu Kestrel by měl projekt z launchSettings odebrat všechny nakonfigurované applicationUrl
.json soubor.
Poznámka
Pokud se applicationUrl
nachází v souboru launchSettings.json a koncový bod Kestrel je nakonfigurovaný, hostitel aplikace vyvolá výjimku.
Když přidáte zdroj projektu, dojde k přetížení, které vám umožní určit, že koncový bod Kestrel se má použít místo launchSettings.json soubor:
builder.AddProject<Projects.Networking_ApiService>(
name: "apiservice",
configure: static project =>
{
project.ExcludeLaunchProfile = true;
project.ExcludeKestrelEndpoints = false;
})
.WithHttpsEndpoint();
Další informace najdete v tématu AddProject.
Porty a proxy
Při definování vazby služby je port hostitele vždy předán proxy serveru, který je umístěn před službou. To umožňuje, aby se jedna nebo více replik služby chovala podobně. Kromě toho všechny závislosti zdrojů, které používají rozhraní API WithReference, využívají koncový bod proxy serveru z proměnných prostředí.
Zvažte následující řetěz metod, který volá AddProject, WithHttpEndpointa pak WithReplicas:
builder.AddProject<Projects.Networking_Frontend>("frontend")
.WithHttpEndpoint(port: 5066)
.WithReplicas(2);
Předchozí kód vede k následujícímu síťovému diagramu:
Předchozí diagram znázorňuje následující:
- Webový prohlížeč jako vstupní bod do aplikace.
- Hostitelský port 5066.
- Front-endový proxy server, který se nachází mezi webovým prohlížečem a replikami front-endové služby, naslouchá na portu 5066.
- Replika front-endové služby
frontend_0
naslouchá na náhodně přiřazeném portu 65001. - Replika frontendové služby
frontend_1
naslouchá na portu 65002, který byl přiřazen náhodně.
Bez volání WithReplicas
existuje pouze jedna front-endová služba. Proxy server stále naslouchá na portu 5066, ale front-endová služba naslouchá na náhodném portu:
builder.AddProject<Projects.Networking_Frontend>("frontend")
.WithHttpEndpoint(port: 5066);
Jsou definovány dva porty:
- Hostitelský port 5066.
- Náhodný proxy port, ke kterému bude podkladová služba vázána.
Předchozí diagram znázorňuje následující:
- Webový prohlížeč jako vstupní bod do aplikace.
- Hostitelský port 5066.
- Front-endový proxy server, který se nachází mezi webovým prohlížečem a front-endovou službou, naslouchá na portu 5066.
- Front-endová služba naslouchá na náhodném portu 65001.
Podkladové službě je tento port předán prostřednictvím ASPNETCORE_URLS
pro projektové zdroje. K tomuto portu mohou přistupovat další prostředky zadáním proměnné prostředí v rámci vazby služby.
builder.AddNpmApp("frontend", "../NodeFrontend", "watch")
.WithHttpEndpoint(port: 5067, env: "PORT");
Předchozí kód zpřístupní náhodný port v proměnné prostředí PORT
. Aplikace používá tento port k naslouchání příchozím připojením z proxy serveru. Představte si následující diagram:
Předchozí diagram znázorňuje následující:
- Webový prohlížeč jako vstupní bod do aplikace.
- Hostitelský port 5067.
- Front-endový proxy server, který se nachází mezi webovým prohlížečem a front-endovou službou, naslouchá na portu 5067.
- Frontendová služba naslouchající na prostředí 65001.
Rada
Aby se koncový bod neproxioval, nastavte vlastnost IsProxied
na false
při volání metody rozšíření WithEndpoint
. Další informace najdete v tématu Rozšíření koncového bodu: další důležité informace.
Vynechání portu hostitele
Když vynecháte port hostitele, .NET.NET Aspire vygeneruje náhodný port pro port hostitele i služby. To je užitečné, když se chcete vyhnout konfliktům portů a nezajímá vás port hostitele nebo služby. Vezměte v úvahu následující kód:
builder.AddProject<Projects.Networking_Frontend>("frontend")
.WithHttpEndpoint();
V tomto scénáři jsou porty hostitele i služby náhodné, jak je znázorněno v následujícím diagramu:
Předchozí diagram znázorňuje následující:
- Webový prohlížeč jako vstupní bod do aplikace.
- Náhodně vybraný hostitelský port číslo 65000.
- Front-endový proxy server sedící mezi webovým prohlížečem a front-endovou službou a naslouchá na portu 65000.
- Front-endová služba naslouchá na náhodném portu 65001.
Kontejnerové přístavy
Když přidáte prostředek kontejneru, .NET.NET Aspire kontejneru automaticky přiřadí náhodný port. Pokud chcete zadat port kontejneru, nakonfigurujte prostředek kontejneru s požadovaným portem:
builder.AddContainer("frontend", "mcr.microsoft.com/dotnet/samples", "aspnetapp")
.WithHttpEndpoint(port: 8000, targetPort: 8080);
Předchozí kód:
- Vytvoří prostředek kontejneru s názvem
frontend
z obrazumcr.microsoft.com/dotnet/samples:aspnetapp
. - Vystaví koncový bod
http
tím, že připojí hostitelský port 8000 a namapuje ho na port 8080 kontejneru.
Představte si následující diagram:
Metody rozšíření koncového bodu
Jakýkoli prostředek, který implementuje rozhraní IResourceWithEndpoints, může používat metody rozšíření WithEndpoint
. Toto rozšíření má několik variant, které vám umožní zadat schéma, port kontejneru, port hostitele, název proměnné prostředí a to, zda je koncový bod používán přes proxy.
Existuje také přetížení, které umožňuje zadat delegáta ke konfiguraci koncového bodu. To je užitečné, když potřebujete nakonfigurovat koncový bod na základě prostředí nebo jiných faktorů. Vezměte v úvahu následující kód:
builder.AddProject<Projects.Networking_ApiService>("apiService")
.WithEndpoint(
endpointName: "admin",
callback: static endpoint =>
{
endpoint.Port = 17003;
endpoint.UriScheme = "http";
endpoint.Transport = "http";
});
Předchozí kód poskytuje delegáta callbacku pro konfiguraci koncového bodu. Koncový bod má název admin
a nakonfiguruje se tak, aby používal schéma http
a přenos a také port hostitele 17003. Příjemce odkazuje na tento koncový bod podle názvu, zvažte následující volání AddHttpClient
:
builder.Services.AddHttpClient<WeatherApiClient>(
client => client.BaseAddress = new Uri("http://_admin.apiservice"));
Uri
se sestaví pomocí názvu koncového bodu admin
s předponou _
sentinelu. Jedná se o konvenci, která označuje, že segment admin
je název koncového bodu, který patří apiservice
službě. Další informace naleznete v tématu .NET.NET Aspire vyhledávání služeb.
Další důležité informace
Při volání metody rozšíření WithEndpoint
, přetížení callback
zpřístupňuje nezpracované EndpointAnnotation, což uživateli umožňuje přizpůsobit mnoho aspektů koncového bodu.
Vlastnost AllocatedEndpoint
umožňuje získat nebo nastavit koncový bod pro službu. Vlastnosti IsExternal
a IsProxied
určují způsob správy a zveřejnění koncového bodu: IsExternal
rozhodne, jestli má být veřejně přístupný, zatímco IsProxied
zajišťuje, že ho DCP spravuje, což umožňuje interní rozdíly portů a replikaci.
Rada
Pokud hostujete externí spustitelný soubor, který spouští vlastní proxy server, a dochází k problémům s vazbou portů kvůli tomu, že dcP už tento port váže, zkuste nastavit vlastnost IsProxied
na false
. To zabraňuje DCP ve správě proxy, což umožňuje vašemu spustitelnému souboru úspěšně navázat port.
Vlastnost Name
identifikuje službu, zatímco vlastnosti Port
a TargetPort
určují požadované a naslouchací porty v uvedeném pořadí.
Pro síťovou komunikaci Protocol
vlastnost podporuje TCP a UDP, s potenciálem pro další v budoucnu a vlastnost Transport
označuje přenosový protokol (HTTP, HTTP2, HTTP3). Pokud je služba adresovatelná identifikátorem URI, vlastnost UriScheme
poskytuje schéma URI pro sestavení URI služby.
Další informace naleznete v dostupných vlastnostech EndpointAnnotation vlastnosti.
Filtrování koncových bodů
Všechny koncové body zdrojů projektu .NET.NET Aspire se řídí sadou výchozích heuristiky. Některé koncové body jsou zahrnuty v ASPNETCORE_URLS
během běhu, některé jsou publikovány jako HTTP/HTTPS_PORTS
a některé konfigurace jsou vyřešeny z konfigurace Kestrel. Bez ohledu na výchozí chování můžete filtrovat koncové body zahrnuté do proměnných prostředí pomocí metody rozšíření WithEndpointsInEnvironment:
builder.AddProject<Projects.Networking_ApiService>("apiservice")
.WithHttpsEndpoint() // Adds a default "https" endpoint
.WithHttpsEndpoint(port: 19227, name: "admin")
.WithEndpointsInEnvironment(
filter: static endpoint =>
{
return endpoint.Name is not "admin";
});
Předchozí kód přidá výchozí koncový bod HTTPS i koncový bod admin
na portu 19227. Koncový bod admin
je však vyloučen z proměnných prostředí. To je užitečné, když chcete zveřejnit koncový bod jenom pro interní použití.