Wzorzec niezawodnej aplikacji internetowej dla języka Java

Azure App Service
Azure Front Door

Ten artykuł zawiera wskazówki dotyczące implementowania wzorca niezawodnej aplikacji internetowej. Ten wzorzec przedstawia sposób modyfikowania (replatformowania) aplikacji internetowych na potrzeby migracji do chmury. Oferuje on normatywne wskazówki dotyczące architektury, kodu i konfiguracji dostosowane do zasad dobrze zaprojektowanej struktury.

Dlaczego wzorzec niezawodnej aplikacji internetowej dla języka Java?

Wzorzec niezawodnej aplikacji internetowej to zestaw zasad i technik implementacji, które definiują sposób ponownego tworzenia platformy aplikacji internetowych podczas migracji do chmury. Koncentruje się on na minimalnych aktualizacjach kodu, które należy wprowadzić w chmurze. Poniższe wskazówki używają implementacji referencyjnej jako przykładu w całej organizacji i są zgodne z przebudową fikcyjnej firmy Contoso Fiber w celu zapewnienia kontekstu biznesowego podróży. Przed zaimplementowaniem wzorca Reliable Web App dla języka Java firma Contoso Fiber miała monolityczny, lokalny system zarządzania kontami klienta (CAMS), który używał platformy Spring Boot.

Napiwek

Logo usługi GitHub.Istnieje implementacja referencyjna (przykład) wzorca niezawodnej aplikacji internetowej. Reprezentuje stan końcowy implementacji niezawodnej aplikacji internetowej. Jest to aplikacja internetowa klasy produkcyjnej, która zawiera wszystkie aktualizacje kodu, architektury i konfiguracji omówione w tym artykule. Wdróż implementację referencyjną i użyj jej, aby kierować implementacją wzorca niezawodnej aplikacji internetowej.

Jak zaimplementować wzorzec niezawodnej aplikacji internetowej

Ten artykuł zawiera wskazówki dotyczące architektury, kodu i konfiguracji w celu zaimplementowania wzorca niezawodnej aplikacji internetowej. Skorzystaj z poniższych linków, aby przejść do konkretnych potrzebnych wskazówek:

  • Kontekst biznesowy: dostosuj te wskazówki do kontekstu biznesowego i dowiedz się, jak definiować natychmiastowe i długoterminowe cele, które umożliwiają ponowne tworzenie decyzji.
  • Wskazówki dotyczące architektury: Dowiedz się, jak wybrać odpowiednie usługi w chmurze i zaprojektować architekturę spełniającą wymagania biznesowe.
  • Wskazówki dotyczące kodu: Zaimplementuj trzy wzorce projektowe, aby zwiększyć niezawodność i wydajność aplikacji internetowej w chmurze: ponawianie prób, wyłącznik i wzorce odkładania do pamięci podręcznej
  • Wskazówki dotyczące konfiguracji: Konfigurowanie uwierzytelniania i autoryzacji, tożsamości zarządzanych, środowisk chronionych prawami, infrastruktury jako kodu i monitorowania.

Kontekst biznesowy

Pierwszym krokiem ponownego tworzenia aplikacji internetowej jest zdefiniowanie celów biznesowych. Należy określić natychmiastowe cele, takie jak cele poziomu usług i cele optymalizacji kosztów, a także przyszłe cele aplikacji internetowej. Te cele wpływają na wybór usług w chmurze i architekturę aplikacji internetowej w chmurze. Zdefiniuj docelowy cel slo dla aplikacji internetowej, na przykład 99,9% czasu pracy. Oblicz złożoną umowę SLA dla wszystkich usług, które mają wpływ na dostępność aplikacji internetowej.

Na przykład firma Contoso Fiber chce rozszerzyć lokalną aplikację internetową systemu zarządzania kontami klientów (CAMS), aby dotrzeć do innych regionów. Aby sprostać zwiększonemu zapotrzebowaniu na aplikację internetową, ustalili następujące cele:

  • Stosowanie tanich zmian kodu o wysokiej wartości
  • Osiągnięcie celu poziomu usług (SLO) w wysokości 99,9%
  • Wdrażanie praktyk metodyki DevOps
  • Tworzenie środowisk zoptymalizowanych pod kątem kosztów
  • Zwiększanie niezawodności i zabezpieczeń

Firma Contoso Fiber ustaliła, że ich infrastruktura lokalna nie była opłacalnym rozwiązaniem do skalowania aplikacji. Dlatego zdecydowali, że migracja aplikacji internetowej CAMS na platformę Azure była najbardziej opłacalnym sposobem osiągnięcia bezpośrednich i przyszłych celów.

Wskazówki dotyczące architektury

Wzorzec niezawodnej aplikacji internetowej zawiera kilka podstawowych elementów architektury. System DNS musi zarządzać rozpoznawaniem punktów końcowych, zaporą aplikacji internetowej w celu blokowania złośliwego ruchu HTTP oraz modułu równoważenia obciążenia w celu ochrony i kierowania przychodzących żądań użytkowników. Platforma aplikacji hostuje kod aplikacji internetowej i wykonuje wywołania wszystkich usług zaplecza za pośrednictwem prywatnych punktów końcowych w sieci wirtualnej. Narzędzie do monitorowania wydajności aplikacji przechwytuje metryki i dzienniki, aby zrozumieć aplikację internetową.

Diagram przedstawiający podstawowe elementy architektury wzorca Reliable Web App.

Rysunek 1. Podstawowe elementy architektury wzorca niezawodnej aplikacji internetowej.

Projektowanie architektury

