.NET .NET Aspire belső hurok hálózatkezelésének áttekintése
A .NET.NET Aspire fejlesztés egyik előnye, hogy lehetővé teszi a natív felhőbeli alkalmazások helyi fejlesztését, tesztelését és hibakeresését. A belső hurkos hálózatkezelés a .NET.NET Aspire kulcsfontosságú eleme, amely lehetővé teszi az alkalmazások számára, hogy kommunikáljanak egymással a fejlesztési környezetben. Ebből a cikkből megtudhatja, hogyan kezeli a .NET.NET Aspire különböző hálózati forgatókönyveket proxykkal, végpontokkal, végpontkonfigurációkkal és indítási profilokkal.
Hálózatépítés a belső hurokban
A belső hurok az alkalmazás helyi fejlesztésének és tesztelésének folyamata, mielőtt üzembe helyeznénk egy célkörnyezetben. .NET .NET Aspire számos eszközt és funkciót kínál a belső hurok hálózatkezelési élményének egyszerűsítéséhez és javításához, például:
- Profilok indítása: Az indítási profilok olyan konfigurációs fájlok, amelyek meghatározzák az alkalmazás helyi futtatásának módját. Az alkalmazás végpontjainak, környezeti változóinak és indítási beállításainak meghatározásához indítási profilokat (például launchSettings.json fájlt) használhat.
- Kestrel-konfiguráció: A Kestrel-konfiguráció lehetővé teszi a Kestrel-webkiszolgáló által figyelt végpontok megadását. Az alkalmazásbeállításokban konfigurálhatja a Kestrel-végpontokat, és .NET.NET Aspire automatikusan ezeket a beállításokat használja végpontok létrehozásához.
- végpontok/végpontkonfigurációk: A végpontok az alkalmazás és az attól függő szolgáltatások, például adatbázisok, üzenetsorok vagy API-k közötti kapcsolatok. A végpontok olyan információkat nyújtanak, mint a szolgáltatásnév, a gazdagépport, a séma és a környezeti változó. A végpontokat implicit módon (indítási profilokon keresztül) vagy explicit módon is hozzáadhatja az alkalmazáshoz WithEndpointmeghívásával.
- Proxyk: .NET.NET Aspire automatikusan elindít egy proxyt az alkalmazáshoz hozzáadott minden szolgáltatási kötéshez, és hozzárendel egy portot a proxyhoz, amelyre figyelhet. A proxy ezután továbbítja a kéréseket arra a portra, amelyre az alkalmazás figyel, ami eltérhet a proxyporttól. Így elkerülheti a portütközéseket, és konzisztens és kiszámítható URL-címekkel érheti el az alkalmazást és a szolgáltatásokat.
A végpontok működése
A .NET.NET Aspire szolgáltatáskötése két integrációt foglal magában: egy szolgáltatás egy külső erőforrást jelöl, amelyet az alkalmazás igényel (például egy adatbázist, üzenetsort vagy API-t), valamint egy kötési, amely kapcsolatot hoz létre az alkalmazás és a szolgáltatás között, és biztosítja a szükséges információkat.
.NET .NET Aspire két szolgáltatáskötési típust támogat: implicit, automatikusan létrejön a különböző környezetekben az alkalmazás viselkedését meghatározó meghatározott indítási profilok alapján, és explicit, amelyeket manuálisan hoztak létre a WithEndpointhasználatával.
Kötés létrehozásakor , akár implicit, akár explicit, .NET.NET Aspire elindít egy egyszerűsített fordított proxyt egy adott porton, amely kezeli az alkalmazástól a szolgáltatáshoz érkező kérések útválasztását és terheléselosztását. A proxy egy .NET.NET Aspire megvalósítási részlet, amely nem igényel konfigurációt vagy felügyeleti problémát.
A végpontok működésének szemléltetéséhez tekintse meg az .NET.NET Aspire kezdősablonok belső hurkos hálózatkezelési diagramját:
Profilok indítása
Amikor meghívja AddProject-t, az alkalmazás gazdagépe a Tulajdonságok/launchSettings.json-at keresi az alapértelmezett végpontkészlet meghatározásához. Az alkalmazás gazda az alábbi szabályok alapján választ ki egy adott indítási profilt:
- Explicit
launchProfileName
argumentum lett átadvaAddProject
hívásakor. - A
DOTNET_LAUNCH_PROFILE
környezeti változó. További információ: .NET környezeti változók. - Az első indítási profil a launchSettings.json-ban van definiálva.
Vegye figyelembe a következő launchSettings.json fájlt:
{
"$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"
}
}
}
}
A cikk további részében képzeljük el, hogy létrehozott egy IDistributedApplicationBuilder-t, amely hozzá van rendelve a builder
nevű változóhoz a CreateBuilder() API-val.
var builder = DistributedApplication.CreateBuilder(args);
A http és https indítási profilok megadásához konfigurálja a applicationUrl
értékeket mindkettőben a launchSettings.json fájlban. Ezek az URL-címek végpontok létrehozására szolgálnak ehhez a projekthez. Ez a következő egyenértékű:
builder.AddProject<Projects.Networking_Frontend>("frontend")
.WithHttpEndpoint(port: 5066)
.WithHttpsEndpoint(port: 7239);
Fontos
Ha nincs launchSettings.json (vagy indítási profil), nincsenek kötődések alapértelmezésként.
További információ: .NET.NET Aspire és profilok indítása.
Kestrel által konfigurált végpontok
.NET .NET Aspire támogatja a Kestrel végpontkonfigurációját. Fontolja meg például egy olyan projekt appsettings.json fájljának használatát, amely egy Kestrel-végpontot definiál a HTTPS-sémával és az 5271-s porttal:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://*:5271"
}
}
}
}
Az előző konfiguráció egy Https
végpontot határoz meg. A Url
tulajdonság értéke https://*:5271
, ami azt jelenti, hogy a végpont a 5271-es porton minden interfészen figyel. További információ: Végpontok konfigurálása a ASP.NET Core Kestrel-webkiszolgáló.
Ha a Kestrel-végpont konfigurálva van, a projektnek el kell távolítania a konfigurált applicationUrl
a launchSettings.json fájlból.
Jegyzet
Ha a applicationUrl
megtalálható a launchSettings.json fájlban, és a Kestrel-végpont konfigurálva van, az alkalmazásgazda kivételt fog eredményezni.
Projekterőforrás hozzáadásakor van egy túlterhelési lehetőség, amely lehetővé teszi, hogy a Kestrel-végpont legyen használva a launchSettings.json fájl helyett:
builder.AddProject<Projects.Networking_ApiService>(
name: "apiservice",
configure: static project =>
{
project.ExcludeLaunchProfile = true;
project.ExcludeKestrelEndpoints = false;
})
.WithHttpsEndpoint();
További információ: AddProject.
Portok és proxyk
Szolgáltatáskötés definiálásakor a gazdaport mindig a szolgáltatás előtt ülő proxynak. Ez lehetővé teszi, hogy egy szolgáltatás egy vagy több replikája hasonlóan viselkedjen. Emellett az WithReference API-t használó összes erőforrásfüggőség a környezeti változó proxyvégpontjára támaszkodik.
Vegye figyelembe a következő metódusláncot, amely meghívja AddProject, WithHttpEndpoint, majd WithReplicas:
builder.AddProject<Projects.Networking_Frontend>("frontend")
.WithHttpEndpoint(port: 5066)
.WithReplicas(2);
Az előző kód a következő hálózati diagramot eredményezi:
Az előző diagram a következőket ábrázolja:
- Egy webböngésző az alkalmazás belépési pontjaként.
- 5066-os gazdagép port.
- A böngésző és az előtérbeli szolgáltatás replikái között ülő előtérproxy az 5066-os portot figyeli.
- A
frontend_0
előtérbeli szolgáltatásreplika figyeli a véletlenszerűen hozzárendelt 65001-s portot. - A
frontend_1
előtérbeli szolgáltatásreplika figyeli a véletlenszerűen hozzárendelt 65002-s portot.
A WithReplicas
hívása nélkül csak egy front-end szolgáltatás létezik. A proxy továbbra is az 5066-os porton figyel, de az előtérbeli szolgáltatás egy véletlenszerű porton figyel:
builder.AddProject<Projects.Networking_Frontend>("frontend")
.WithHttpEndpoint(port: 5066);
Két port van definiálva:
- 5066-os gazdagép port.
- Egy véletlenszerű proxyport, amelyhez a mögöttes szolgáltatás hozzá lesz kötve.
Az előző diagram a következőket ábrázolja:
- Egy webböngésző az alkalmazás belépési pontjaként.
- 5066-os gazdagép port.
- A böngésző és az előtérbeli szolgáltatás között ülő előtérproxy, amely az 5066-os portot figyeli.
- Az előtérbeli szolgáltatás figyeli a 65001 véletlenszerű portot.
A szolgáltatás számára ezt a portot a ASPNETCORE_URLS
-on keresztül biztosítják a projekterőforrások. Más erőforrások hozzáférése ehhez a porthoz egy környezeti változó megadásával a szolgáltatáskötésen:
builder.AddNpmApp("frontend", "../NodeFrontend", "watch")
.WithHttpEndpoint(port: 5067, env: "PORT");
Az előző kód elérhetővé teszi a véletlenszerű portot a PORT
környezeti változóban. Az alkalmazás ezzel a porttal figyeli a proxy bejövő kapcsolatait. Fontolja meg a következő diagramot:
Az előző diagram a következőket ábrázolja:
- Egy webböngésző az alkalmazás belépési pontjaként.
- Egy 5067-es gazdagépport.
- A böngésző és az előtérbeli szolgáltatás között ülő előtérproxy, amely az 5067-ös portot figyeli.
- A frontend szolgáltatás a 65001-es portot figyeli.
Borravaló
A végpont proxiálásának elkerülése érdekében állítsa a IsProxied
tulajdonságot false
a WithEndpoint
kiterjesztési metódusának meghívásakor. További információ: Végpontbővítmények: további szempontok.
A gazdagépport kihagyása
Ha kihagyja a gazdagépportot, .NET.NET Aspire véletlenszerű portot hoz létre mind a gazdagép, mind a szolgáltatásport számára. Ez akkor hasznos, ha el szeretné kerülni a portütközéseket, és nem érdekli a gazdagép vagy a szolgáltatási port. Vegye figyelembe a következő kódot:
builder.AddProject<Projects.Networking_Frontend>("frontend")
.WithHttpEndpoint();
Ebben a forgatókönyvben mind a gazdagép, mind a szolgáltatás portjai véletlenszerűek, ahogy az alábbi ábrán is látható.
Az előző diagram a következőket ábrázolja:
- Egy webböngésző az alkalmazás belépési pontjaként.
- Egy véletlenszerű gazdaport, 65000.
- A böngésző és az előtérbeli szolgáltatás között ülő előtérproxy, amely a 65000-s portot figyeli.
- Az előtérbeli szolgáltatás 65001 véletlenszerű porton figyel.
Tárolóportok
Tárolóerőforrás hozzáadásakor .NET.NET Aspire automatikusan hozzárendel egy véletlenszerű portot a tárolóhoz. Tárolóport megadásához konfigurálja a tárolóerőforrást a kívánt porttal:
builder.AddContainer("frontend", "mcr.microsoft.com/dotnet/samples", "aspnetapp")
.WithHttpEndpoint(port: 8000, targetPort: 8080);
Az előző kód:
- Létrehoz egy
frontend
nevű tárolóerőforrást amcr.microsoft.com/dotnet/samples:aspnetapp
lemezképből. - Egy
http
végpontot tesz elérhetővé, ha a gazdagépet a 8000-s porthoz köti, és megfelelteti a tároló 8080-ra.
Fontolja meg a következő diagramot:
Végpontkiterjesztési módszerek
A IResourceWithEndpoints interfészt megvalósító összes erőforrás használhatja a WithEndpoint
bővítménymetelyeket. Ennek a bővítménynek több túlterhelésű verziója is van, amelyek lehetővé teszik, hogy megadja a sémát, a konténers portot, a gazdagépportot, a környezeti változó nevét, valamint azt, hogy a végpont proxy-n keresztül elérhető-e.
Van egy túlterhelés is, amely lehetővé teszi egy delegált megadását a végpont konfigurálásához. Ez akkor hasznos, ha a végpontot a környezet vagy más tényezők alapján kell konfigurálni. Vegye figyelembe a következő kódot:
builder.AddProject<Projects.Networking_ApiService>("apiService")
.WithEndpoint(
endpointName: "admin",
callback: static endpoint =>
{
endpoint.Port = 17003;
endpoint.UriScheme = "http";
endpoint.Transport = "http";
});
Az előző kód egy visszahívási meghatalmazottat biztosít a végpont konfigurálásához. A végpont neve admin
, és a http
séma és átvitel, valamint az 17003-as gazdagépport használatára van konfigurálva. A fogyasztó név szerint hivatkozik erre a végpontra, vegye figyelembe a következő AddHttpClient
hívást:
builder.Services.AddHttpClient<WeatherApiClient>(
client => client.BaseAddress = new Uri("http://_admin.apiservice"));
A Uri
a admin
sentinel előtaggal ellátott _
végpontnév használatával jön létre. Ez a konvenció azt jelzi, hogy a admin
szegmens a apiservice
szolgáltatáshoz tartozó végpontnév. További információért lásd: .NET.NET Aspire szolgáltatásfelderítés.
További szempontok
A WithEndpoint
bővítmény metódus meghívásakor a callback
túlterhelése elérhetővé teszi a nyers EndpointAnnotation, amely lehetővé teszi a fogyasztó számára a végpont számos aspektusának testreszabását.
A AllocatedEndpoint
tulajdonság lehetővé teszi a szolgáltatás végpontjának lekérését vagy beállítását. A IsExternal
és a IsProxied
tulajdonságai határozzák meg a végpont kezelését és a közzétételt: IsExternal
dönti el, hogy nyilvánosan elérhető-e, míg IsProxied
biztosítja a DCP kezelését, lehetővé téve a belső portkülönbségeket és replikációt.
Borravaló
Ha olyan külső végrehajtható fájlt üzemeltet, amely a saját proxyját futtatja, és portkötési problémákba ütközik, mert a DCP már megköti a portot, próbálja meg a IsProxied
tulajdonságot false
értékre állítani. Ez megakadályozza, hogy a DCP kezelje a proxyt, így a végrehajtható fájl sikeresen megkötheti a portot.
A Name
tulajdonság azonosítja a szolgáltatást, míg a Port
és a TargetPort
tulajdonságok határozzák meg a kívánt és a figyelési portokat.
A hálózati kommunikációhoz a Protocol
tulajdonság támogatja TCP és UDP-, és a Transport
tulajdonság a átviteli protokollt (HTTP, HTTP2, HTTP3) jelöli. Végül, ha a szolgáltatás URI-címezhető, a UriScheme
tulajdonság biztosítja az URI-sémát a szolgáltatás URI-jának létrehozására.
További információkért tekintse meg a EndpointAnnotation tulajdonságokelérhető tulajdonságait.
Végpontszűrés
Az összes .NET.NET Aspire projekterőforrás-végpont alapértelmezett heurisztikus halmazt követ. Egyes végpontok a futásidőben a ASPNETCORE_URLS
-ban jelennek meg, néhányat közzétesznek HTTP/HTTPS_PORTS
formájában, és egyes konfigurációkat a Kestrel konfigurációból oldanak fel. Az alapértelmezett viselkedéstől függetlenül szűrheti a környezeti változókban szereplő végpontokat a WithEndpointsInEnvironment bővítménymetódus használatával:
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";
});
Az előző kód hozzáad egy alapértelmezett HTTPS-végpontot, valamint egy admin
végpontot az 19227-as porton. A admin
végpont azonban ki van zárva a környezeti változókból. Ez akkor hasznos, ha csak belső használatra szeretne végpontot elérhetővé tenni.