Sdílet prostřednictvím


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:

.NET.NET Aspire síťový diagram vnitřní smyčky šablony úvodní aplikace

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:

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

.NET.NET 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.

.NET.NET Aspire diagram síťových aplikací front-endu 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:

.NET.NET Aspire diagram síťových aplikací front-endu 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.

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:

.NET.NET Aspire síťový diagram front-endových aplikací 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.
  • 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 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:

.NET Aspire diagram front-endových síťových aplikací s hostitelem docker.

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