Gyakorlat – Alkalmazásrugalmasság megvalósítása

Befejeződött

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:

  1. Telepítse a rendszerkövetelményeket, hogy fusson a Dev Container a Visual Studio Code-ban.
  2. Győződjön meg arról, hogy a Docker fut.
  3. Egy új Visual Studio Code-ablakban nyissa meg a klónozott adattár mappáját
  4. Nyomja le a CtrlShift+P+ a parancskatalógus megnyitásához.
  5. Keresés: >Tárolók fejlesztése: Újraépítés és újranyitás a tárolóban
  6. 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

  1. Az alsó panelen válassza ki a TERMINÁL lapot, és futtassa a következő parancsot a kódgyökerhez:

    cd dotnet-resiliency
    
  2. Futtassa az alábbi parancsot az eShop-alkalmazás lemezképeinek létrehozásához:

    dotnet publish /p:PublishProfile=DefaultContainer
    
  3. A build befejezése után futtassa a következő parancsot az alkalmazás elindításához:

    docker compose up
    
  4. Az 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.

  5. Az eShop alkalmazásnak futnia kell. Válassza ki a Termékek menüelemet, ekkor megjelenik a termékek listája.

    Képernyőkép a böngészőben futó eShop alkalmazásról.

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.

  1. Térjen vissza a kódtérhez, és a TERMINÁL lapon válassza ki + az új bash-terminál megnyitásához.

  2. Futtassa a következő Docker-parancsot a futó tárolók listázásához:

    docker ps
    

    Meg 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 minutes     
    
  3. Keresse meg a termékszolgáltatás-tároló TÁROLÓazonosítóját. A fenti példában az azonosító 6ba80f3c7ab0.

  4. Á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 6ba80f3c7ab0
    
  5. Lé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.

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

  1. A kódtérben, a Terminál fülön navigáljon a Store projekt mappába.

    cd Store
    
  2. Futtassa a következő parancsot a rugalmassági NuGet-csomag hozzáadásához:

    dotnet add package Microsoft.Extensions.Http.Resilience
    

    Ha ezt a parancsot az alkalmazások projektmappájában futtatja a terminálról, hozzáadja a csomaghivatkozást a Store.csproj projektfájlhoz.

  3. Az EXPLORER oldalsávon válassza a Program.cs lehetőséget.

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

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

  2. Futtassa az alábbi parancsokat az eShop-alkalmazás újraépítéséhez:

    cd ..
    dotnet publish /p:PublishProfile=DefaultContainer
    
  3. A build befejezése után futtassa a következő parancsot az alkalmazás elindításához:

    docker compose up
    
  4. Lé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.

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

  6. Futtassa újra a docker stop parancsot:

    docker stop <CONTAINER ID>
    
  7. 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.

  8. Térjen vissza a kódtérhez, és a TERMINÁL lapon válassza ki a docker terminált.

  9. A terminálban nyomja le a CtrlC+ az alkalmazás futtatásának leállításához.

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

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

  2. 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=DefaultContainer
    
  3. A 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.

  4. A terminálban nyomja le a CtrlC+ az alkalmazás leállításához.

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

  6. Futtassa a következő parancsot az eShop-alkalmazás újraépítéséhez:

    dotnet publish /p:PublishProfile=DefaultContainer
    
  7. A 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.

  1. A bal oldali menüben válassza a Docker ikont.

    Képernyőkép a Docker-bővítményről, amely bemutatja, hogyan állíthatja le a termékszolgáltatást.

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

  3. Lépjen vissza az alkalmazást futtató böngészőlapra, és frissítse a termékoldalt. Ekkor megjelenik a Betöltés... üzenet.

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

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

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

  7. A Terminálban állítsa le a dockert a CtrlC+.