Wzorzec niezawodnej aplikacji internetowej dla języka Java
Ten artykuł zawiera wskazówki dotyczące implementowania wzorca niezawodnej aplikacji internetowej. W tym wzorcu opisano sposób modyfikowania (replatformowania) aplikacji internetowych na potrzeby migracji do chmury. Zawiera on normatywne wskazówki dotyczące architektury, kodu i konfiguracji, które są zgodne z zasadami Azure Well-Architected Framework.
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 ich do chmury. Koncentruje się on na minimalnych aktualizacjach kodu, które należy zapewnić powodzenie w chmurze. Poniższe wskazówki używają implementacji referencyjnej jako przykładu w całym. Następuje replatformowa podróż 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
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 dotyczące implementowania wzorca niezawodnej aplikacji internetowej. Skorzystaj z poniższych linków, aby przejść do konkretnych potrzebnych wskazówek:
- kontekst biznesowy. Dopasuj 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, wyłącznik i wzorce Cache-Aside.
- wskazówki dotyczące konfiguracji . Konfigurowanie uwierzytelniania i autoryzacji, tożsamości zarządzanych, środowisk z 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 (SLO) 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 chciała rozszerzyć lokalną aplikację internetową 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ągnąć cel slo 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 do skalowania aplikacji. Zdecydowali, że migracja aplikacji internetowej CAMS na platformę Azure była najbardziej opłacalnym sposobem osiągnięcia swoich 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 kierowania i ochrony 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 ułatwić zrozumienie aplikacji internetowej.
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 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. Oba 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 przy użyciu zwiększonych zabezpieczeń. (Zobacz rysunek 2.)
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 używać wielu sieci wirtualnych, użyj topologii sieci piasty i szprych . Zapewnia ona korzyści związane z kosztami, zarządzaniem i zabezpieczeniami oraz opcje łą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 funkcji lokalnej aplikacji internetowej. To 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 przeniesieniem jej 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ę Azure App Service jako platformę aplikacji z następujących powodów:
- Naturalny progresja. Firma Contoso Fiber wdrożyła plik Spring Boot
jar
na serwerze lokalnym i chciała zminimalizować ilość 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 Container Apps? i Język Java w usłudze Azure Container Apps — omówienie. - Wysoka umowa SLA. Usługa App Service zapewnia wysoką umowę SLA spełniającą wymagania środowiska produkcyjnego.
- Zmniejszenie nakładu pracy związanego z zarządzaniem. App Service 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.
- Naturalny progresja. Firma Contoso Fiber wdrożyła plik Spring Boot
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.
- Skalowalność. Microsoft Entra ID skaluje 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. Identyfikator Entra firmy Microsoft 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, aby kierować wyborem. Firma Contoso Fiber wybrała usługę Azure Database for PostgreSQL i model wdrażania 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. Usługa Azure Database for PostgreSQL udostępnia funkcję repliki do odczytu, która umożliwia asynchroniczne replikowanie danych do bazy danych repliki tylko do odczytu w innym regionie.
- Wydajność. Usługa Azure Database for PostgreSQL zapewnia przewidywalną wydajność i inteligentne dostrajanie, które poprawia wydajność bazy danych przy użyciu rzeczywistych danych użycia.
- Zmniejszenie nakładu pracy związanego 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. Firma Contoso może użyć narzędzia do migracji , aby uprościć proces migracji.
- Spójność z konfiguracjami lokalnymi. Obsługuje ona 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 w magazynie strefowo nadmiarowym (ZRS) w tym samym regionie. Firma Contoso może przywrócić bazę danych do dowolnego punktu w czasie, który znajduje się 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.
Cache: Wybierz, czy dodać pamięć podręczną do architektury aplikacji internetowej. azure cache for Redis jest podstawowym rozwiązaniem pamięci podręcznej platformy Azure. Jest to zarządzany magazyn danych w pamięci oparty na oprogramowaniu Redis. Firma Contoso Fiber dodała usługę Azure Cache for Redis z następujących powodów:
- Szybkość i głośność. Zapewnia ona 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órą 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 bez szminki. Pamięć podręczna umożliwia aplikacji internetowej externalizowanie stanu sesji i używanie sesji bez szminki. Większość aplikacji internetowych Java, które działają lokalnie, używają buforowania po stronie klienta w pamięci. Buforowanie po stronie klienta w pamięci nie jest skalowane dobrze i zwiększa zużycie pamięci na hoście. Dzięki usłudze 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 używała struktury abstrakcji pamięci podręcznej (Spring Cache) i potrzebowała tylko minimalnych zmian konfiguracji w celu wymiany 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ń typu platforma jako usługa (PaaS) powinny używać usług Azure Front Door, Azure Application Gateway lub obu tych rozwiązań w zależności od architektury i wymagań 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 i aplikacją internetową z wieloma regionami, aby spełnić cel slo 99.9%. Firma Contoso 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 usługą Azure Web Application Firewall.
- 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. Usługa Azure Front Door obsługuje wbudowane raporty z pulpitem nawigacyjnym typu all-in-one zarówno dla usługi Azure Front Door, jak i wzorców zabezpieczeń. Możesz skonfigurować alerty zintegrowane z usługą Azure Monitor. Usługa Azure Front Door 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 ona firmę 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 ulepszoną globalną ochronę aplikacji internetowych bez poświęcania 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ądzaną przez it.
- Łatwość użytkowania. 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. Usługa Key Vault ułatwia inspekcję dostępu i generuje alerty w przypadku zmiany przechowywanych wpisów tajnych.
- Integracja. Usługa Key Vault zapewnia natywną integrację z magazynem konfiguracji platformy Azure (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ń PaaS 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:
- Komunikacja z zwiększonymi 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, więc wymagana jest minimalna zmiana.
Zabezpieczenia sieciowe: użyj usługi Azure Firewall , aby kontrolować ruch przychodzący i wychodzący na poziomie sieci. Użyj usługi Azure Bastion, aby nawiązać połączenie z maszynami wirtualnymi z rozszerzonymi zabezpieczeniami 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 na potrzeby wdrożeń zabezpieczeń rozszerzonych z hosta przesiadkowego w podsieci DevOps.
Wskazówki dotyczące kodu
Aby pomyślnie przenieść aplikację internetową do chmury, należy zaktualizować kod aplikacji internetowej przy użyciu wzorca ponawiania, wzorca wyłącznika i wzorca Cache-Aside.
Rysunek 3. Role wzorców projektowych.
Każdy wzorzec projektu zapewnia korzyści projektowe obciążeń, które są zgodne z co najmniej jednym filarem Well-Architected Framework. Oto omówienie wzorców, które należy zaimplementować:
Wzorzec ponawiania prób. Wzorzec ponawiania próby 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.
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.
Cache-Aside wzorzec. Wzorzec Cache-Aside ładuje dane na żądanie do pamięci podręcznej z magazynu 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 Cache-Aside | ✔ | ✔ |
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óźnienia między ponownymi próbami a liczbą prób do wykonania przed niepowodzeniem.
Użyj klasy Resilience4j, lekkiej biblioteki odporności na uszkodzenia, aby zaimplementować wzorzec ponawiania prób w języku Java. Implementacja referencyjna dodaje wzorzec ponawiania, dekorując metodę listServicePlans kontrolera planu usługi za pomocą adnotacji Ponów próbę. 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. Zasady ponawiania dla implementacji referencyjnej obejmują maksymalną liczbę prób, 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 pomaga zapobiegać marnowaniu cykli procesora CPU, dzięki czemu aplikacja zachowuje integralność wydajności dla użytkowników końcowych.
Użyj wyłącznika Spring Cloud i odporności4j , aby zaimplementować wzorzec wyłącznika. 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, co zwiększa niezawodność i optymalizację kosztów. Aby zaimplementować wzorzec odkładania do pamięci podręcznej, wykonaj następujące zalecenia:
Skonfiguruj aplikację do używania pamięci podręcznej. Aby włączyć buforowanie, dodaj
spring-boot-starter-cache
pakiet jako zależność wpom.xml
pliku. Ten pakiet zawiera domyślne konfiguracje pamięci podręcznej Redis Cache.Buforowanie danych o wysokiej potrzebie. Zastosuj wzorzec Cache-Aside dla 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 Cache-Aside. Aby buforować określone dane w kodzie, dodaj adnotację
@Cacheable
. Ta adnotacja określa 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. Użyj zmienności danych, a użytkownik musi określić optymalną częstotliwość odświeżania. Dzięki temu aplikacja korzysta ze wzorca Cache-Aside 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. Można na przykład 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 zostaną usunięte.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 |
|||
Środowiska rightsize | ✔ |
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ą platformyMicrosoft 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. Korzysta z usług Spring Security i Spring Boot, aby zapewnić łatwą konfigurację. Zapewnia ona różne przepływy uwierzytelniania, automatyczne zarządzanie tokenami, dostosowywalne zasady autoryzacji i możliwości integracji ze składnikami platformy Spring Cloud. Ta usługa umożliwia prostą integrację aplikacji Microsoft Entra ID i OAuth 2.0 z aplikacjami Spring Boot bez ręcznej konfiguracji biblioteki lub ustawień.
Implementacja referencyjna używa platformy tożsamości firmy 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
umożliwia uwierzytelnianie i autoryzację OAuth 2.0 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>
Utwórz rejestrację aplikacji. Identyfikator Entra firmy Microsoft wymaga rejestracji aplikacji w dzierżawie podstawowej. Rejestracja aplikacji pomaga zapewnić, że użytkownicy, którzy uzyskują dostęp do aplikacji internetowej, mają tożsamości w dzierżawie podstawowej. Implementacja referencyjna używa narzędzia Terraform do utworzenia rejestracji aplikacji Microsoft Entra ID razem z rolą Menedżera kont specyficzną dla 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.
Implementacja referencyjna tworzy role aplikacji, które odzwierciedlają 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 to Menedżer kont, Przedstawiciel pomocy technicznej poziomu 1 (L1) i przedstawiciel usługi terenowej. 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. Na przykład można użyć sygnatur dostępu współdzielonego (SAS), aby ograniczyć dostęp do okresu. Użyj sygnatury dostępu współdzielonego delegowania użytkownika, aby zmaksymalizować bezpieczeństwo 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 definiuje zasoby platformy Azure, do których tożsamości mogą uzyskiwać dostęp, co mogą robić z tymi zasobami, oraz obszary, do których 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. W przypadku korzystania z dostępu 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 je obsługują. Tożsamość zarządzana umożliwia zasobom platformy Azure (tożsamościom obciążeń) uwierzytelnianie w innych usługach platformy Azure i interakcję z nimi bez konieczności zarządzania poświadczeniami. Aby uprościć migrację, można nadal używać lokalnych rozwiązań uwierzytelniania dla systemów hybrydowych i starszych, ale należy je jak najszybciej przenieść do tożsamości zarządzanych. 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ń. Takie podejście jest bardziej wydajne 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 RBAC 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.
Zapewnij bezpieczeństwo 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.
Środowiska rightsize
Używaj warstw wydajności (SKU) usług platformy Azure spełniających potrzeby każdego środowiska bez przekraczania ich. Aby rozbudować odpowiednie środowiska, 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 środowisk 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ą.
środowiska przedprodukcyjne optymalizacji kosztów.środowiska przedprodukcyjne powinny korzystać z zasobów o niższych kosztach i korzystać z rabatów, takich jak cennik usługi Azure Dev/Test. W tych środowiskach należy wyłączyć usługi, które nie są potrzebne. Jednocześnie upewnij się, że środowiska przedprodukcyjne są wystarczająco podobne do środowisk produkcyjnych, aby uniknąć wprowadzania zagrożeń. Utrzymanie tej równowagi gwarantuje, że testowanie będzie skuteczne bez ponoszenia niepotrzebnych kosztów.
Użyj infrastruktury jako kodu (IaC), aby zdefiniować jednostki SKU. 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 określający jednostkę SKU do wdrożenia. Parametr środowiska określa, że szablon programu Terraform powinien wdrożyć jednostki SKU programistyczne:
azd env set APP_ENVIRONMENT prod
Implementowanie skalowania automatycznego
Skalowanie automatyczne pomaga zapewnić, że aplikacja internetowa pozostaje odporna, elastyczna i wydajna obsługa obciążeń dynamicznych. 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. Użyj 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 tak, aby wyzwalały się 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. Wdróż infrastrukturę jako kod przy użyciu potoków ciągłej integracji i ciągłego dostarczania (CI/CD). Platforma Azure udostępnia 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. Użyj usługi Azure Pipelines, jeśli pracujesz z usługą Azure DevOps. Użyj funkcji GitHub Actions dla projektów 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.
Adopt makiety struktur. Do testowania obejmującego zewnętrzne punkty końcowe należy używać 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ń. Użyj statycznego testowania zabezpieczeń aplikacji (SAST), aby znaleźć błędy zabezpieczeń i błędy 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 można łatwo zintegrować 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 Azure Application Insights, aby zbierać dane telemetryczne aplikacji, takie jak przepływność żądań, średni czas trwania żądania, błędy i monitorowanie zależności. Nie musisz zmieniać żadnego kodu, aby używać tej telemetrii. 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.
Implementacja referencyjna korzysta z usługi Application Insights, która jest włączona
app_settings
za pośrednictwem narzędzia Terraform w konfiguracji usługi App Service: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. Wyślij diagnostykę do tego samego miejsca docelowego co dzienniki aplikacji w celu 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ę lokalnej aplikacji Java na platformę Azure, podkreślając zmiany, które są niezbędne podczas początkowej fazy wdrażania. W tym przykładzie użyto aplikacji internetowej CAMS dla fikcyjnej firmy Contoso Fiber. Firma Contoso Fiber wyznaczyła następujące cele dla aplikacji internetowej:
- Implementowanie tanich, wysokowartych zmian kodu.
- Osiągnij cel slo 99,9%.
- Wdrażanie praktyk metodyki DevOps.
- Tworzenie środowisk zoptymalizowanych pod kątem kosztów.
- Zwiększ niezawodność i bezpieczeństwo.
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 bezpośrednich i przyszłych celów. Poniższa architektura reprezentuje stan końcowy implementacji wzorca Reliable Web App firmy Contoso Fiber.
Rysunek 4. Architektura implementacji referencyjnej. Pobierz plik programu Visio tej architektury.