Skalowanie przy użyciu kompleksowego zabezpieczeń, monitorowania i automatyzacji
Podczas projektowania aplikacji musimy określić, jak dostosować się do zmian obciążenia, odzyskać dane po nieoczekiwanych awariach, zminimalizować zagrożenia bezpieczeństwa itd. Chociaż można zacząć od podejścia próbnego i błędu, to zajmuje trochę czasu od innych celów organizacyjnych i może negatywnie wpłynąć na naszą reputację. Platforma Azure udostępnia wskazówki dotyczące architektury potrzebne do uzyskania rzeczy od samego początku. Masz również wszystko, czego potrzebujesz, aby utworzyć skalowalną aplikację — od najnowocześniejszego zabezpieczeń i automatycznego skalowania do usług pomocniczych dla danych, komunikatów, buforowania, monitorowania wydajności i automatyzacji. Wiele z tych usług pomocniczych opiera się również na popularnym oprogramowaniu typu open source — takim jak PostgreSQL, Redis, JMS i Kafka — dzięki czemu nie masz dostępu do zastrzeżonych rozwiązań.
Diagram z nagłówkiem "Usługi platformy" i logo usług opisanych w tym artykule.
Teraz przyjrzyjmy się niektórym kluczowym usługom i funkcjom platformy Azure oraz sposobom ich używania do tworzenia skalowalnych aplikacji Java.
Rozszerzanie możliwości aplikacji Java — baz danych i obsługi komunikatów
Oprócz zapewniania kilku opcji uruchamiania kodu Java platforma Azure oferuje szeroką gamę w pełni zarządzanych usług do obsługi potrzeb bazy danych — w tym usług Azure Database for PostgreSQL, Azure Database for MySQL, MongoDB Atlas, Azure Cosmos DB, Azure SQL Database i Azure SQL Managed Instance. To samo dotyczy obsługi komunikatów z opcjami obejmującymi usługę Azure Service Bus, usługę Azure Event Hubs i platformę Apache Kafka dla platformy Confluent Cloud.
Warstwa Premium usługi Azure Service Bus obsługuje program JMS , model programowania usługi Java Messaging Service. Niezależnie od tego, czy aplikacje są uruchomione na maszynach wirtualnych, w rozwiązaniu Kubernetes, czy w pełni zarządzanych usługach PaaS, możesz szybko aprowizować i używać tych w pełni zarządzanych usług danych i obsługi komunikatów przy użyciu klientów typu open source, zestawów SDK języka Java platformy Azure, startów Spring i integracji serwera aplikacji. Wszystkie te elementy zapewniają gwarancje zgodności, dostępności i niezawodności, których można oczekiwać od firmy Microsoft i platformy Azure. Wielu deweloperów języka Java i platformy Spring chce używać bibliotek idiomatycznych, aby uprościć połączenia z preferowanymi usługami w chmurze. Firma Microsoft utrzymuje kompleksową listę bibliotek, sterowników i modułów , które umożliwiają łatwą interakcję z usługami platformy Azure między danymi, komunikatami, pamięcią podręczną, magazynem, zdarzeniami, katalogiem i wpisami tajnymi. Aby uzyskać więcej informacji, zobacz Przewodnik dla deweloperów platformy Azure spring Cloud.
Zero-Trust — bezpieczna sieć
Aplikacje Java można zabezpieczyć, wdrażając je w usłudze Azure Virtual Network — podstawowy blok konstrukcyjny dla własnych sieci prywatnych na platformie Azure. Sieci wirtualne umożliwiają wielu typom zasobów platformy Azure bezpieczne komunikowanie się ze sobą, z Internetem oraz z lokalnymi sieciami i systemami. Możesz użyć sieci wirtualnej, aby odizolować aplikacje i obsługiwać usługi zaplecza z Internetu i umieścić je w sieciach prywatnych. Możesz przejąć pełną kontrolę nad przychodzącymi i wychodzącymi dla aplikacji i systemów zaplecza.
Diagram akceleratora strefy docelowej usługi Azure Container Apps.
Zero-Trust — kompleksowa bezpieczna komunikacja
Implementowanie bezpiecznej komunikacji w ramach architektury rozwiązania może być trudne. Wiele firm ręcznie wymienia certyfikaty lub tworzy własne rozwiązania w celu zautomatyzowania aprowizacji i konfiguracji. Nawet wtedy nadal istnieją zagrożenia eksfiltracji danych, takie jak nieautoryzowane kopiowanie lub transfer danych.
Za pomocą platformy Azure możesz zabezpieczyć kompleksową komunikację lub zakończyć zabezpieczenia na poziomie transportu w dowolnym punkcie komunikacji. Możesz również zautomatyzować aprowizowanie i konfigurację dla wszystkich zasobów platformy Azure potrzebnych do zabezpieczania komunikacji.
W oparciu o zasadę "nigdy nie ufaj, zawsze weryfikuj i bez poświadczeń" , zero trust pomaga zabezpieczyć całą komunikację poprzez wyeliminowanie nieznanych i niezarządzanych certyfikatów, a także poprzez zaufanie tylko certyfikatów, które są współużytkowane przez weryfikację tożsamości przed udzieleniem dostępu do tych certyfikatów. Można użyć dowolnego typu certyfikatu TLS/SSL, w tym certyfikatów wystawionych przez urząd certyfikacji, certyfikatów rozszerzonej weryfikacji, certyfikatów wieloznacznych z obsługą dowolnej liczby domen podrzędnych lub certyfikatów z podpisem własnym dla środowisk deweloperskich i testowych.
Aplikacje Java lub Spring Boot mogą bezpiecznie ładować certyfikaty z usługi Azure Key Vault (omówione w dalszej części). Usługa Azure Key Vault kontroluje magazyn i dystrybucję certyfikatów w celu zmniejszenia przypadkowego wycieku. Aplikacje i usługi mogą bezpiecznie uzyskiwać dostęp do certyfikatów przy użyciu tożsamości zarządzanych, kontroli dostępu opartej na rolach i zasady najniższych uprawnień. To bezpieczne ładowanie jest obsługiwane przy użyciu dostawcy JCA (Java Cryptography Architecture) usługi Azure Key Vault.
Diagram architektury bezpiecznej komunikacji kompleksowej dla aplikacji Spring Boot.
Zero-Trust — zarządzanie wpisami tajnymi
Wiele aplikacji Java łączy się z usługami pomocniczymi przy użyciu adresów URL i poświadczeń — informacje, które, jeśli zostaną ujawnione, mogą służyć do uzyskania nieautoryzowanego dostępu do poufnych danych. Osadzanie takich informacji w samej aplikacji stanowi ogromne zagrożenie bezpieczeństwa z wielu powodów, w tym odnajdywanie za pośrednictwem repozytorium kodu. Wielu deweloperów zewnętrznych takich poświadczeń przy użyciu zmiennych środowiskowych, dzięki czemu wiele aplikacji może je załadować, ale zmienia to tylko ryzyko z samego kodu na środowisko wykonawcze.
Usługa Azure Key Vault zapewnia lepszy, bezpieczniejszy i bardziej bezpieczny sposób ochrony wpisów tajnych. Zapewnia pełną kontrolę nad magazynem i dystrybucją wpisów tajnych aplikacji przy użyciu kontroli dostępu opartej na rolach (RBAC) i zasady najniższych uprawnień w celu ograniczenia dostępu. Zachowaj kontrolę nad wpisami tajnymi aplikacji — po prostu przyznaj aplikacjom uprawnienia do korzystania z nich zgodnie z potrzebami. Po uruchomieniu aplikacji przed udzieleniem dostępu do wpisów tajnych aplikacja uwierzytelnia się przy użyciu identyfikatora Microsoft Entra i autoryzowania usługi Azure Key Vault przy użyciu kontroli dostępu opartej na rolach platformy Azure. Usługa Azure Key Vault obejmuje pełne możliwości inspekcji i ma dwie warstwy usług: Standardowa, która szyfruje przy użyciu klucza oprogramowania i warstwę Premium, która obejmuje sprzętowe klucze chronione przez moduł zabezpieczeń (HSM).
Uwierzytelnianie i autoryzacja użytkownika końcowego
Większość aplikacji Java dla przedsiębiorstw wymaga uwierzytelniania i autoryzacji użytkownika, które można zaimplementować przy użyciu identyfikatora Entra firmy Microsoft — kompletnego rozwiązania do zarządzania tożsamościami i dostępem ze zintegrowanymi zabezpieczeniami. Konta użytkowników końcowych mogą być tożsamościami organizacyjnymi lub tożsamościami społecznościowymi z serwisu Facebook, Twitter lub Gmail przy użyciu identyfikatora Microsoft Entra i usługi Azure Active Directory B2C. Rozwiązania oparte na identyfikatorach Entra firmy Microsoft można zaimplementować przy użyciu biblioteki Microsoft Authentication Library for Java lub Spring Boot Starter dla firmy Microsoft Entra. Możesz również użyć dowolnego wybranego dostawcy tożsamości — takiego jak ForgeRock, Auth0, Ping lub Okta.
Monitorowanie kompleksowego monitorowania
Za pomocą platformy Azure możesz monitorować kompleksowe aplikacje Java przy użyciu dowolnego narzędzia i platformy. Alternatywnie można zaimplementować w pełni zarządzane, natywne monitorowanie — w tym monitorowanie wydajności aplikacji (APM) — przy użyciu usługi Application Insights, funkcji usługi Azure Monitor. Zapewnia ona silną obsługę środowisk Java, Spring i, takich jak Micrometer i Spring Boot, umożliwiając szybkie identyfikowanie i rozwiązywanie problemów. Funkcje obejmują przesyłanie strumieniowe metryk na żywo, śledzenie żądań i czas odpowiedzi, śledzenie zdarzeń i zewnętrzne współczynniki zależności — wszystko, czego potrzebujesz, aby monitorować dostępność, wydajność, niezawodność i użycie aplikacji Java działających na platformie Azure lub lokalnie.
Kompleksowe monitorowanie można monitorować, agregując dzienniki i metryki w usłudze Log Analytics, narzędzie w witrynie Azure Portal, które może służyć do edytowania i uruchamiania zapytań dotyczących dzienników i danych metryk w usłudze Azure Monitor. Możesz napisać zapytanie zwracające zestaw rekordów, a następnie użyć usługi Log Analytics do sortowania, filtrowania i analizowania ich. Możesz też napisać bardziej zaawansowane zapytanie, aby przeprowadzić analizę statystyczną i zwizualizować wyniki na wykresie, ponieważ może być konieczne zidentyfikowanie określonego trendu. Niezależnie od tego, czy pracujesz z wynikami zapytań interaktywnie, czy używasz ich z innymi funkcjami usługi Azure Monitor, takimi jak alerty zapytań dzienników lub skoroszyty, usługa Log Analytics jest dobrym narzędziem do pisania i testowania zapytań.
Zdajemy sobie sprawę, że klienci, którzy przenoszą swoje aplikacje Java na platformę Azure, mogą nadal korzystać z tych samych narzędzi APM, których używają do monitorowania aplikacji lokalnych. Aby zapewnić obsługę tego użycia, nawiązaliśmy współpracowaliśmy z new Relic, AppDynamics, Dynatrace i Elastic, aby zintegrować swoje rozwiązania do monitorowania z usługami aplikacja systemu Azure Service i Azure Container Apps. Monitorowanie agentów jest uruchamiane obok kodu, a my instalujemy i aktualizujemy agentów. Podczas wdrażania w usłudze Azure Container Apps, Azure Kubernetes Service lub Virtual Machines można uruchomić dowolnego z tych agentów (w tym nowych agentów, AppDynamics, Dynatrace, Elastic i Datadog), ale musisz zainstalować je samodzielnie i zarządzać nimi. Podobnie można monitorować kompleksowe funkcje, agregując dzienniki i metryki w rozwiązaniu Elastic and Splunk.
Zdajemy sobie również sprawę, że wielu klientów chce nadal używać narzędzia Grafana do wykonywania zapytań, wizualizowania, zgłaszania alertów i zrozumienia metryk. Z tego powodu współpracujemy z usługą Grafana Labs w celu dostarczania usługi Azure Managed Grafana, w pełni zarządzanej usługi, która umożliwia klientom natywne uruchamianie narzędzia Grafana na platformie Azure. Usługa ułatwia wdrażanie bezpiecznych i skalowalnych wystąpień narzędzia Grafana oraz łączenie ich z źródłami danych typu open source, chmury i innych firm na potrzeby wizualizacji i analizy. Usługa jest zoptymalizowana pod kątem natywnych dla platformy Azure źródeł danych, takich jak Azure Monitor i Azure Data Explorer, i obejmuje integrację monitorowania wydajności aplikacji (APM) z usługami obliczeniowymi platformy Azure, takimi jak aplikacja systemu Azure Service, Azure Container Apps, Azure Kubernetes Service, Splunk, Datadog i Azure Virtual Machines.
Przyspieszanie aplikacji Java przy użyciu buforowania
Wraz ze wzrostem obciążeń aplikacji Java można zwiększyć wydajność przy użyciu usługi Azure Cache for Redis w celu zaimplementowania warstwy buforowania w pamięci na potrzeby wyników zapytań, stanów sesji i zawartości statycznej. Jest to doskonały sposób na zwiększenie przepływności aplikacji i zmniejszenie opóźnienia bez konieczności zmieniania architektury bazowej bazy danych. Warstwy przedsiębiorstwa usługi Azure Cache for Redis opracowane we współpracy z usługą Redis i w pełni zarządzane przez firmę Microsoft to najbardziej dostępna i skalowalna opcja wdrażania do uruchamiania usługi Redis na platformie Azure , w tym funkcje, takie jak aktywna replikacja geograficzna, zarządzanie sesjami zewnętrznymi oraz szybkie wyszukiwanie i indeksowanie.
Automatyczne skalowanie
Wszystkie usługi "obliczeniowe" platformy Azure do uruchamiania aplikacji Java obsługują automatyczne skalowanie (skalowanie automatyczne), które mogą pomóc zmaksymalizować wydajność kosztową i dostosować się do zmieniających się obciążeń bez płacenia za większą pojemność niż potrzebujesz. Po włączeniu możesz mieć pewność, że skalowanie automatyczne zajmuje się podstawową infrastrukturą i obciążeniami aplikacji.
Możesz automatycznie skalować w poziomie lub na podstawie obciążenia lub harmonogramu. W trybie opartym na obciążeniach (lub opartym na metrykach) aplikacje są skalowane w poziomie do zasobów potrzebnych do obsługi obciążenia do ustawionych limitów. Podobnie, gdy obciążenie zmniejsza się, zasoby są skalowane w poziomie, nigdy nie spadają poniżej ustawionych minimalnych wartości.
W trybie opartym na harmonogramie aplikacje są skalowane w poziomie i skalowane w poziomie na podstawie zdefiniowanego harmonogramu i limitów. Tryb oparty na harmonogramie jest przydatny w przypadku obciążeń, które są zgodne z przewidywalnym wzorcem i mogą służyć do ustanowienia punktu odniesienia w celu uzyskania większego skalowania opartego na obciążeniu.
Automatyzacja od pomysłu do środowiska produkcyjnego
W miarę przenoszenia aplikacji do chmury chcesz zautomatyzować wszystko — zgodnie z potrzebami w przypadku programowania w języku Java w skali przedsiębiorstwa. Należy rozważyć automatyczne skalowanie w celu rozwiązania problemów z obciążeniami aplikacji, jak opisano wcześniej. Należy jednak również skalować i automatyzować całe środowisko chmury — najlepiej od pomysłu do środowiska produkcyjnego — w tym jak szybko aprowizować nowe środowiska na potrzeby testowania, kontroli jakości, produkcji, wdrożeń niebieskich/zielonych, rozszerzania geograficznego itd.
Platforma Azure umożliwia automatyzację od pomysłu do środowiska produkcyjnego przy użyciu szerokiej gamy narzędzi i platform. Na wysokim poziomie takie potoki automatyzacji można podzielić na trzy kategorie:
Potoki aprowizacji — możesz aprowizować zasoby platformy Azure przy użyciu szablonów terraform, szablonów usługi Azure Resource Manager (ARM), szablonów Bicep lub interfejsu wiersza polecenia platformy Azure, zgodnie z potrzebami, aby tworzyć powtarzalne skrypty w celu spójnego wirowania i uruchamiania środowisk.
Potoki kompilacji — na podstawie narzędzi, takich jak Maven lub Gradle, zgodnie z opisem we wcześniejszej części tej dokumentacji.
Potoki wdrażania — możesz użyć funkcji GitHub Actions, azure Pipelines, Jenkins Pipelines, GitLab Pipelines lub interfejsu wiersza polecenia platformy Azure, aby zautomatyzować wdrożenia kodu, w tym wdrożenia niebieskie/zielone, które zachowują krytyczne systemy w środowisku produkcyjnym podczas wdrażania aktualizacji kodu.
Kontynuuj korzystanie z istniejących rozwiązań i systemów
Podczas migracji lub kompilowania, a następnie skalowania aplikacji Java na platformie Azure, możesz użyć istniejących inwestycji w sieć, monitorowanie, automatyzację, dostawców tożsamości, systemy lokalne, narzędzie programistyczne i kompilowanie oraz biblioteki aplikacji. Poniższa tabela zawiera kilka przykładów:
Kategoria | Produkty i usługi ekosystemu Java |
---|---|
Sieć | F5, Palo Alto, Cloudflare, Checkpoint, Infoblox |
Monitorowanie | New Relic, Dynatrace, AppDynamics, Elastic, Splunk |
Automation | GitHub Actions, Azure Pipelines, Jenkins, GitLab |
Dostawcy tożsamości | Microsoft Entra ID, ForgeRock, Auth0, Ping, Okta |
System lokalny | Bazy danych (takie jak Oracle DB lub IBM DB2), komunikaty (takie jak IBM MQ lub TIBCO EMS), zdarzenia (takie jak Kafka), katalogi (takie jak Microsoft Entra ID, OpenLDAP lub IBM ID) |
Narzędzia programistyczne | IntelliJ, Visual Studio Code, Eclipse, Spring Tool Suite, Maven, Gradle |
Architektury odwołań
Centrum architektury platformy Azure zawiera wskazówki dotyczące tworzenia rozwiązań na platformie Azure przy użyciu ustalonych wzorców i praktyk, w tym sposobu stosowania tych funkcji. Te architektury referencyjne są oparte na tym, czego dowiedzieliśmy się z zaangażowania klientów, biorąc pod uwagę optymalizację kosztów, doskonałość operacyjną, wydajność wydajności, niezawodność, skalowalność, bezpieczeństwo, monitorowanie, testowanie weryfikacyjne kompilacji i nie tylko. Dotyczą one również składników projektowania rozwiązań, takich jak strefy docelowe platformy Azure — środowiska do hostowania obciążeń, które są wstępnie aprowizowania za pośrednictwem infrastruktury jako kodu, zgodnie z potrzebami, aby umożliwić migracje aplikacji Java i opracowywanie aplikacji w skali przedsiębiorstwa.
Oto na przykład akcelerator strefy docelowej dla usługi Azure Container Apps pokazujący, jak zaimplementować projekt piasty i szprychy, w którym usługa Azure Container Apps jest wdrażana w jednej szprychy, która jest zależna od usług udostępnionych hostowanych w centrum. Ten projekt został skompilowany za pomocą składników w celu osiągnięcia zestawów w witrynie Microsoft Azure Well-Architected Framework. Aby zapoznać się z implementacją tej architektury, zobacz repozytorium Akcelerator strefy docelowej usługi Azure Container Apps w witrynie GitHub. To samo podejście można zastosować do dowolnych aplikacji Java wdrożonych w dowolnym miejscu docelowym "obliczeniowym" platformy Azure , takim jak aplikacja systemu Azure Service lub Azure Kubernetes Service. Ponadto w przypadku migrowania istniejących aplikacji Java na platformę Azure mamy kompleksowy zestaw przewodników migracji i zalecanych strategii.
Następny krok
Wybieranie odpowiednich usług platformy Azure dla aplikacji Java