Zaprojektuj infrastrukturę tak, aby obsługiwała metryki odzyskiwania, takie jak cel czasu odzyskiwania (RTO) i cel punktu odzyskiwania (RPO). Cel czasu odzyskiwania wpływa na dostępność i musi obsługiwać cel slo. Określ cel punktu odzyskiwania (RPO) i skonfiguruj nadmiarowość danych w celu spełnienia celu punktu odzyskiwania.

  • Wybierz niezawodność infrastruktury. Określ, ile stref dostępności i regionów należy spełnić wymagania dotyczące dostępności. Dodaj strefy dostępności i regiony do momentu spełnienia złożonej umowy SLA. Wzorzec niezawodnej aplikacji internetowej obsługuje wiele regionów dla konfiguracji aktywne-aktywne lub aktywne-pasywne. Na przykład implementacja referencyjna używa konfiguracji aktywne-pasywnej, aby spełnić cel SLO 99,9%.

    W przypadku aplikacji internetowej z wieloma regionami skonfiguruj moduł równoważenia obciążenia pod kątem kierowania ruchu do drugiego regionu tak, aby obsługiwał konfigurację aktywne-aktywne lub aktywne-pasywne w zależności od potrzeb biznesowych. Dwa regiony wymagają tych samych usług, z wyjątkiem jednego regionu, ma sieć wirtualną koncentratora, która łączy regiony. Wdrażanie topologii sieci piasty i szprych w celu scentralizowania i udostępniania zasobów, takich jak zapora sieciowa. Jeśli masz maszyny wirtualne, dodaj hosta bastionu do sieci wirtualnej koncentratora, aby zarządzać nimi bezpiecznie (zobacz rysunek 2).

    Diagram przedstawiający wzorzec niezawodnej aplikacji internetowej z drugim regionem i topologią piasty i szprych.

    Rysunek 2. Wzorzec niezawodnej aplikacji internetowej z drugim regionem i topologią piasty i szprych.

  • Wybierz topologię sieci. Wybierz odpowiednią topologię sieci dla wymagań sieci web i sieci. Jeśli planujesz posiadanie wielu sieci wirtualnych, użyj topologii sieci piasty i szprych. Zapewnia ona korzyści związane z kosztami, zarządzaniem i zabezpieczeniami dzięki opcjom łączności hybrydowej z sieciami lokalnymi i wirtualnymi.

Wybieranie odpowiednich usług platformy Azure

Po przeniesieniu aplikacji internetowej do chmury należy wybrać usługi platformy Azure spełniające wymagania biznesowe i dostosować je do bieżących funkcji lokalnej aplikacji internetowej. Wyrównanie pomaga zminimalizować nakład pracy ponownej platformy. Na przykład użyj usług, które umożliwiają zachowanie tego samego aparatu bazy danych i obsługę istniejącego oprogramowania pośredniczącego i struktur. Poniższe sekcje zawierają wskazówki dotyczące wybierania odpowiednich usług platformy Azure dla aplikacji internetowej.

