Gyakorlat – Alkalmazásrugalmasság megvalósítása
Az eShop projekt két olyan szolgáltatással rendelkezik, amelyek HTTP-kérések használatával kommunikálnak egymással. A Store szolgáltatás meghívja a Product szolgáltatást, hogy lekérje az összes megvásárolható aktuális termék listáját.
Az alkalmazás jelenlegi verziója nem rendelkezik rugalmassági kezeléssel. Ha a Product szolgáltatás nem érhető el, a Store szolgáltatás hibát ad vissza az ügyfeleknek, és megkéri őket, hogy később próbálkozzon újra. Ez a viselkedés nem jó felhasználói élmény.
A felettese kéri, hogy adjon hozzá rugalmasságot az alkalmazáshoz, hogy a Store szolgáltatás újrapróbálkozzék a háttérszolgáltatás hívásával, ha az meghiúsul.
Ebben a gyakorlatban rugalmasságot adhat egy meglévő natív felhőbeli alkalmazáshoz, és tesztelheti a javítást.
A fejlesztői környezet megnyitása
Használhat egy GitHub-kódteret, amely a gyakorlatot üzemelteti, vagy elvégezheti a gyakorlatot helyileg a Visual Studio Code-ban.
Kódtér használatához hozzon létre egy előre konfigurált GitHub Codespace-et ezzel a kódtér-létrehozási hivatkozással.
A GitHub több percet vesz igénybe a kódtér létrehozásához és konfigurálásához. Amikor a folyamat befejeződött, megjelenik a gyakorlat kódfájljai. A modul hátralévő részében használandó kód a /dotnet-resiliency könyvtárban található.
A Visual Studio Code használatához klónozza az https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative adattárat a helyi gépre. Akkor:
- Telepítse a rendszerkövetelményeket, hogy fusson a Dev Container a Visual Studio Code-ban.
- Győződjön meg arról, hogy a Docker fut.
- Egy új Visual Studio Code-ablakban nyissa meg a klónozott adattár mappáját
- Nyomja le a CtrlShift+P+ a parancskatalógus megnyitásához.
- Keresés: >Tárolók fejlesztése: Újraépítés és újranyitás a tárolóban
- Válassza az eShopLite - dotnet-resiliency lehetőséget a legördülő menüből. A Visual Studio Code helyileg hozza létre a fejlesztési tárolót.
Az alkalmazás létrehozása és futtatása
Az alsó panelen válassza ki a TERMINÁL lapot, és futtassa a következő parancsot a kódgyökerhez:
cd dotnet-resiliencyFuttassa az alábbi parancsot az eShop-alkalmazás lemezképeinek létrehozásához:
dotnet publish /p:PublishProfile=DefaultContainerA build befejezése után futtassa a következő parancsot az alkalmazás elindításához:
docker compose upAz alsó panelen válassza a PORTok fület, majd a táblázat Továbbított cím oszlopában válassza a Megnyitás böngészőben ikont az előtérport (32000) portjához.
Ha helyileg futtatja az alkalmazást, nyisson meg egy böngészőablakot a
http://localhost:32000/productsmegtekintéséhez.Az eShop alkalmazásnak futnia kell. Válassza ki a Termékek menüelemet, ekkor megjelenik a termékek listája.
Az aktuális rugalmasság tesztelése
Állítsa le a termékszolgáltatást, hogy lássa, mi történik az alkalmazással.
Térjen vissza a kódtérhez, és a TERMINÁL lapon válassza ki + az új bash-terminál megnyitásához.
Futtassa a következő Docker-parancsot a futó tárolók listázásához:
docker psMeg kell jelennie a jelenleg futó tárolók listájának, például:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c08285e8aaa4 storeimage "dotnet Store.dll" 8 minutes ago Up 8 minutes 80/tcp, 443/tcp, 0.0.0.0:5902->8080/tcp, :::5902->8080/tcp eshoplite-frontend-1 6ba80f3c7ab0 productservice "dotnet Products.dll" 8 minutes ago Up 8 minutes 80/tcp, 443/tcp, 0.0.0.0:5200->8080/tcp, :::5200->8080/tcp eshoplite-backend-1 cd0c822a5222 vsc-eshoplite-958868d22c9851dd911b2423199bfc782861d1a8f7afac48e5096a1b7516082f "/bin/sh -c 'echo Co…" 27 minutes ago Up 27 minutesKeresse meg a termékszolgáltatás-tároló TÁROLÓazonosítóját. A fenti példában az azonosító 6ba80f3c7ab0.
Állítsa le a termékszolgáltatást ezzel a Docker-paranccsal:
docker stop <CONTAINER ID>Ahol a
<CONTAINER ID>az előző lépésben talált azonosító. Például:docker stop 6ba80f3c7ab0Lépjen vissza az alkalmazást futtató böngészőlapra, és frissítse a lapot. Hibaüzenet jelenik meg:
Probléma merült fel a termékeink betöltésekor. Próbálkozzon újra később.
Térjen vissza a kódtérhez, és a TERMINÁLban válassza ki a docker terminált, és nyomja le a CtrlC+ az alkalmazás leállításához. A következőt kell látnia:
Gracefully stopping... (press Ctrl+C again to force) Aborting on container exit... [+] Stopping 2/1 ✔ Container eshoplite-frontend-1 Stopped 0.3s ✔ Container eshoplite-backend-1 Stopped 0.0s canceled
Rugalmasság hozzáadása az alkalmazáshoz
Az alkalmazás rugalmasságának első lépése a Microsoft.Extensions.Http.Resilience NuGet-csomag hozzáadása a projekthez. Ezután használhatja a Program.cs.
A Microsoft.Extensions.Http.Resilience csomag hozzáadása
A kódtérben, a Terminál fülön navigáljon a Store projekt mappába.
cd StoreFuttassa a következő parancsot a rugalmassági NuGet-csomag hozzáadásához:
dotnet add package Microsoft.Extensions.Http.ResilienceHa ezt a parancsot az alkalmazások projektmappájában futtatja a terminálról, hozzáadja a csomaghivatkozást a Store.csproj projektfájlhoz.
Az EXPLORER oldalsávon válassza a Program.cs lehetőséget.
A fájl tetején adja hozzá a következő using utasítást:
using Microsoft.Extensions.Http.Resilience;
Standard rugalmassági stratégia hozzáadása
A 13. sorban a ;előtt adja hozzá a következő kódot:
.AddStandardResilienceHandler()A kódnak így kell kinéznie:
builder.Services.AddHttpClient<ProductService>(c => { var url = builder.Configuration["ProductEndpoint"] ?? throw new InvalidOperationException("ProductEndpoint is not set"); c.BaseAddress = new(url); }).AddStandardResilienceHandler();A fenti kód egy szabványos rugalmasságkezelőt ad hozzá a HTTPClienthez. A kezelő a standard rugalmassági stratégia összes alapértelmezett beállítását használja.
Nincs szükség más kódmódosításra az alkalmazásban. Futtassuk az alkalmazást, és teszteljük a rugalmasságot.
Futtassa az alábbi parancsokat az eShop-alkalmazás újraépítéséhez:
cd .. dotnet publish /p:PublishProfile=DefaultContainerA build befejezése után futtassa a következő parancsot az alkalmazás elindításához:
docker compose upLépjen vissza az alkalmazást futtató böngészőlapra, és frissítse a termékoldalt. Látnia kell a termékek listáját.
Térjen vissza a kódtérhez, és a TERMINÁL lapon válassza ki a második bash terminált. Másolja ki a productservice-tároló TÁROLÓazonosítóját.
Futtassa újra a docker stop parancsot:
docker stop <CONTAINER ID>Lépjen vissza az alkalmazást futtató böngészőlapra, és frissítse a termékoldalt. Ezúttal egy kicsit tovább kell tartania, amíg meg nem jelenik az alkalmazások hibaüzenete:
Probléma merült fel a termékeink betöltésekor. Próbálkozzon újra később.
Ellenőrizzük a naplókat, hogy működik-e a rugalmassági stratégiánk.
Térjen vissza a kódtérhez, és a TERMINÁL lapon válassza ki a docker terminált.
A terminálban nyomja le a CtrlC+ az alkalmazás futtatásának leállításához.
A naplóüzenetekben görgessen felfelé, amíg meg nem találja a Pollyra mutató hivatkozásokat.
eshoplite-frontend-1 | warn: Polly[3] eshoplite-frontend-1 | Execution attempt. Source: 'ProductService-standard//Standard-Retry', Operation Key: '', Result: 'Name or service not known (backend:8080)', Handled: 'True', Attempt: '2', Execution Time: '27.2703'Sok ilyen üzenet jelenik meg; mindegyik ismételt próbálkozás. A fenti üzenet a második kísérletet és a végrehajtáshoz használt időt jeleníti meg.
Rugalmassági stratégia konfigurálása
Amikor rugalmasságot ad az alkalmazáshoz, kiegyensúlyozza, hogy gyorsan kell reagálnia a felhasználókra, és nem kell túlterhelnie a háttérszolgáltatásokat. Csak Ön döntheti el, hogy az alapértelmezett beállítások megfelelnek-e a vállalat igényeinek.
Ebben a példában azt szeretné, hogy az áruházi szolgáltatás egy kicsit tovább várjon, ezáltal lehetőséget adva a helyreállásra.
A Program.cs kódablakában módosítsa a 13. sorban lévő kódot a következőre:
.AddStandardResilienceHandler(options => { options.Retry.MaxRetryAttempts = 7; });A fenti kód módosítja az újrapróbálkozási stratégia alapértelmezett beállításait, hogy a maximális újrapróbálkozások számát hétre korlátozzák. Ne feledje, hogy a stratégia exponenciális visszalépés, így a teljes idő körülbelül 5 perc.
A docker leállítása a CtrlC+. Ezután futtassa a következő parancsot az eShop-alkalmazás újraépítéséhez:
dotnet publish /p:PublishProfile=DefaultContainerA build befejezése után futtassa a következő parancsot az alkalmazás elindításához:
docker compose upÁllítsa le a háttérszolgáltatás-tárolót a bash terminálban, és frissítse az eShopot. Vegye figyelembe, hogy a hibaüzenet megjelenítése hosszabb időt vesz igénybe. Ha azonban ellenőrzi a naplókat, láthatja, hogy az újrapróbálkozás stratégiája csak ötször próbálkozott újra. Polly utolsó üzenete a következő:
Polly.Timeout.TimeoutRejectedException: The operation didn't complete within the allowed timeout of '00:00:30'.A fenti üzenet azt közli, hogy a teljes kérési időkorlát megakadályozza a maximális újrapróbálkozási szám elérését. A problémát a kérések időtúllépési idejének növelésével háríthatja el.
A terminálban nyomja le a CtrlC+ az alkalmazás leállításához.
A Program.cs kódablakában módosítsa a 13. sorban lévő kódot a következőre:
.AddStandardResilienceHandler(options => { options.Retry.RetryCount = 7; options.TotalRequestTimeout = new HttpTimeoutStrategyOptions { Timeout = TimeSpan.FromMinutes(5) }; });A fenti kód 260 másodpercre módosítja a kérések teljes időtúllépését, ami most már hosszabb, mint az újrapróbálkozás stratégiája.
Ezekkel a módosításokkal elegendő ideje lesz az alkalmazás futtatására, a termékszolgáltatás leállítására, az újrapróbálkozási kísérletek terminálnaplóinak ellenőrzésére, az eShop frissítésére a betöltési üzenet megtekintésére, majd a termékszolgáltatás újraindítása a termékek listájának sikeres megtekintéséhez.
Futtassa a következő parancsot az eShop-alkalmazás újraépítéséhez:
dotnet publish /p:PublishProfile=DefaultContainerA build befejezése után futtassa a következő parancsot az alkalmazás elindításához:
docker compose up
Az új rugalmassági beállítások tesztelése
Az alkalmazás tárolóban való teszteléséhez használja a Docker-bővítményt. A bővítmény grafikus felhasználói felületet biztosít a tárolók állapotának megtekintéséhez és szabályozásához.
A bal oldali menüben válassza a Docker ikont.
A DOCKER panel TÁROLÓK területén kattintson a jobb gombbal a terméktárolóra , és válassza a Leállítás lehetőséget.
Lépjen vissza az alkalmazást futtató böngészőlapra, és frissítse a termékoldalt. Ekkor megjelenik a Betöltés... üzenet.
Térjen vissza a kódtérhez, és a TERMINÁL lapon válassza ki a Docker-terminált . A rugalmassági stratégia működik.
A DOCKER panel TÁROLÓK területén kattintson a jobb gombbal a terméktárolóra , és válassza a Start lehetőséget.
Lépjen vissza az alkalmazást futtató böngészőlapra. Az alkalmazás valószínűleg helyreáll, és megjeleníti a termékek listáját.
A Terminálban állítsa le a dockert a CtrlC+.