Øvelse – Implementer robusthed i programmet
EShop-projektet har to tjenester, der kommunikerer med hinanden ved hjælp af HTTP-anmodninger. Tjenesten Store kalder Product tjenesten for at få listen over alle de aktuelle produkter, der kan købes.
Den aktuelle version af appen har ingen robusthedshåndtering.
Product Hvis tjenesten ikke er tilgængelig, returnerer tjenesten Store en fejl til kunderne og beder dem om at prøve igen senere. Denne funktionsmåde er ikke en god brugeroplevelse.
Din chef beder dig om at føje robusthed til appen, så Store tjenesten prøver at kalde backendtjenesten igen, hvis det mislykkes.
I denne øvelse føjer du robusthed til en eksisterende cloudbaseret app og tester din rettelse.
Åbn udviklingsmiljøet
Du kan vælge at bruge et GitHub-kodeområde, der er vært for øvelsen, eller fuldføre øvelsen lokalt i Visual Studio Code.
Hvis du vil bruge et kodeområde, skal du oprette et forudkonfigureret GitHub-kodeområde med dette link til oprettelse af kodeområde.
GitHub tager flere minutter at oprette og konfigurere kodeområdet. Når processen er fuldført, kan du se kodefilerne til øvelsen. Den kode, der skal bruges til resten af dette modul, findes i mappen /dotnet-resiliency .
Hvis du vil bruge Visual Studio Code, skal du klone det https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative lager til din lokale computer. Derpå:
- Installér alle systemtilladelser, for at køre Dev Container i Visual Studio Code.
- Kontrollér, at Docker kører.
- Åbn mappen med det klonede lager i et nyt Visual Studio Code-vindue
- Tryk Ctrl+Skift+P- for at åbne kommandopaletten.
- Søg efter: >udviklerobjektbeholdere: Genopbyg og genåbn i objektbeholder
- Vælg eShopLite – dotnet-robusthed på rullelisten. Visual Studio Code opretter din udviklingsobjektbeholder lokalt.
Byg og kør appen
I det nederste panel skal du vælge fanen TERMINAL og køre følgende kommando gå til koderoden:
cd dotnet-resiliencyKør følgende kommando for at oprette eShop-appbillederne:
dotnet publish /p:PublishProfile=DefaultContainerNår buildet er fuldført, skal du køre følgende kommando for at starte appen:
docker compose upI nederste panel skal du vælge fanen PORTE og derefter vælge ikonet Åbn i browser forfrontendporten (32000) i kolonnen Videresendt adresse i tabellen.
Hvis du kører appen lokalt, skal du åbne et browservindue for at få vist
http://localhost:32000/products.Appen eShop skal køre. Vælg menupunktet Produkter . Du bør se listen over produkter.
Test den aktuelle robusthed
Stop produkttjenesten for at se, hvad der sker med appen.
Gå tilbage til dit kodeområde, og under fanen TERMINAL skal du vælge + for at åbne en ny bash-terminal.
Kør følgende dockerkommando for at få vist de aktive objektbeholdere:
docker psDu bør se listen over objektbeholdere, der kører i øjeblikket, f.eks.:
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 minutesSøg efter OBJEKTBEHOLDER-id'et for productservice-objektbeholderen . I ovenstående eksempel er id'et 6ba80f3c7ab0.
Stop din produkttjeneste med denne dockerkommando:
docker stop <CONTAINER ID><CONTAINER ID>Hvor er det id, du fandt i det forrige trin. For eksempel:docker stop 6ba80f3c7ab0Gå tilbage til den browserfane, der kører appen, og opdater siden. Du får vist en fejlmeddelelse:
Der er problemer med at indlæse vores produkter. Prøv igen senere.
Gå tilbage til dit kodeområde, og vælg dockerterminalen i TERMINAL, og tryk på Ctrl+C for at stoppe appen. Du bør kunne se:
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
Føj robusthed til appen
De første trin til at gøre din app mere robust er at føje Microsoft.Extensions.Http.Resilience NuGet-pakken til projektet. Du kan derefter bruge den i Program.cs.
Tilføj pakken Microsoft.Extensions.Http.Resilience
Gå til mappen Store-projekt under fanen TERMINAL i dit kodeområde:
cd StoreKør følgende kommando for at tilføje den robuste NuGet-pakke:
dotnet add package Microsoft.Extensions.Http.ResilienceHvis du kører denne kommando fra terminalen i mappen med apps-projekt, føjes pakkereferencen til store.csproj-projektfilen .
Vælg Program.cs i margenteksten i STIFINDER.
Tilføj følgende ved hjælp af sætningen øverst i filen:
using Microsoft.Extensions.Http.Resilience;
Tilføj en standardstrategi for robusthed
Tilføj denne kode på linje 13 før ;:
.AddStandardResilienceHandler()Din kode skal se sådan ud:
builder.Services.AddHttpClient<ProductService>(c => { var url = builder.Configuration["ProductEndpoint"] ?? throw new InvalidOperationException("ProductEndpoint is not set"); c.BaseAddress = new(url); }).AddStandardResilienceHandler();Ovenstående kode føjer en standard robusthedshandler til HTTPClient. Handleren bruger alle standardindstillingerne for standardstrategien for robusthed.
Der kræves ingen andre kodeændringer i din app. Lad os køre appen og teste robustheden.
Kør følgende kommandoer for at genopbygge eShop-appen:
cd .. dotnet publish /p:PublishProfile=DefaultContainerNår buildet er fuldført, skal du køre følgende kommando for at starte appen:
docker compose upGå tilbage til browserfanen, der kører appen, og opdater produktsiden. Du bør se listen over produkter.
Gå tilbage til dit kodeområde, og vælg den anden bash-terminal under fanen TERMINAL . Kopiér OBJEKTBEHOLDER-id'et for productservice-objektbeholderen .
Kør stopkommandoen for docker igen:
docker stop <CONTAINER ID>Gå tilbage til browserfanen, der kører appen, og opdater produktsiden. Denne gang bør det tage lidt længere tid, indtil du får vist fejlmeddelelsen for apps:
Der er problemer med at indlæse vores produkter. Prøv igen senere.
Lad os kontrollere loggene for at se, om vores robusthedsstrategi fungerer.
Gå tilbage til dit kodeområde, og vælg dockerterminalen under fanen TERMINAL.
Tryk på Ctrl+C i terminalen for at stoppe appen med at køre.
Rul op i logmeddelelserne, indtil du finder referencer til Polly.
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'Du bør se mange meddelelser som denne. hver enkelt er et forsøg på at prøve igen. Ovenstående meddelelse viser det andet forsøg og den tid, det tog at udføre.
Konfigurer en strategi for robusthed
Når du føjer robusthed til din app, balancerer du behovet for at reagere hurtigt på dine brugere med behovet for ikke at overbelaste nogen backendtjenester. Det er kun dig, der kan beslutte, om standardindstillingerne opfylder virksomhedens behov.
I dette eksempel skal butikstjenesten vente lidt længere for at give butikstjenesten en chance for at gendanne.
I kodevinduet for Program.cs skal du ændre koden på linje 13 til:
.AddStandardResilienceHandler(options => { options.Retry.MaxRetryAttempts = 7; });Ovenstående kode ændrer som standard forsøgsstrategien til at have et maksimalt antal tilbagetrækninger til syv. Husk, at strategien er en eksponentiel backoff, så den samlede tid er omkring 5 minutter.
Stop docker op med Ctrl+C. Kør derefter følgende kommando for at genopbygge eShop-appen:
dotnet publish /p:PublishProfile=DefaultContainerNår buildet er fuldført, skal du køre følgende kommando for at starte appen:
docker compose upStop backendtjenesteobjektbeholderen i bash-terminalen, og opdater eShop. Bemærk, at det tager længere tid at se fejlmeddelelsen. Hvis du kontrollerer loggene, kan du dog se, at der kun blev forsøgt igen fem gange i forsøgsstrategien. Den sidste meddelelse fra Polly er:
Polly.Timeout.TimeoutRejectedException: The operation didn't complete within the allowed timeout of '00:00:30'.Ovenstående meddelelse fortæller dig, at den samlede timeout for anmodning stopper det maksimale antal forsøg, der kan nås. Du kan løse problemet ved at øge den samlede timeout for anmodninger.
Tryk på Ctrl+C i terminalen for at stoppe appen.
I kodevinduet for Program.cs skal du ændre koden på linje 13 til:
.AddStandardResilienceHandler(options => { options.Retry.RetryCount = 7; options.TotalRequestTimeout = new HttpTimeoutStrategyOptions { Timeout = TimeSpan.FromMinutes(5) }; });Ovenstående kode ændrer den samlede timeout for anmodning til 260 sekunder, hvilket nu er længere end forsøgsstrategien.
Med disse ændringer skal du have tid nok til at køre appen, stoppe produkttjenesten, kontrollere terminallogfilerne for forsøg på at prøve igen, opdatere eShop'en for at se indlæsningsmeddelelsen og til sidst genstarte produkttjenesten for at se listen over produkter.
Kør følgende kommando for at genopbygge appen eShop:
dotnet publish /p:PublishProfile=DefaultContainerNår buildet er fuldført, skal du køre følgende kommando for at starte appen:
docker compose up
Test de nye robusthedsindstillinger
Hvis du vil teste appen i din objektbeholder, skal du bruge Docker-udvidelsen. Udvidelsen giver en GUI til at få vist og styre tilstanden af objektbeholdere.
Vælg ikonet Docker i menuen til venstre.
Højreklik på produktobjektbeholderen under CONTAINERe i DOCKER-panelet, og vælg Stop.
Gå tilbage til browserfanen, der kører appen, og opdater produktsiden. Du bør se meddelelsen Indlæsning...
Gå tilbage til dit kodeområde, og vælg dockerterminalen under fanen TERMINAL. Robusthedsstrategien fungerer.
Højreklik på produktobjektbeholderen under OBJEKTBEHOLDERe i DOCKER-panelet, og vælg Start.
Gå tilbage til den browserfane, der kører appen. Vent, og appen skal gendannes, så listen over produkterne vises.
I Terminal skal du stoppe docker med Ctrl+C.