Na przykład przed przejściem do chmury aplikacja internetowa CAMS firmy Contoso fiber była lokalną, monolityczną aplikacją internetową Java. Jest to aplikacja Spring Boot z bazą danych PostgreSQL. Aplikacja internetowa jest aplikacją do obsługi biznesowej. Jest to pracownik. Pracownicy firmy Contoso Fiber używają aplikacji do zarządzania sprawami pomocy technicznej od swoich klientów. Aplikacja internetowa cierpiała na typowe wyzwania związane z skalowalnością i wdrażaniem funkcji. Ten punkt początkowy, ich cele biznesowe i SLO doprowadziły do wyborów usług.

  • Platforma aplikacji: użyj usługi aplikacja systemu Azure jako platformy aplikacji. Firma Contoso Fiber wybrała usługę aplikacja systemu Azure jako platformę aplikacji z następujących powodów:

    • Naturalny postęp: Firma Contoso Fiber wdrożyła plik Spring Boot jar na serwerze lokalnym i chciała zminimalizować ilość zmian architektury dla tego modelu wdrażania. Usługa App Service zapewnia niezawodną obsługę uruchamiania aplikacji Spring Boot i była to naturalny postęp dla firmy Contoso Fiber w celu korzystania z usługi App Service. Usługa Azure Container Apps jest również atrakcyjną alternatywą dla tej aplikacji. Aby uzyskać więcej informacji, zobacz Co to jest usługa Azure Spring Apps? i Język Java w usłudze Azure Container Apps — omówienie.
    • Wysoka umowa SLA: ma wysoką umowę SLA spełniającą wymagania środowiska produkcyjnego.
    • Mniejsze obciążenie związane z zarządzaniem: jest to w pełni zarządzane rozwiązanie hostingu.
    • Możliwość konteneryzacji: usługa App Service współpracuje z prywatnymi rejestrami obrazów kontenerów, takimi jak Usługa Azure Container Registry. Firma Contoso Fiber może używać tych rejestrów do konteneryzowania aplikacji internetowej w przyszłości.
    • Skalowanie automatyczne: aplikacja internetowa może szybko skalować w górę, w dół i w poziomie na podstawie ruchu użytkowników.
  • Zarządzanie tożsamościami: użyj identyfikatora Entra firmy Microsoft jako rozwiązania do zarządzania tożsamościami i dostępem. Firma Contoso Fiber wybrała identyfikator Entra firmy Microsoft z następujących powodów:

    • Uwierzytelnianie i autoryzacja: aplikacja musi uwierzytelniać i autoryzować pracowników centrum telefonicznego.
    • Skalowalne: umożliwia skalowanie w celu obsługi większych scenariuszy.
    • Kontrola tożsamości użytkownika: pracownicy centrum telefonicznego mogą używać istniejących tożsamości przedsiębiorstwa.
    • Obsługa protokołu autoryzacji: obsługuje protokół OAuth 2.0 dla tożsamości zarządzanych.
  • Baza danych: użyj usługi, która pozwala zachować ten sam aparat bazy danych. Użyj drzewa decyzyjnego magazynu danych. Firma Contoso Fiber wybrała usługę Azure Database for PostgreSQL i opcję serwera elastycznego z następujących powodów:

    • Niezawodność: model wdrażania serwera elastycznego obsługuje strefowo nadmiarową wysoką dostępność w wielu strefach dostępności. Ta konfiguracja obsługuje ciepły serwer rezerwowy w innej strefie dostępności w tym samym regionie świadczenia usługi Azure. Konfiguracja replikuje dane synchronicznie do serwera rezerwowego.
    • Replikacja między regionami: ma funkcję repliki do odczytu, która umożliwia asynchroniczne replikowanie danych do bazy danych repliki tylko do odczytu w innym regionie.
    • Wydajność: zapewnia przewidywalną wydajność i inteligentne dostrajanie w celu zwiększenia wydajności bazy danych przy użyciu rzeczywistych danych użycia.
    • Mniejsze obciążenie związane z zarządzaniem: jest to w pełni zarządzana usługa platformy Azure, która zmniejsza zobowiązania związane z zarządzaniem.
    • Obsługa migracji: obsługuje migrację bazy danych z lokalnych baz danych PostgreSQL na jednym serwerze. Mogą oni użyć narzędzia do migracji, aby uprościć proces migracji.
    • Spójność z konfiguracjami lokalnymi: obsługuje różne wersje społecznościowe bazy danych PostgreSQL, w tym wersję używaną obecnie przez firmę Contoso Fiber.
    • Odporność. Wdrożenie serwera elastycznego automatycznie tworzy kopie zapasowe serwera i przechowuje je przy użyciu magazynu strefowo nadmiarowego (ZRS) w tym samym regionie. Mogą przywrócić bazę danych do dowolnego punktu w czasie w okresie przechowywania kopii zapasowych. Funkcja tworzenia kopii zapasowych i przywracania tworzy lepszy cel punktu odzyskiwania (akceptowalną ilość utraty danych) niż usługa Contoso Fiber może utworzyć lokalnie.
  • Monitorowanie wydajności aplikacji: użyj usługi Application Insights do analizowania danych telemetrycznych w aplikacji. Firma Contoso Fiber zdecydowała się na korzystanie z usługi Application Insights z następujących powodów:

    • Integracja z usługą Azure Monitor: zapewnia najlepszą integrację z usługą Azure Monitor.
    • Wykrywanie anomalii: automatycznie wykrywa anomalie wydajności.
    • Rozwiązywanie problemów: ułatwia diagnozowanie problemów w uruchomionej aplikacji.
    • Monitorowanie: zbiera informacje o sposobie korzystania z aplikacji przez użytkowników i umożliwia łatwe śledzenie zdarzeń niestandardowych.
    • Luka w widoczności: rozwiązanie lokalne nie ma rozwiązania do monitorowania wydajności aplikacji. Usługa Application Insights zapewnia łatwą integrację z platformą aplikacji i kodem.
  • Pamięć podręczna: wybierz, czy chcesz dodać pamięć podręczną do architektury aplikacji internetowej. Azure Cache for Redis to podstawowe rozwiązanie pamięci podręcznej platformy Azure. Jest to zarządzany magazyn danych w pamięci oparty na oprogramowaniu Redis. Usługa Azure Cache for Redis firmy Contoso dodała usługę Azure Cache for Redis z następujących powodów:

    • Szybkość i wolumin: ma wysoką przepływność danych i odczyty o małych opóźnieniach dla często używanych, wolno zmieniających się danych.
    • Zróżnicowana możliwość obsługi: jest to ujednolicona lokalizacja pamięci podręcznej, z którego mogą korzystać wszystkie wystąpienia aplikacji internetowej.
    • Zewnętrzny magazyn danych. Lokalne serwery aplikacji wykonały buforowanie lokalne maszyn wirtualnych. Ta konfiguracja nie odciążyła bardzo częstych danych i nie mogła unieważnić danych.
    • Sesje inne niż szminki: pamięć podręczna umożliwia aplikacji internetowej zewnętrzną wirtualizację stanu sesji i używanie sesji bez szminki. Większość aplikacji internetowych Java działających lokalnie używa buforowania w pamięci po stronie klienta. Buforowanie po stronie klienta nie jest skalowane w pamięci i zwiększa zużycie pamięci na hoście. Korzystając z usługi Azure Cache for Redis, firma Contoso Fiber ma w pełni zarządzaną, skalowalną usługę pamięci podręcznej w celu zwiększenia skalowalności i wydajności aplikacji. Firma Contoso Fiber używała struktury abstrakcji pamięci podręcznej (Spring Cache) i potrzebowała tylko minimalnych zmian konfiguracji w celu zamiany dostawcy pamięci podręcznej. Umożliwiło im przełączenie się z dostawcy Ehcache do dostawcy usługi Redis.
  • Moduł równoważenia obciążenia: aplikacje internetowe korzystające z rozwiązań PaaS powinny używać usługi Azure Front Door, aplikacja systemu Azure Gateway lub w oparciu o architekturę i wymagania aplikacji internetowej. Użyj drzewa decyzyjnego modułu równoważenia obciążenia, aby wybrać odpowiedni moduł równoważenia obciążenia. Firma Contoso Fiber potrzebowała modułu równoważenia obciążenia warstwy 7, który może kierować ruch między wieloma regionami. Firma Contoso Fiber potrzebowała aplikacji internetowej w wielu regionach, aby spełnić cel SLO na 99,9%. Firma Contoso Fiber wybrała usługę Azure Front Door z następujących powodów:

    • Globalne równoważenie obciążenia: jest to moduł równoważenia obciążenia warstwy 7, który może kierować ruch między wieloma regionami.
    • Zapora aplikacji internetowej: integruje się natywnie z zaporą aplikacji internetowej platformy Azure.
    • Elastyczność routingu: umożliwia zespołowi aplikacji konfigurowanie ruchu przychodzącego w celu obsługi przyszłych zmian w aplikacji.
    • Przyspieszanie ruchu: używa emisji anycast, aby dotrzeć do najbliższego punktu obecności platformy Azure i znaleźć najszybszą trasę do aplikacji internetowej.
    • Domeny niestandardowe: obsługuje niestandardowe nazwy domen z elastyczną weryfikacją domeny.
    • Sondy kondycji: aplikacja wymaga inteligentnego monitorowania sondy kondycji. Usługa Azure Front Door używa odpowiedzi z sondy, aby określić najlepsze źródło routingu żądań klientów.
    • Obsługa monitorowania: obsługuje wbudowane raporty z pulpitem nawigacyjnym typu all-in-one zarówno dla usługi Front Door, jak i wzorców zabezpieczeń. Możesz skonfigurować alerty zintegrowane z usługą Azure Monitor. Umożliwia aplikacji rejestrowanie każdego żądania i nieudanych sond kondycji.
    • Ochrona przed atakami DDoS: ma wbudowaną ochronę przed atakami DDoS warstwy 3-4.
    • Sieć dostarczania zawartości: umieszcza usługę Contoso Fiber w celu korzystania z sieci dostarczania zawartości. Sieć dostarczania zawartości zapewnia przyspieszenie lokacji.
  • Zapora aplikacji internetowej: użyj usługi Azure Web Application Firewall , aby zapewnić scentralizowaną ochronę przed typowymi programami wykorzystującymi luki w zabezpieczeniach i lukami w zabezpieczeniach internetowych. Usługa Contoso Fiber używała zapory aplikacji internetowej platformy Azure z następujących powodów:

    • Ochrona globalna: zapewnia lepszą globalną ochronę aplikacji internetowych bez utraty wydajności.
    • Ochrona botnetu: zespół może monitorować i konfigurować ustawienia w celu rozwiązania problemów z zabezpieczeniami związanych z botnetami.
    • Równoważność ze środowiskiem lokalnym: rozwiązanie lokalne działało za zaporą aplikacji internetowej zarządzanej przez dział IT.
    • Łatwość użycia: Zapora aplikacji internetowej integruje się z usługą Azure Front Door.
  • Menedżer wpisów tajnych: użyj usługi Azure Key Vault , jeśli masz wpisy tajne do zarządzania na platformie Azure. Usługa Contoso Fiber używała usługi Key Vault z następujących powodów:

    • Szyfrowanie: obsługuje szyfrowanie magazynowane i przesyłane.
    • Obsługa tożsamości zarządzanej: usługi aplikacji mogą używać tożsamości zarządzanych do uzyskiwania dostępu do magazynu wpisów tajnych.
    • Monitorowanie i rejestrowanie: ułatwia inspekcję dostępu i generuje alerty podczas zmiany przechowywanych wpisów tajnych.
    • Integracja: zapewnia natywną integrację z magazynem konfiguracji platformy Azure (App Configuration) i platformą hostingu internetowego (App Service).
  • Zabezpieczenia punktu końcowego: użyj usługi Azure Private Link , aby uzyskać dostęp do rozwiązań typu platforma jako usługa za pośrednictwem prywatnego punktu końcowego w sieci wirtualnej. Ruch między siecią wirtualną a usługą jest przesyłany przez sieć szkieletową firmy Microsoft. Firma Contoso Fiber wybrała usługę Private Link z następujących powodów:

    • Ulepszona komunikacja z zabezpieczeniami: umożliwia aplikacji prywatny dostęp do usług na platformie Azure i zmniejsza zużycie sieci magazynów danych w celu ochrony przed wyciekiem danych.
    • Minimalny nakład pracy: prywatne punkty końcowe obsługują platformę aplikacji internetowej i platformę bazy danych używaną przez aplikację internetową. Obie platformy dubluje istniejące konfiguracje lokalne w celu minimalnej zmiany.
  • Zabezpieczenia sieciowe: użyj usługi Azure Firewall , aby kontrolować ruch przychodzący i wychodzący na poziomie sieci. Usługa Azure Bastion umożliwia bezpieczne łączenie się z maszynami wirtualnymi bez uwidaczniania portów RDP/SSH. Firma Contoso Fiber przyjęła topologię sieci piasty i szprych i chciała umieścić udostępnione usługi zabezpieczeń sieci w centrum. Usługa Azure Firewall zwiększa bezpieczeństwo, sprawdzając cały ruch wychodzący z szprych w celu zwiększenia bezpieczeństwa sieci. Usługa Contoso Fiber potrzebowała usługi Azure Bastion do zabezpieczania wdrożeń z hosta szybkiego dostępu w podsieci DevOps.

