Sdílet prostřednictvím


Aspire Přehled sítí vnitřních smyček

Jednou z výhod vývoje s Aspire využitím 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 Aspire , který vašim aplikacím umožňuje vzájemně komunikovat ve vašem vývojovém prostředí. V tomto článku se dozvíte, jak Aspire řešit 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í. 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 soubor launchSettings.json) 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 určit koncové body, na které webový server Kestrel naslouchá. Koncové body Kestrel můžete nakonfigurovat v nastavení aplikace a 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: Aspire automaticky spustí proxy server pro každou vazbu služby, kterou přidáte do aplikace, a přiřadí port pro proxy server, 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 Aspire služby zahrnuje dvě integrace: služba představující externí prostředek, který vaše aplikace vyžaduje (například databázi, frontu zpráv nebo rozhraní API) a vazbu , která vytvoří připojení mezi vaší aplikací a službou a poskytne potřebné informace.

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, ať už implicitní nebo explicitní, Aspire spustí reverzní proxy server na zadaném portu. Tento server zajišťuje směrování a vyrovnávání zatížení pro požadavky z vaší aplikace do služby. Proxy server je Aspire implementační detail, který nevyžaduje žádnou konfiguraci ani obavy o správu.

Abyste mohli vizualizovat, jak koncové body fungují, zvažte síťový diagram Aspire úvodních šablon pro vnitřní smyčky:

Aspire Diagram síťového propojení vnitřní smyčky vzorové aplikace Starter.

Jak se spravují kontejnerové sítě

Když přidáte jeden nebo více prostředků kontejneru, Aspire vytvoří vyhrazenou mostovou síť kontejnerů, která umožní zjišťování služeb mezi kontejnery. Tato mostová síť je virtuální síť, která umožňuje kontejnerům komunikovat mezi sebou a poskytuje DNS server pro zjišťování služeb mezi kontejnery pomocí názvů DNS.

Životnost sítě závisí na prostředcích kontejneru:

  • Pokud mají všechny kontejnery životnost relace, síť je také založená na relaci a při ukončení procesu AppHost se vyčistí.
  • Pokud má některý kontejner trvalou životnost, síť je trvalá a zůstane spuštěná po ukončení procesu AppHost. Aspire znovu použije tuto síť při následných spuštěních, což umožňuje trvalé kontejnery komunikovat i v případě, že appHost není spuštěný.

Další informace o životnosti kontejnerů najdete v tématu Životnost prostředků kontejneru.

Tady jsou zásady vytváření názvů pro sítě kontejnerů:

  • Sítě relací: aspire-session-network-<unique-id>-<app-host-name>
  • Trvalé sítě: aspire-persistent-network-<project-hash>-<app-host-name>

Každá instance AppHost získá vlastní síťové prostředky. Jedinými rozdíly jsou životnost a název sítě; zjišťování služeb funguje stejně pro oba.

Kontejnery se zaregistrují v síti pomocí názvu prostředku. Aspire používá tento název pro zjišťování služeb mezi kontejnery. Například pgadmin kontejner se může připojit k databázovému prostředku s názvem postgres pomocí postgres:5432.

Note

Hostitelské služby, jako jsou projekty nebo jiné spustitelné soubory, nepoužívají kontejnerové sítě. Spoléhají na vystavené porty kontejneru pro zjišťování služeb a komunikaci s kontejnery. Další podrobnosti o zjišťování služeb najdete v přehledu zjišťování služeb.

Spouštěcí profily

Když zavoláte AddProject, AppHost vyhledá Properties/launchSettings.json k určení výchozí sady koncových bodů. AppHost vybere konkrétní spouštěcí profil pomocí následujících pravidel:

  1. Explicitní launchProfileName argument předaný při volání AddProject.
  2. Proměnná prostředí DOTNET_LAUNCH_PROFILE. Další informace najdete v tématu .NET proměnných prostředí.
  3. 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 applicationUrl hodnoty pro oba v souboru launchSettings.json. 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);

Important

Pokud neexistuje žádný launchSettings.json (nebo profil spuštění), nejsou ve výchozím nastavení žádné vazby.

Další informace najdete v Aspire a profilech spuštění.

Koncové body Kestrel nakonfigurované

Aspire podporuje konfiguraci koncového bodu Kestrel. Představte si například soubor appsettings.json pro projekt, 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ý server ASP.NET Core Kestrel.

S nakonfigurovaným koncovým bodem Kestrel by měl projekt odebrat všechny nakonfigurované applicationUrl ze souboru launchSettings.json.

Note

applicationUrl Pokud se nachází v souboru launchSettings.json a koncový bod Kestrel je nakonfigurovaný, AppHost 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 souboru launchSettings.json:

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:

Aspire diagram sítě front-endových aplikací s konkrétním portem hostitele a dvěma replikami

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í WithReplicasexistuje 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.

Aspire Síťový diagram front-endových aplikací s konkrétním portem hostitele a náhodným portem

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:

Aspire diagram sítě front-endových aplikací s konkrétním portem hostitele a portem proměnné prostředí

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.

Tip

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, 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:

Aspire diagram síťových aplikací front-endu s náhodným portem hostitele a portem proxy serveru

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.
  • Frontendová služba naslouchá na portu 65001, který je náhodně vybrán.

Kontejnerové přístavy

Když přidáte prostředek kontejneru, Aspire automaticky přiřadí kontejneru 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 frontendz obrazu mcr.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:

Aspire diagram sítě front-endových aplikací s hostitelem Dockeru

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. Spotřebitel odkazuje na tento konečný bod jménem, 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, který je předcházen sentinelem _. Jedná se o konvenci, která označuje, že segment admin je název koncového bodu, který patří apiservice službě. Další informace najdete v tématu Aspire zjišťová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.

Tip

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.

Pro více informací se podívejte na dostupné vlastnosti EndpointAnnotation.

Filtrování koncových bodů

Všechny Aspire koncové body zdrojů projektu se řídí sadou výchozích heuristik. Některé koncové body jsou zahrnuty v ASPNETCORE_URLS během běhu, některé jsou publikovány jako HTTP/HTTPS_PORTSa 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í.