Wskazówki dotyczące kodu

Aby pomyślnie przenieść aplikację internetową do chmury, musisz zaktualizować kod aplikacji internetowej przy użyciu wzorca ponawiania prób, wzorca wyłącznika i wzorca projektowania z odkładania do pamięci podręcznej.

Diagram przedstawiający rolę wzorców projektowych w podstawowej niezawodnej architekturze aplikacji internetowej.

Rysunek 3. Rola wzorców projektowych.

Każdy wzorzec projektu zapewnia korzyści projektowe obciążeń, które są zgodne z jednym z kolejnych filarów dobrze zaprojektowanej struktury. Oto omówienie wzorców, które należy zaimplementować:

  1. Wzorzec ponawiania: wzorzec ponawiania obsługuje błędy przejściowe, ponawiając próby operacji, które mogą sporadycznie zakończyć się niepowodzeniem. Zaimplementuj ten wzorzec dla wszystkich wywołań wychodzących do innych usług platformy Azure.

  2. Wzorzec wyłącznika: wzorzec wyłącznika uniemożliwia aplikacji ponawianie prób operacji, które nie są przejściowe. Zaimplementuj ten wzorzec we wszystkich wywołaniach wychodzących do innych usług platformy Azure.

  3. Wzorzec odkładania do pamięci podręcznej: wzorzec z odkładania do pamięci podręcznej jest dodany i pobierany z pamięci podręcznej częściej niż magazyn danych. Zaimplementuj ten wzorzec dla żądań do bazy danych.

Wzorzec projektowania Niezawodność (RE) Zabezpieczenia (SE) Optymalizacja kosztów (CO) Doskonałość operacyjna (OE) Wydajność (PE) Obsługa zasad zapory aplikacji internetowej
Wzorzec ponawiania RE:07
Wzorzec wyłącznika RE:03
RE:07
PE:07
PE:11
Wzorzec odkładania do pamięci podręcznej RE:05
PE:08
PE:12

Implementowanie wzorca ponawiania prób

Dodaj wzorzec ponawiania prób do kodu aplikacji, aby rozwiązać tymczasowe zakłócenia usługi. Te zakłócenia są nazywane błędami przejściowymi. Błędy przejściowe zwykle są rozwiązywane w ciągu kilku sekund. Wzorzec ponawiania umożliwia ponowne wysyłanie żądań, które zakończyły się niepowodzeniem. Umożliwia również skonfigurowanie opóźnień żądań i liczbę prób przed przekazaniem błędu.

Użyj klasy Resilience4j, lekkiej biblioteki odporności na uszkodzenia, aby zaimplementować wzorzec ponawiania prób w języku Java. Na przykład implementacja referencyjna dodaje wzorzec ponawiania, dekorując metodę listServicePlans kontrolera planu usługi z adnotacjami ponawiania. Kod ponawia próbę wywołania do listy planów usług z bazy danych, jeśli początkowe wywołanie zakończy się niepowodzeniem. Implementacja referencyjna konfiguruje zasady ponawiania, w tym maksymalne próby, czas oczekiwania i wyjątki, które należy ponowić. Zasady ponawiania prób zostały skonfigurowane w programie application.properties.

    @GetMapping("/list")
    @PreAuthorize("hasAnyAuthority('APPROLE_AccountManager')")
    @CircuitBreaker(name = SERVICE_PLAN)
    @Retry(name = SERVICE_PLAN)
    public String listServicePlans(Model model) {
        List<serviceplandto> servicePlans = planService.getServicePlans();
        model.addAttribute("servicePlans", servicePlans);
        return "pages/plans/list";
    }

Implementowanie wzorca wyłącznika

Użyj wzorca wyłącznika, aby obsługiwać przerwy w działaniu usługi, które nie są błędami przejściowymi. Wzorzec wyłącznika uniemożliwia aplikacji ciągłe próby uzyskania dostępu do usługi, która nie odpowiada. Zwalnia aplikację i unika marnowania cykli procesora CPU, dzięki czemu aplikacja zachowuje integralność wydajności dla użytkowników końcowych.

Skorzystaj z dokumentacji wyłącznika spring circuit i resilience4j, aby zaimplementować wzorzec wyłącznika. Na przykład implementacja referencyjna implementuje wzorzec wyłącznika przez dekorowanie metod za pomocą atrybutu wyłącznika.

Implementowanie wzorca z odkładania do pamięci podręcznej

Dodaj wzorzec Odkładanie do pamięci podręcznej do aplikacji internetowej, aby ulepszyć zarządzanie danymi w pamięci. Wzorzec przypisuje aplikacji odpowiedzialność za obsługę żądań danych i zapewnienie spójności między pamięcią podręczną a magazynem trwałym, takim jak baza danych. Skraca czas odpowiedzi, zwiększa przepływność i zmniejsza potrzebę większego skalowania. Zmniejsza to również obciążenie podstawowego magazynu danych, zwiększając niezawodność i optymalizację kosztów. Aby zaimplementować wzorzec odkładania do pamięci podręcznej, wykonaj następujące zalecenia:

  • Skonfiguruj aplikację do korzystania z pamięci podręcznej. Aby włączyć buforowanie, dodaj spring-boot-starter-cache pakiet jako zależność w pom.xml pliku. Ten pakiet zawiera domyślne konfiguracje pamięci podręcznej Redis Cache.

  • Buforowanie danych o wysokiej potrzebie. Zastosuj wzorzec Odkładanie do pamięci podręcznej na danych o dużej potrzebie, aby zwiększyć jego skuteczność. Usługa Azure Monitor umożliwia śledzenie procesora CPU, pamięci i magazynu bazy danych. Te metryki ułatwiają określenie, czy można użyć mniejszej jednostki SKU bazy danych po zastosowaniu wzorca z odkładaniem do pamięci podręcznej. Aby buforować określone dane w kodzie, dodaj adnotację @Cacheable . Ta adnotacja informuje platformę Spring, które metody powinny mieć buforowane wyniki.

  • Zachowaj świeżość danych pamięci podręcznej. Zaplanuj regularne aktualizacje pamięci podręcznej w celu synchronizacji z najnowszymi zmianami bazy danych. Określ optymalną częstotliwość odświeżania na podstawie zmienności danych i potrzeb użytkowników. Dzięki temu aplikacja korzysta ze wzorca z odkładania do pamięci podręcznej w celu zapewnienia szybkiego dostępu i bieżących informacji. Domyślne ustawienia pamięci podręcznej mogą nie odpowiadać aplikacji internetowej. Te ustawienia można dostosować w application.properties pliku lub zmiennych środowiskowych. Na przykład można zmodyfikować spring.cache.redis.time-to-live wartość (wyrażoną w milisekundach), aby kontrolować, jak długo dane powinny pozostać w pamięci podręcznej, zanim będą eksmitowane.

  • Zapewnianie spójności danych. Zaimplementuj mechanizmy aktualizacji pamięci podręcznej bezpośrednio po każdej operacji zapisu bazy danych. Użyj aktualizacji opartych na zdarzeniach lub dedykowanych klas zarządzania danymi, aby zapewnić spójność pamięci podręcznej. Spójna synchronizacja pamięci podręcznej z modyfikacjami bazy danych jest kluczowa dla wzorca z odkładaniem do pamięci podręcznej.

Wskazówki dotyczące konfiguracji

Poniższe sekcje zawierają wskazówki dotyczące implementowania aktualizacji konfiguracji. Każda sekcja jest zgodna z co najmniej jednym filarem dobrze zaprojektowanej struktury.

Konfigurowanie Niezawodność (RE) Zabezpieczenia (SE) Optymalizacja kosztów (CO) Doskonałość operacyjna (OE) Wydajność (PE) Obsługa zasad zapory aplikacji internetowej
Konfigurowanie uwierzytelniania i autoryzacji użytkownika SE:05
OE:10
Implementowanie tożsamości zarządzanych SE:05
OE:10
Odpowiednie środowiska rozmiaru CO:05
CO:06
Implementowanie skalowania automatycznego RE:06
CO:12
PE:05
Automatyzowanie wdrażania zasobów OE:05
Implementowanie monitorowania OE:07
PE:04

Konfigurowanie uwierzytelniania i autoryzacji użytkownika

Podczas migracji aplikacji internetowych na platformę Azure należy skonfigurować mechanizmy uwierzytelniania i autoryzacji użytkowników. Postępuj zgodnie z następującymi zaleceniami:

  • Korzystanie z platformy tożsamości. Konfigurowanie uwierzytelniania aplikacji internetowej za pomocą platformy Microsoft Identity. Ta platforma obsługuje aplikacje korzystające z jednego katalogu Microsoft Entra, wielu katalogów Firmy Microsoft Entra z różnych organizacji oraz tożsamości microsoft lub kont społecznościowych.

    Szablon startowy Spring Boot dla usługi Microsoft Entra ID usprawnia ten proces, wykorzystując zabezpieczenia spring i spring boot w celu łatwej konfiguracji. Oferuje różne przepływy uwierzytelniania, automatyczne zarządzanie tokenami i dostosowywalne zasady autoryzacji, a także możliwości integracji ze składnikami spring Cloud. Umożliwia to prostą integrację aplikacji Microsoft Entra ID i OAuth 2.0 z aplikacjami Spring Boot bez ręcznej konfiguracji biblioteki lub ustawień.

    Na przykład implementacja referencyjna używa Platforma tożsamości Microsoft (Microsoft Entra ID) jako dostawcy tożsamości dla aplikacji internetowej. Używa on udzielenia kodu autoryzacji OAuth 2.0, aby zalogować użytkownika przy użyciu konta Microsoft Entra. Poniższy fragment kodu XML definiuje dwa wymagane zależności przepływu udzielania kodu autoryzacji OAuth 2.0. Zależność com.azure.spring: spring-cloud-azure-starter-active-directory umożliwia uwierzytelnianie i autoryzację firmy Microsoft w aplikacji Spring Boot. Zależność org.springframework.boot: spring-boot-starter-oauth2-client obsługuje uwierzytelnianie OAuth 2.0 i autoryzację w aplikacji Spring Boot.

    <dependency>
        <groupid>com.azure.spring</groupid>
        <artifactid>spring-cloud-azure-starter-active-directory</artifactid>
    </dependency>
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-oauth2-client</artifactid>
    </dependency>
    
  • Tworzenie rejestracji aplikacji. Identyfikator Entra firmy Microsoft wymaga rejestracji aplikacji w dzierżawie podstawowej. Rejestracja aplikacji gwarantuje, że użytkownicy, którzy uzyskują dostęp do aplikacji internetowej, mają tożsamości w dzierżawie podstawowej. Na przykład implementacja referencyjna używa narzędzia Terraform do utworzenia rejestracji aplikacji Microsoft Entra ID wraz z określoną rolą Menedżera kont aplikacji.

    resource "azuread_application" "app_registration" {
      display_name     = "${azurecaf_name.app_service.result}-app"
      owners           = [data.azuread_client_config.current.object_id]
      sign_in_audience = "AzureADMyOrg"  # single tenant
    
      app_role {
        allowed_member_types = ["User"]
        description          = "Account Managers"
        display_name         = "Account Manager"
        enabled              = true
        id                   = random_uuid.account_manager_role_id.result
        value                = "AccountManager"
      }
    }
    
  • Wymuszanie autoryzacji w aplikacji. Użyj kontroli dostępu opartej na rolach (RBAC), aby przypisać najmniejsze uprawnienia do ról aplikacji. Zdefiniuj określone role dla różnych akcji użytkownika, aby uniknąć nakładania się i zapewnić przejrzystość. Zamapuj użytkowników na odpowiednie role i upewnij się, że mają dostęp tylko do niezbędnych zasobów i akcji. Skonfiguruj usługę Spring Security, aby używać szablonu startowego Spring Boot dla identyfikatora Entra firmy Microsoft. Ta biblioteka umożliwia integrację z identyfikatorem Entra firmy Microsoft i pomaga zapewnić bezpieczne uwierzytelnianie użytkowników. Konfigurowanie i włączanie biblioteki Microsoft Authentication Library (MSAL) zapewnia dostęp do większej liczby funkcji zabezpieczeń. Te funkcje obejmują buforowanie tokenów i automatyczne odświeżanie tokenów.

    Na przykład implementacja referencyjna tworzy role aplikacji odzwierciedlające typy ról użytkowników w systemie zarządzania kontami firmy Contoso Fiber. Role tłumaczą się na uprawnienia podczas autoryzacji. Przykłady ról specyficznych dla aplikacji w programie CAMS obejmują menedżera kont, przedstawiciela pomocy technicznej poziomu 1 (L1) i przedstawiciela usługi Field Service. Rola Menedżer kont ma uprawnienia do dodawania nowych użytkowników aplikacji i klientów. Przedstawiciel usługi Field Service może tworzyć bilety pomocy technicznej. Atrybut PreAuthorize ogranicza dostęp do określonych ról.

        @GetMapping("/new")
        @PreAuthorize("hasAnyAuthority('APPROLE_AccountManager')")
        public String newAccount(Model model) {
            if (model.getAttribute("account") == null) {
                List<ServicePlan> servicePlans = accountService.findAllServicePlans();
                ServicePlan defaultServicePlan = servicePlans.stream().filter(sp -> sp.getIsDefault() == true).findFirst().orElse(null);
                NewAccountRequest accountFormData = new NewAccountRequest();
                accountFormData.setSelectedServicePlanId(defaultServicePlan.getId());
                model.addAttribute("account", accountFormData);
                model.addAttribute("servicePlans", servicePlans);
            }
            model.addAttribute("servicePlans", accountService.findAllServicePlans());
            return "pages/account/new";
        }
        ...
    

    Aby zintegrować się z identyfikatorem Entra firmy Microsoft, implementacja referencyjna używa przepływu udzielania kodu autoryzacji OAuth 2.0. Ten przepływ umożliwia użytkownikowi logowanie się przy użyciu konta Microsoft. Poniższy fragment kodu przedstawia sposób konfigurowania identyfikatora SecurityFilterChain Entra firmy Microsoft na potrzeby uwierzytelniania i autoryzacji.

    @Configuration(proxyBeanMethods = false)
    @EnableWebSecurity
    @EnableMethodSecurity
    public class AadOAuth2LoginSecurityConfig {
        @Bean
        SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
                .and()
                    .authorizeHttpRequests()
                .requestMatchers(EndpointRequest.to("health")).permitAll()
                .anyRequest().authenticated()
                .and()
                    .logout(logout -> logout
                                .deleteCookies("JSESSIONID", "XSRF-TOKEN")
                                .clearAuthentication(true)
                                .invalidateHttpSession(true));
            return http.build();
        }
    }
    ...
    
  • Preferuj tymczasowy dostęp do magazynu. Użyj tymczasowych uprawnień, aby chronić przed nieautoryzowanym dostępem i naruszeniami, takimi jak sygnatury dostępu współdzielonego (SAS) . Użyj usług SAS delegowania użytkowników, aby zmaksymalizować zabezpieczenia podczas udzielania tymczasowego dostępu. Jest to jedyna sygnatura dostępu współdzielonego, która używa poświadczeń identyfikatora Entra firmy Microsoft i nie wymaga trwałego klucza konta magazynu.

  • Wymuszanie autoryzacji na platformie Azure. Użyj kontroli dostępu opartej na rolach platformy Azure, aby przypisać najmniejsze uprawnienia do tożsamości użytkowników. Kontrola dostępu oparta na rolach platformy Azure określa, do jakich tożsamości zasobów platformy Azure mogą uzyskiwać dostęp, co mogą robić z tymi zasobami i do jakich obszarów mają dostęp.

  • Unikaj trwałych uprawnień z podwyższonym poziomem uprawnień. Użyj usługi Microsoft Entra Privileged Identity Management , aby udzielić dostępu just in time dla uprzywilejowanych operacji. Deweloperzy często potrzebują dostępu na poziomie administratora do tworzenia/usuwania baz danych, modyfikowania schematów tabel i zmieniania uprawnień użytkownika. Dzięki dostępowi just in time tożsamości użytkowników otrzymują tymczasowe uprawnienia do wykonywania zadań uprzywilejowanych.

Implementowanie tożsamości zarządzanych

Użyj tożsamości zarządzanych dla wszystkich usług platformy Azure, które obsługują tożsamości zarządzane. Tożsamość zarządzana umożliwia zasobom platformy Azure (tożsamościom obciążeń) uwierzytelnianie i interakcję z innymi usługami platformy Azure bez zarządzania poświadczeniami. Hybrydowe i starsze systemy mogą zapewnić lokalne rozwiązania uwierzytelniania w celu uproszczenia migracji, ale powinny przejść do tożsamości zarządzanych tak szybko, jak to możliwe. Aby zaimplementować tożsamości zarządzane, wykonaj następujące zalecenia:

  • Wybierz odpowiedni typ tożsamości zarządzanej. Preferuj tożsamości zarządzane przypisane przez użytkownika, jeśli masz co najmniej dwa zasoby platformy Azure, które wymagają tego samego zestawu uprawnień. Ta konfiguracja jest wydajniejsza niż tworzenie tożsamości zarządzanych przypisanych przez system dla każdego z tych zasobów i przypisywanie tych samych uprawnień do wszystkich z nich. W przeciwnym razie użyj tożsamości zarządzanych przypisanych przez system.

  • Konfigurowanie najmniejszych uprawnień. Użyj kontroli dostępu opartej na rolach platformy Azure, aby udzielić tylko uprawnień krytycznych dla operacji, takich jak akcje CRUD w bazach danych lub uzyskiwanie dostępu do wpisów tajnych. Uprawnienia tożsamości obciążenia są trwałe, więc nie można zapewnić uprawnień just in time ani krótkoterminowych do tożsamości obciążeń. Jeśli kontrola dostępu oparta na rolach platformy Azure nie obejmuje określonego scenariusza, uzupełnij kontrolę dostępu na podstawie ról platformy Azure przy użyciu zasad dostępu na poziomie usług platformy Azure.

  • Zabezpieczanie pozostałych wpisów tajnych. Przechowywanie pozostałych wpisów tajnych w usłudze Azure Key Vault. Załaduj wpisy tajne z usługi Key Vault podczas uruchamiania aplikacji zamiast podczas każdego żądania HTTP. Dostęp o wysokiej częstotliwości w żądaniach HTTP może przekraczać limity transakcji usługi Key Vault. Przechowywanie konfiguracji aplikacji w konfiguracji aplikacja systemu Azure.

Odpowiednie środowiska rozmiaru

Użyj warstw wydajności (SKU) usług platformy Azure, które spełniają potrzeby każdego środowiska bez nadmiaru. Aby uzyskać odpowiedni rozmiar środowisk, postępuj zgodnie z następującymi zaleceniami:

  • Szacowanie kosztów. Skorzystaj z kalkulatora cen platformy Azure, aby oszacować koszt każdego środowiska.

  • Optymalizacja kosztów w środowiskach produkcyjnych. Środowiska produkcyjne wymagają jednostek SKU spełniających umowy dotyczące poziomu usług (SLA), funkcji i skali wymaganej do produkcji. Ciągłe monitorowanie użycia zasobów i dostosowywanie jednostek SKU w celu dostosowania ich do rzeczywistych potrzeb związanych z wydajnością.

  • Optymalizacja kosztów w środowiskach przedprodukcyjnych. Środowiska przedprodukcyjne powinny korzystać z zasobów o niższych kosztach , wyłączać niepotrzebne usługi i stosować rabaty, takie jak cennik tworzenia i testowania platformy Azure. Upewnij się, że środowiska przedprodukcyjne są wystarczająco podobne do środowiska produkcyjnego , aby uniknąć wprowadzania zagrożeń. Ta równowaga zapewnia, że testowanie pozostaje skuteczne bez ponoszenia niepotrzebnych kosztów.

  • Zdefiniuj jednostki SKU przy użyciu infrastruktury jako kodu (IaC). Zaimplementuj IaC, aby dynamicznie wybierać i wdrażać odpowiednie jednostki SKU na podstawie środowiska. Takie podejście zwiększa spójność i upraszcza zarządzanie.

Na przykład implementacja referencyjna ma opcjonalny parametr, który wdraża różne jednostki SKU. Parametr środowiska instruuje szablon programu Terraform, aby wybrać jednostki SKU programowania.

azd env set APP_ENVIRONMENT prod

Implementowanie skalowania automatycznego

Skalowanie automatyczne zapewnia, że aplikacja internetowa pozostaje odporna, elastyczna i wydajna obsługa dynamicznych obciążeń. Aby zaimplementować skalowanie automatyczne, wykonaj następujące zalecenia:

  • Automatyzowanie skalowania w poziomie. Automatyczne skalowanie platformy Azure umożliwia zautomatyzowanie skalowania w poziomie w środowiskach produkcyjnych. Skonfiguruj reguły skalowania automatycznego w celu skalowania w poziomie na podstawie kluczowych metryk wydajności, aby aplikacja mogła obsługiwać różne obciążenia.

  • Uściślij wyzwalacze skalowania. Zacznij od użycia procesora CPU jako początkowego wyzwalacza skalowania, jeśli nie znasz wymagań dotyczących skalowania aplikacji. Uściślij wyzwalacze skalowania, aby uwzględnić inne metryki, takie jak pamięć RAM, przepływność sieci i operacje we/wy dysku. Celem jest dopasowanie zachowania aplikacji internetowej w celu uzyskania lepszej wydajności.

  • Podaj bufor skalowalny w poziomie. Ustaw progi skalowania w celu wyzwolenia przed osiągnięciem maksymalnej pojemności. Na przykład skonfiguruj skalowanie, aby nastąpiło przy użyciu procesora CPU na poziomie 85%, zamiast czekać, aż osiągnie 100%. Takie proaktywne podejście pomaga zachować wydajność i uniknąć potencjalnych wąskich gardeł.

Automatyzowanie wdrażania zasobów

Użyj automatyzacji, aby wdrożyć i zaktualizować zasoby i kod platformy Azure we wszystkich środowiskach. Postępuj zgodnie z następującymi zaleceniami:

  • Użyj infrastruktury jako kodu. Wdrażanie infrastruktury jako kodu za pośrednictwem potoków ciągłej integracji i ciągłego dostarczania (CI/CD). Platforma Azure ma wstępnie utworzone szablony Bicep, ARM (JSON) i Terraform dla każdego zasobu platformy Azure.

  • Użyj potoku ciągłej integracji/ciągłego wdrażania (CI/CD). Użyj potoku ciągłej integracji/ciągłego wdrażania, aby wdrożyć kod z kontroli źródła w różnych środowiskach, takich jak testowanie, przemieszczanie i produkcja. Skorzystaj z usługi Azure Pipelines, jeśli pracujesz z usługą Azure DevOps lub GitHub Actions dla projektów usługi GitHub.

  • Integrowanie testów jednostkowych. Określ priorytety wykonywania i przekazywania wszystkich testów jednostkowych w potoku przed każdym wdrożeniem do usługi App Services. Uwzględnij narzędzia jakości kodu i pokrycia, takie jak SonarQube, aby uzyskać kompleksowy zakres testowania.

  • Przyjęcie makiety platformy. Do testowania z udziałem zewnętrznych punktów końcowych użyj pozorujących struktur. Te struktury umożliwiają tworzenie symulowanych punktów końcowych. Eliminują one konieczność konfigurowania rzeczywistych zewnętrznych punktów końcowych i zapewnienia jednolitych warunków testowania w różnych środowiskach.

  • Przeprowadź skanowanie zabezpieczeń. Stosowanie statycznych testów zabezpieczeń aplikacji (SAST) w celu znalezienia błędów zabezpieczeń i kodowania w kodzie źródłowym. Ponadto przeprowadź analizę kompozycji oprogramowania (SCA), aby zbadać biblioteki i składniki innych firm pod kątem zagrożeń bezpieczeństwa. Narzędzia do tych analiz są łatwo zintegrowane zarówno z usługami GitHub, jak i Azure DevOps.

Konfigurowanie monitorowania

Zaimplementuj monitorowanie aplikacji i platformy, aby zwiększyć doskonałość operacyjną i wydajność aplikacji internetowej. Aby zaimplementować monitorowanie, wykonaj następujące zalecenia:

  • Zbieranie danych telemetrycznych aplikacji. Użyj autoinstrumentacji w usłudze aplikacja systemu Azure Insights, aby zbierać dane telemetryczne aplikacji, takie jak przepływność żądań, średni czas trwania żądania, błędy i monitorowanie zależności, bez zmian w kodzie. Platforma Spring Boot rejestruje kilka podstawowych metryk w usłudze Application Insights, takich jak maszyna wirtualna Java (JVM), procesor CPU, Tomcat i inne. Usługa Application Insights automatycznie zbiera dane z platform rejestrowania, takich jak Log4j i Logback. Na przykład implementacja referencyjna używa usługi Application Insights włączonej za pomocą narzędzia Terraform w ramach konfiguracji usługi App Service app_settings . (zobacz następujący kod).

    app_settings = {
        APPLICATIONINSIGHTS_CONNECTION_STRING = var.app_insights_connection_string
        ApplicationInsightsAgent_EXTENSION_VERSION = "~3"
        ...
    }
    

    Aby uzyskać więcej informacji, zobacz:

  • Tworzenie niestandardowych metryk aplikacji. Zaimplementuj instrumentację opartą na kodzie, aby przechwycić telemetrię aplikacji niestandardowej, dodając zestaw SDK usługi Application Insights i używając jego interfejsu API.

  • Monitorowanie platformy. Włącz diagnostykę dla wszystkich obsługiwanych usług i wyślij diagnostykę do tego samego miejsca docelowego co dzienniki aplikacji na potrzeby korelacji. Usługi platformy Azure tworzą dzienniki platformy automatycznie, ale przechowują je tylko po włączeniu diagnostyki. Włącz ustawienia diagnostyczne dla każdej usługi obsługującej diagnostykę. Implementacja referencyjna używa narzędzia Terraform do włączenia diagnostyki platformy Azure dla wszystkich obsługiwanych usług. Poniższy kod narzędzia Terraform konfiguruje ustawienia diagnostyczne dla usługi App Service.

    # Configure Diagnostic Settings for App Service
    resource "azurerm_monitor_diagnostic_setting" "app_service_diagnostic" {
      name                           = "app-service-diagnostic-settings"
      target_resource_id             = azurerm_linux_web_app.application.id
      log_analytics_workspace_id     = var.log_analytics_workspace_id
      #log_analytics_destination_type = "AzureDiagnostics"
    
      enabled_log {
        category_group = "allLogs"
    
      }
    
      metric {
        category = "AllMetrics"
        enabled  = true
      }
    }
    

Wdrażanie implementacji referencyjnej

Implementacja referencyjna prowadzi deweloperów przez symulowaną migrację z lokalnej aplikacji Java na platformę Azure, podkreślając niezbędne zmiany w początkowej fazie wdrażania. W tym przykładzie użyto aplikacji internetowej systemu zarządzania kontami klienta (CAMS) dla fikcyjnej firmy Contoso Fiber. Firma Contoso Fiber wyznaczyła następujące cele dla swojej aplikacji internetowej:

  • Implementowanie tanich zmian kodu o wysokiej wartości
  • Osiągnięcie celu poziomu usług (SLO) w wysokości 99,9%
  • Wdrażanie praktyk metodyki DevOps
  • Tworzenie środowisk zoptymalizowanych pod kątem kosztów
  • Zwiększanie niezawodności i bezpieczeństwa

Firma Contoso Fiber ustaliła, że ich infrastruktura lokalna nie była opłacalnym rozwiązaniem, które spełnia te cele. Zdecydowali, że migracja aplikacji internetowej CAMS na platformę Azure była najbardziej opłacalnym sposobem osiągnięcia ich natychmiastowych i przyszłych celów. Poniższa architektura reprezentuje stan końcowy implementacji wzorca Niezawodnej aplikacji internetowej firmy Contoso Fiber.

Diagram przedstawiający architekturę implementacji referencyjnej.Rysunek 4. Architektura implementacji referencyjnej. Pobierz plik programu Visio tej architektury.