Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält Anleitungen zum Implementieren des zuverlässigen Web App-Musters. Dieses Muster beschreibt, wie Sie Web-Apps für die Cloudmigration replatformieren. Es stellt präscriptive Architektur, Code und Konfigurationsanleitungen bereit, die den Prinzipien des Azure Well-Architected Frameworks entsprechen.
Warum verwenden Sie das Zuverlässige Web App-Muster für Java?
Das Zuverlässige Web App-Muster ist eine Reihe von Prinzipien und Implementierungstechniken, die definieren, wie Web-Apps bei der Migration in die Cloud replatformiert werden. Es betont minimale Codeupdates, um den Erfolg in der Cloud sicherzustellen. In diesem Leitfaden wird eine Referenzimplementierung als einheitliches Beispiel verwendet. Es beschreibt die Reise der Replattformierung des fiktiven Unternehmens Contoso Fiber, um den Geschäftskontext für Ihre eigene Migration bereitzustellen. Bevor Contoso Fiber das zuverlässige Web App-Muster für Java implementiert, betreibt es ein monolithisches, lokales Customer Account Management System (CAMS), das mit dem Spring Boot Framework erstellt wurde.
Tipp
Die Referenzimplementierung (Beispiel) des Zuverlässigen Web App-Musters stellt den endgültigen Zustand einer abgeschlossenen Implementierung dar. Diese Web-App der Produktionsklasse enthält alle Code-, Architektur- und Konfigurationsupdates, die in diesem Artikel beschrieben werden. Stellen Sie die Referenzimplementierung bereit und verwenden Sie sie, um Ihre eigene Implementierung des zuverlässigen Web App-Musters zu unterstützen.
Wie man das zuverlässige Web-App-Muster implementiert
Hier finden Sie die spezifischen Anleitungen, die Sie in den folgenden Abschnitten dieses Artikels benötigen:
Geschäftskontext: Richten Sie diese Anleitung mit Ihrem Geschäftskontext aus, und lernen Sie, sofortige und langfristige Ziele zu definieren, die die Umformung von Entscheidungen fördern.
Architekturleitfaden: Wählen Sie die richtigen Clouddienste aus, und entwerfen Sie eine Architektur, die Ihren Geschäftsanforderungen entspricht.
Codeleitfaden: Implementieren sie die Entwurfsmuster "Wiederholen", "Schaltschalter" und "Cache-Aside", um die Zuverlässigkeit und Leistungsfähigkeit Ihrer Web-App in der Cloud zu verbessern.
Konfigurationsleitfaden: Konfigurieren von Authentifizierung und Autorisierung, verwaltete Identitäten, rechteisierte Umgebungen, Infrastruktur als Code (IaC) und Überwachung.
Geschäftskontext
Der erste Schritt bei der Umformung einer Web-App besteht darin, Ihre Geschäftsziele zu definieren. Legen Sie sofortige Ziele wie SlOs (Service Level Objectives) und Kostenoptimierungsziele zusammen mit zukünftigen Zielen für Ihre Webanwendung fest. Diese Ziele beeinflussen Ihre Wahl der Clouddienste und die Architektur Ihrer Anwendung in der Cloud. Definieren Sie ein Ziel-SLO für Ihre Web-App, z. B. 99,9% Uptime. Berechnen Sie den zusammengesetzten Servicelevelvertrag (SLA) für alle Dienste, die sich auf die Verfügbarkeit Ihrer Web-App auswirken.
Contoso Fiber möchte seine lokale CAMS-Web-App erweitern, um andere Regionen zu erreichen. Um die erhöhte Nachfrage in der Web-App zu erfüllen, legt das Unternehmen die folgenden Ziele fest:
- Wenden Sie kostengünstige Codeänderungen mit hohem Wert an.
- Erreichen Sie ein Service Level Objective (SLO) von 99,9%.
- Übernehmen Sie DevOps-Methoden.
- Erstellen Sie kostenoptimierte Umgebungen.
- Verbessern Sie Zuverlässigkeit und Sicherheit.
Contoso Fiber bestimmt, dass seine lokale Infrastruktur keine kostengünstige Lösung für die Skalierung der Anwendung ist. Das Unternehmen entscheidet, dass die Migration der CAMS-Webanwendung zu Azure die kostengünstigste Methode ist, um ihre unmittelbaren und zukünftigen Ziele zu erreichen.
Anleitung zur Architektur
Das Zuverlässige Web App-Muster verfügt über einige wesentliche Architekturelemente. Zum Verwalten der Endpunktauflösung, einer Webanwendungsfirewall zum Blockieren bösartigen HTTP-Datenverkehrs und eines Lastenausgleichs zum Weiterleiten und Schützen eingehender Benutzeranforderungen benötigen Sie das Domain Name System (DNS). Die Anwendungsplattform hostet Ihren Web-App-Code und ruft die Back-End-Dienste über private Endpunkte in einem virtuellen Netzwerk auf. Ein Tool zur Anwendungsleistungsüberwachung erfasst Metriken und Protokolle, um Ihre Web-App zu verstehen.
Entwerfen der Architektur
Entwerfen Sie Ihre Infrastruktur, um Ihre Wiederherstellungsmetriken wie Ihr Wiederherstellungszeitziel (RTO) und Wiederherstellungspunktziel (RPO) zu unterstützen. Das RTO wirkt sich auf die Verfügbarkeit aus und muss Ihre SLO unterstützen. Ermitteln Sie ein RPO und konfigurieren Sie Datenredundanz , um das RPO zu erfüllen.
Wählen Sie die Infrastruktursicherheit aus. Ermitteln Sie die Anzahl der Verfügbarkeitszonen und Regionen, die Sie benötigen, um Ihre Verfügbarkeitsanforderungen zu erfüllen. Fügen Sie Verfügbarkeitszonen und Regionen hinzu, bis die zusammengesetzte SLA Ihren SLO erfüllt. Das Reliable Web App Pattern unterstützt mehrere Regionen für eine aktive-aktive oder aktive-passive Konfiguration. Die Referenzimplementierung verwendet beispielsweise eine aktiv-passive Konfiguration, um eine SLO von 99,9%zu erfüllen.
Konfigurieren Sie für eine regionenübergreifende Web-App Ihren Load Balancer so, dass der Datenverkehr an die zweite Region weitergeleitet wird, um je nach geschäftlichem Bedarf entweder eine aktive-aktive oder aktive-passive Konfiguration zu unterstützen. Für die beiden Regionen sind dieselben Dienste erforderlich. Eine Region verfügt jedoch über ein virtuelles Hubnetzwerk, das die Regionen verbindet. Übernehmen Sie eine Hub-and-Spoke-Netzwerktopologie, um Ressourcen wie eine Netzwerkfirewall zu zentralisieren und freizugeben. Wenn Sie über virtuelle Computer (VMs) verfügen, fügen Sie dem virtuellen Hubnetzwerk einen Bastionhost hinzu, um sie mit verbesserter Sicherheit zu verwalten.
Wählen Sie eine Netzwerktopologie aus. Wählen Sie die richtige Netzwerktopologie für Ihre Web- und Netzwerkanforderungen aus. Wenn Sie mehrere virtuelle Netzwerke verwenden möchten, verwenden Sie eine Hub-and-Spoke-Netzwerktopologie. Es bietet Kosten-, Verwaltungs- und Sicherheitsvorteile und Hybridkonnektivitätsoptionen für lokale und virtuelle Netzwerke.
Wählen Sie die richtigen Azure-Dienste aus.
Wenn Sie eine Web-App in die Cloud verschieben, wählen Sie Azure-Dienste aus, die Ihren Geschäftlichen Anforderungen entsprechen, und richten Sie sich an die Features der lokalen Web-App. Diese Ausrichtung trägt dazu bei, den Replatforming-Aufwand zu minimieren. Verwenden Sie beispielsweise Dienste, mit denen Sie dasselbe Datenbankmodul beibehalten und vorhandene Middleware und Frameworks unterstützen können.
Vor der Migration ist die CAMS-Web-App von Contoso Fiber eine lokale, monolithische Java-Anwendung. Es ist eine Spring Boot-App mit einer PostgreSQL-Datenbank. Die Web-App ist eine Branchenunterstützungs-App für Mitarbeiter. Sie verwenden sie, um Kundensupportfälle zu verwalten. Die App erlebt häufige Herausforderungen bei der Skalierbarkeit und Featurebereitstellung. Dieser Ausgangspunkt beeinflusst zusammen mit Geschäftszielen und SLOs ihre Dienstentscheidungen.
Die folgende Liste enthält Anleitungen zum Auswählen der richtigen Azure-Dienste für Ihre Web-App und beschreibt, warum Contoso Fiber bestimmte Dienste auswählt:
Anwendungsplattform: Verwenden Sie Azure App Service als Ihre Anwendungsplattform. Contoso Fiber verwendet App Service aus den folgenden Gründen:
Natürliche Entwicklung: Contoso Fiber stellt eine Spring Boot JAR-Datei auf dem lokalen Server bereit und möchte die Menge der Umrüstung für dieses Bereitstellungsmodell minimieren. Der App-Dienst bietet eine robuste Unterstützung für die Ausführung von Spring Boot-Apps, wodurch es zu einer geeigneten Option wird. Azure Container Apps ist auch eine geeignete Option für diese Anwendung. Weitere Informationen finden Sie in der Übersicht über Container-Apps und Java für Container-Apps.
Hohe SLA: Der App-Dienst bietet eine hohe SLA, die die Produktionsanforderungen erfüllt.
Reduzierter Verwaltungsaufwand: App Service ist eine verwaltete Hostinglösung.
Containerisierungsfunktion: Der App-Dienst ist in private Containerimageregistrierungen wie Azure Container Registry integriert. Contoso Fiber kann diese Registrierungen verwenden, um die Web-App in Zukunft zu containern.
Automatische Skalierung: Die Web-App kann basierend auf dem Benutzerdatenverkehr schnell hochskalieren, herunterskalieren, verkleinern und vergrößern.
Identitätsverwaltung: Verwenden Sie Microsoft Entra ID als Identitäts- und Zugriffsverwaltungslösung. Contoso Fiber verwendet aus den folgenden Gründen die Microsoft Entra-ID:
Authentifizierung und Autorisierung: Die Anwendung muss Mitarbeiter des Callcenters authentifizieren und autorisieren.
Skalierbarkeit: Die Microsoft Entra-ID wird skaliert, um größere Szenarien zu unterstützen.
Benutzeridentitätssteuerelement: Mitarbeiter des Callcenters können ihre vorhandenen Unternehmensidentitäten verwenden.
Unterstützung des Autorisierungsprotokolls: Microsoft Entra-ID unterstützt OAuth 2.0 für verwaltete Identitäten.
Datenbank: Verwenden Sie einen Dienst, mit dem Sie dasselbe Datenbankmodul beibehalten können. Verwenden Sie die Entscheidungsstruktur für den Datenspeicher, um Ihre Auswahl zu leiten. Contoso Fiber verwendet aus folgenden Gründen das flexible Serverbereitstellungsmodell der Azure-Datenbank für PostgreSQL:
Zuverlässigkeit: Das flexible Serverbereitstellungsmodell unterstützt zonenredundante Hohe Verfügbarkeit in mehreren Verfügbarkeitszonen. Diese Konfiguration verwaltet einen Warm-Standby-Server in einer anderen Verfügbarkeitszone innerhalb derselben Azure-Region. Die Konfiguration repliziert Daten synchron auf den Standbyserver.
Regionsübergreifende Replikation: Azure Database for PostgreSQL bietet eine Lesereplikatfunktion zum asynchronen Replizieren von Daten in eine schreibgeschützte Replikatdatenbank in einer anderen Region.
Leistung: Azure Database for PostgreSQL bietet vorhersehbare Leistung und intelligente Optimierung, die die Datenbankleistung mithilfe realer Nutzungsdaten verbessert.
Reduzierter Verwaltungsaufwand: Dieser verwaltete Azure-Dienst reduziert Verwaltungsverpflichtungen.
Migrationsunterstützung: Es unterstützt die Datenbankmigration von lokalen Einzelserver-PostgreSQL-Datenbanken. Contoso Fiber kann das Migrationstool verwenden, um den Migrationsprozess zu vereinfachen.
Konsistenz mit lokalen Konfigurationen: Es unterstützt verschiedene Communityversionen von PostgreSQL, einschließlich der Version, die Contoso Fiber derzeit verwendet.
Elastizität: Die flexible Serverbereitstellung erstellt automatisch Serversicherungen und speichert sie in zonenredundanten Speicher (ZRS) innerhalb derselben Region. Contoso Fiber kann die Datenbank jederzeit innerhalb des Sicherungsaufbewahrungszeitraums wiederherstellen. Die Sicherungs- und Wiederherstellungsfunktion erstellt im Vergleich zu lokalen Umgebungen ein besseres RPO.
Anwendungsleistungsüberwachung: Verwenden Sie Application Insights , um Telemetrie in Ihrer Anwendung zu analysieren. Contoso Fiber verwendet Application Insights aus den folgenden Gründen:
Integration in Azure Monitor: Es bietet die beste Integration in Azure Monitor.
Anomalieerkennung: Es erkennt automatisch Leistungsanomalien.
Fehlerbehebung: Sie hilft bei der Diagnose von Problemen in der ausgeführten App.
Überwachung: Sie sammelt Nutzungsdaten für die App und verfolgt benutzerdefinierte Ereignisse.
Sichtbarkeitslücke: Die lokale Lösung verfügt nicht über eine Anwendungsleistungsüberwachungslösung. Application Insights bietet eine einfache Integration in die Anwendungsplattform und den Code.
Cache: Wählen Sie aus, ob Sie Ihrer Web-App-Architektur einen Cache hinzufügen möchten. Azure Managed Redis ist die primäre Azure-Cachelösung. Es ist ein verwalteter In-Memory-Datenspeicher, der auf der Redis-Software basiert. Contoso Fiber fügt Azure Managed Redis aus den folgenden Gründen hinzu:
Geschwindigkeit und Lautstärke: Sie bietet hohen Datendurchsatz und Lesevorgänge mit geringer Latenz für häufig zugegriffene, langsam ändernde Daten.
Vielfältige Unterstützung: Es handelt sich um einen einheitlichen Cachespeicherort, den alle Instanzen der Web-App verwenden können.
Externer Datenspeicher: Die lokalen Anwendungsserver verwenden vm-lokale Zwischenspeicherung. Bei diesem Setup können häufig abgerufene Daten nicht ausgelagert und veraltete Daten nicht als ungültig erklärt werden.
Nichtstickige Sitzungen: Der Cache ermöglicht es der Web-App, den Sitzungszustand zu externalisieren und nichtstickige Sitzungen zu verwenden. Die meisten java-Web-Apps, die lokal ausgeführt werden, basieren auf der clientseitigen Zwischenspeicherung im Arbeitsspeicher. Dieser Ansatz skaliert nicht gut und erhöht den Speicherbedarf auf dem Host. Azure Managed Redis bietet einen verwalteten, skalierbaren Cachedienst, um die Skalierbarkeit und Leistung von Anwendungen zu verbessern. Contoso Fiber verwendete Spring Cache als Cache-Abstraktionsframework und benötigte nur minimale Konfigurationsänderungen, um von einem Ehcache-Anbieter zum Redis-Anbieter zu wechseln.
Lastenausgleich: Webanwendungen, die Plattform als Dienstlösungen (PaaS) verwenden, sollten je nach Architektur und Anforderungen der Web-App Azure Front Door, Azure Application Gateway oder beides verwenden. Verwenden Sie die Entscheidungsstruktur des Lastenausgleichs , um das richtige Lastenausgleichsmodul auszuwählen. Contoso Fiber benötigt einen Lastenausgleich der Ebene 7, der den Datenverkehr über mehrere Regionen und eine Multiregion-Web-App weiterleiten kann, um den SLO von 99,9%zu erfüllen. Das Unternehmen verwendet Azure Front Door aus folgenden Gründen:
Globaler Lastenausgleich: Dieser Layer-7-Lastenausgleichsmodul kann den Datenverkehr über mehrere Regionen weiterleiten.
Webanwendungsfirewall: Sie ist nativ in die Azure-Webanwendungsfirewall integriert.
Routing-Flexibilität: Es ermöglicht dem Anwendungsteam, die Ingress-Anforderungen zu konfigurieren, um zukünftige Änderungen in der Anwendung zu unterstützen.
Verkehrsbeschleunigung: Es verwendet anycast-Routing, um den nächstgelegenen Azure-Anwesenheitspunkt zu erreichen und die schnellste Route zur Web-App zu finden.
Benutzerdefinierte Domänen: Sie unterstützt benutzerdefinierte Domänennamen mit flexibler Domänenüberprüfung.
Gesundheitssonden: Die Anwendung benötigt intelligente Integritätssondenüberwachung. Azure Front Door verwendet Antworten von der Probe, um den besten Ursprung für das Weiterleiten von Clientanforderungen zu ermitteln.
Überwachungsunterstützung: Azure Front Door unterstützt integrierte Berichte mit einem all-in-one-Dashboard sowohl für Azure Front Door als auch für Sicherheitsmuster. Es stellt Warnungen bereit, die in Azure Monitor integriert sind. Azure Front Door ermöglicht es der Anwendung, jede Anforderung und fehlgeschlagene Integritätsprüfungen zu protokollieren.
Verteilter Denial-of-Service(DDoS)-Schutz: Er verfügt über einen integrierten DDoS-Schutz auf Ebene 3 und Ebene 4.
Netzwerk für die Inhaltsübermittlung: Er positioniert Contoso Fiber für die Verwendung eines Inhaltsübermittlungsnetzwerks. Das Content-Delivery-Network sorgt für die Website-Beschleunigung.
Webanwendungsfirewall: Verwenden Sie die Azure-Webanwendungsfirewall , um einen zentralen Schutz vor gängigen Web-Exploits und Sicherheitsrisiken bereitzustellen. Contoso Fiber verwendet die Azure Web Application Firewall aus den folgenden Gründen:
Globaler Schutz: Es bietet einen verbesserten globalen Web-App-Schutz bei gleichzeitiger Aufrechterhaltung der Leistung.
Botnetschutz: Das Team kann Einstellungen überwachen und konfigurieren, um Sicherheitsbedenken im Zusammenhang mit Botnets zu beheben.
Gleichwertigkeit mit der lokalen Bereitstellung: Die lokale Lösung wird hinter einer Webanwendungsfirewall ausgeführt, die von der IT verwaltet wird.
Benutzerfreundlichkeit: Die Azure-Webanwendungsfirewall ist in Azure Front Door integriert.
Geheimer Manager: Verwenden Sie Azure Key Vault , wenn Sie geheime Schlüssel zum Verwalten in Azure haben. Contoso Fiber verwendet Key Vault aus den folgenden Gründen:
Verschlüsselung: Es unterstützt Verschlüsselung im Ruhezustand und bei der Übertragung.
Unterstützung für verwaltete Identitäten: Die Anwendungsdienste können verwaltete Identitäten verwenden, um auf den geheimen Speicher zuzugreifen.
Überwachung und Protokollierung: Key Vault erleichtert den Überwachungszugriff und generiert Warnungen, wenn sich gespeicherte geheime Schlüssel ändern.
Integration: Key Vault bietet native Integration mit dem Azure-Konfigurationsspeicher (Azure App-Konfiguration) und der Webhostingplattform (App Service).
Endpunktsicherheit: Verwenden Sie Azure Private Link , um auf PaaS-Lösungen über einen privaten Endpunkt in Ihrem virtuellen Netzwerk zuzugreifen. Der Datenverkehr zwischen Ihrem virtuellen Netzwerk und dem Dienst wird über das Microsoft-Backbone-Netzwerk übertragen. Contoso Fiber verwendet private Verknüpfung aus den folgenden Gründen:
Verbesserte Sicherheitskommunikation: Sie ermöglicht der Anwendung den privaten Zugriff auf Dienste auf der Azure-Plattform und reduziert den Netzwerkbedarf von Datenspeichern, um vor Datenlecks zu schützen.
Minimaler Aufwand: Die privaten Endpunkte unterstützen die Web-App-Plattform und die Datenbankplattform, die von der Web-App verwendet wird. Beide Plattformen spiegeln vorhandene lokale Konfigurationen wieder, sodass minimale Änderungen erforderlich sind.
Netzwerksicherheit: Verwenden Sie Azure Firewall , um eingehenden und ausgehenden Datenverkehr auf Netzwerkebene zu steuern. Verwenden Sie Azure Bastion , um eine Verbindung mit VMs mit erweiterter Sicherheit herzustellen, ohne Remotedesktopprotokoll-/Secure Shell-Ports (RDP/SSH) verfügbar zu machen. Contoso Fiber übernimmt eine Hub-and-Spoke-Netzwerktopologie und platziert gemeinsam genutzte Netzwerksicherheitsdienste im Hub. Azure Firewall prüft ausgehenden Datenverkehr von den Speichen, um die Netzwerksicherheit zu verbessern. Das Unternehmen verwendet Azure Bastion für erweiterte Sicherheitsbereitstellungen von einem Sprunghost im DevOps-Subnetz.
Codeleitfaden
Um eine Web-App erfolgreich in die Cloud zu verschieben, müssen Sie Ihren Web-App-Code mithilfe der Muster "Wiederholen", "Schaltkreistrennung" und "Cache-Aside" aktualisieren.
Die folgenden Entwurfsmuster bieten Arbeitsauslastungsvorteile, die einer oder mehreren der Well-Architected Framework-Säulen zugeordnet sind:
Das Wiederholungsmuster behandelt vorübergehende Fehler durch Wiederholungsvorgänge, die zeitweise fehlschlagen können. Implementieren Sie dieses Muster für alle ausgehenden Anrufe an andere Azure-Dienste.
Das Schaltkreistrennmuster verhindert, dass eine Anwendung wiederholungsvorgänge ausführt, die nicht vorübergehend sind. Implementieren Sie dieses Muster in allen ausgehenden Anrufen an andere Azure-Dienste.
Das Cache-Aside Muster lädt Daten bei Bedarf in einen Cache aus einem Datenspeicher. Implementieren Sie dieses Muster für Anforderungen an die Datenbank.
| Entwurfsmuster | Zuverlässigkeit (RE) | Sicherheit (SE) | Kostenoptimierung (CO) | Operational Excellence (OE) | Leistungseffizienz (PE) | Unterstützung von WAF-Prinzipien |
|---|---|---|---|---|---|---|
| Wiederholungsmuster | ✔ | RE:07 | ||||
| Trennschalter-Muster | ✔ | ✔ |
RE:03 RE:07 PE:07 PE:11 |
|||
| Cache-Aside Muster | ✔ | ✔ |
RE:05 PE:08 PE:12 |
Das Wiederholungsmuster implementieren
Fügen Sie ihrem Anwendungscode das Wiederholungsmuster hinzu, um temporäre Dienstunterbrechungen zu beheben. Diese Störungen werden als vorübergehende Fehler bezeichnet. Vorübergehende Fehler lösen sich in der Regel innerhalb von Sekunden auf. Sie können das Wiederholungsmuster verwenden, um fehlgeschlagene Anforderungen nochmals zu senden. Außerdem können Sie die Verzögerung zwischen den Wiederholungen und die Anzahl der Versuche, die unternommen werden sollen, konfigurieren, bevor ein Fehler zugegeben wird.
Verwenden Sie Resilience4j, eine einfache Fehlertoleranzbibliothek, um das Wiederholungsmuster in Java zu implementieren. Um das Retry-Muster hinzuzufügen, versieht die Referenzimplementierung die Methode des Serviceplancontrollers listServicePlans mit Retry-Anmerkungen. Der Code ruft den Aufruf einer Liste von Dienstplänen aus der Datenbank erneut auf, wenn der anfängliche Aufruf fehlschlägt. Die Wiederholungsrichtlinie für die Referenzimplementierung umfasst maximale Versuche, Wartezeiten und Ausnahmen für den Wiederholungsversuch. Konfigurieren Sie die Wiederholungsrichtlinie in der application.properties Datei.
@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";
}
Implementieren des Schaltkreistrennmusters
Verwenden Sie das Schaltkreistrennmuster , um Dienstunterbrechungen zu behandeln, die keine vorübergehenden Fehler sind. Das Schaltkreisbrechermuster verhindert, dass eine Anwendung kontinuierlich versucht, auf einen nicht reagierenden Dienst zuzugreifen. Sie setzt die Anwendung frei und hilft, Zyklen der zentralen Verarbeitungseinheit (CPU) zu sparen, sodass die Anwendung ihre Leistungsintegrität für Benutzer behält.
Verwenden Sie Spring Cloud Circuit Breaker und Resilience4j , um das Schaltkreistrennmuster zu implementieren. Die Referenzimplementierung wendet das Circuit Breaker-Muster an, indem Methoden mit dem Circuit Breaker-Attribut versehen werden.
Cache-Aside-Pattern implementieren
Fügen Sie Ihrer Web-App das Cache-Aside Muster hinzu, um die Speicherdatenverwaltung zu verbessern. Das Muster weist der Anwendung die Verantwortung für die Verarbeitung von Datenanforderungen zu und stellt die Konsistenz zwischen dem Cache und dem persistenten Speicher wie z. B. einer Datenbank sicher. Sie verkürzt die Reaktionszeiten, verbessert den Durchsatz und reduziert den Bedarf an mehr Skalierung. Außerdem wird die Last des primären Datenspeichers reduziert, was die Zuverlässigkeit und Kostenoptimierung verbessert. Befolgen Sie die folgenden Empfehlungen, um das Cache-Aside Muster zu implementieren:
Konfigurieren Sie die Anwendung für die Verwendung eines Caches. Um das Zwischenspeichern zu aktivieren, fügen Sie das
spring-boot-starter-cachePaket als Abhängigkeit in Ihrerpom.xmlDatei hinzu. Dieses Paket stellt Standardkonfigurationen für den Redis-Cache bereit.Cachen Sie Daten mit hoher Priorität. Wenden Sie das Cache-Aside Muster auf daten mit hohem Bedarf an, um die Effektivität zu verbessern. Verwenden Sie Azure Monitor, um die CPU, den Arbeitsspeicher und den Speicher der Datenbank nachzuverfolgen. Anhand dieser Metriken können Sie ermitteln, ob Sie eine kleinere Datenbank-SKU verwenden können, nachdem Sie das Cache-Aside Muster angewendet haben. Um bestimmte Daten in Ihrem Code zwischenzuspeichern, fügen Sie die
@CacheableAnmerkung hinzu. Diese Anmerkung gibt spring an, welche Methoden ihre Ergebnisse zwischengespeichert haben sollen.Halten Sie Cachedaten aktuell. Planen Sie regelmäßige Cacheaktualisierungen für die Synchronisierung mit den neuesten Datenbankänderungen. Verwenden Sie die Datenvolatilität, und der Benutzer muss die optimale Aktualisierungsrate ermitteln. Diese Vorgehensweise stellt sicher, dass die Anwendung das Cache-Aside Muster verwendet, um schnellen Zugriff und aktuelle Informationen bereitzustellen. Die Standardcacheeinstellungen passen möglicherweise nicht zu Ihrer Webanwendung. Sie können diese Einstellungen in der
application.propertiesDatei oder den Umgebungsvariablen anpassen. Beispielsweise können Sie denspring.cache.redis.time-to-liveWert (ausgedrückt in Millisekunden) ändern, um zu steuern, wie lange Daten im Cache verbleiben sollen, bevor er entfernt wird.Sicherstellen der Datenkonsistenz. Implementieren Sie Mechanismen zum Aktualisieren des Caches unmittelbar nach Datenbankschreibvorgängen. Verwenden Sie ereignisgesteuerte Updates oder dedizierte Datenverwaltungsklassen, um die Cachekohärenz sicherzustellen. Die konsistente Synchronisierung des Caches mit Datenbankänderungen ist für das Cache-Aside Muster zentral.
Konfigurationsleitfaden
In den folgenden Abschnitten finden Sie Anleitungen zum Implementieren der Konfigurationsupdates. Jeder Abschnitt steht in Übereinstimmung mit einer oder mehreren Säulen des Well-Architected Framework.
| Konfiguration | Zuverlässigkeit (RE) | Sicherheit (SE) | Kostenoptimierung (CO) | Operational Excellence (OE) | Leistungseffizienz (PE) | Unterstützung von WAF-Prinzipien |
|---|---|---|---|---|---|---|
| Konfigurieren der Benutzerauthentifizierung und Autorisierung | ✔ | ✔ |
SE:05 OE:10 |
|||
| Implementieren verwalteter Identitäten | ✔ | ✔ |
SE:05 OE:10 |
|||
| Rechteisieren von Umgebungen | ✔ |
CO:05 CO:06 |
||||
| Implementieren der automatischen Skalierung | ✔ | ✔ | ✔ |
RE:06 CO:12 PE:05 |
||
| Automatisieren der Ressourcenbereitstellung | ✔ | OE:05 | ||||
| Überwachung implementieren | ✔ | ✔ | ✔ |
OE:07 PE:04 |
Konfigurieren der Benutzerauthentifizierung und Autorisierung
Wenn Sie Webanwendungen zu Azure migrieren, konfigurieren Sie Die Benutzerauthentifizierungs- und Autorisierungsmechanismen. Folgen Sie den folgenden Empfehlungen:
Verwenden Sie eine Identitätsplattform. Verwenden Sie die Microsoft Identity Platform für Entwickler , um die Web-App-Authentifizierung einzurichten. Diese Plattform unterstützt Anwendungen, die ein einzelnes Microsoft Entra-Verzeichnis, mehrere Microsoft Entra-Verzeichnisse aus verschiedenen Organisationen und Microsoft-Identitäten oder soziale Konten verwenden.
Der [Spring Boot Starter für Microsoft Entra ID](/azure/developer/java/spring-framework/spring-boot-starter-for-entra-developer-guide verwendet Spring Security und Spring Boot, um eine einfache Konfiguration und Integration zu gewährleisten. Es bietet verschiedene Authentifizierungsflüsse, automatische Tokenverwaltung, anpassbare Autorisierungsrichtlinien und Integrationsfunktionen mit Spring Cloud-Komponenten. Dieses Tool ermöglicht die einfache Integration von Microsoft Entra ID und OAuth 2.0 in Spring Boot-Anwendungen ohne manuelle Bibliotheks- oder Einstellungskonfiguration.
Die Referenzimplementierung verwendet die Microsoft Identity Platform (Microsoft Entra ID) als Identitätsanbieter für die Web-App. Er verwendet die OAuth 2.0-Autorisierungscodeerteilung, um einen Benutzer anzumelden, der über ein Microsoft Entra-Konto verfügt. Der folgende XML-Codeausschnitt definiert die beiden erforderlichen Abhängigkeiten des OAuth 2.0-Autorisierungscodegenehmigungsflusses. Die Abhängigkeit
com.azure.spring: spring-cloud-azure-starter-active-directoryermöglicht die Microsoft Entra-Authentifizierung und Autorisierung in einer Spring Boot-Anwendung. Die Abhängigkeitorg.springframework.boot: spring-boot-starter-oauth2-clientermöglicht die OAuth 2.0-Authentifizierung und -Autorisierung in einer Spring Boot-Anwendung.<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>Erstellen Sie eine Anwendungsregistrierung. Die Microsoft Entra-ID erfordert eine Anwendungsregistrierung im primären Mandanten. Die Anwendungsregistrierung trägt dazu bei, sicherzustellen, dass Benutzer, die Zugriff auf die Web-App erhalten, über Identitäten im primären Mandanten verfügen. Die Referenzimplementierung verwendet Terraform, um eine Microsoft Entra ID-App-Registrierung zusammen mit einer app-spezifischen Account Manager-Rolle zu erstellen:
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" } }Erzwingen sie die Autorisierung in der Anwendung. Verwenden Sie die rollenbasierte Zugriffssteuerung (RBAC), um Anwendungsrollen die geringsten Berechtigungen zuzuweisen. Definieren Sie bestimmte Rollen für verschiedene Benutzeraktionen, um Überlappungen zu vermeiden und Klarheit zu gewährleisten. Ordnen Sie Benutzer den entsprechenden Rollen zu, und stellen Sie sicher, dass sie nur Zugriff auf erforderliche Ressourcen und Aktionen haben. Konfigurieren Sie Spring Security für die Verwendung von Spring Boot Starter für Microsoft Entra ID. Diese Bibliothek ermöglicht die Integration mit der Microsoft Entra-ID und stellt sicher, dass Benutzer sicher authentifiziert werden. Konfigurieren und aktivieren Sie die Microsoft-Authentifizierungsbibliothek (MSAL), um Zugriff auf weitere Sicherheitsfeatures zu erhalten. Zu diesen Features gehören das Zwischenspeichern von Token und die automatische Tokenaktualisierung.
Die Referenzimplementierung erstellt App-Rollen, die die Arten von Benutzerrollen im Kontoverwaltungssystem von Contoso Fiber widerspiegeln. Rollen werden während der Autorisierung in Berechtigungen übersetzt. Beispiele für appspezifische Rollen in CAMS sind Account Manager, Level One (L1) Support Representative und Field Service Representative. Die Konto-Manager-Rolle verfügt über Berechtigungen zum Hinzufügen neuer App-Benutzer und Kunden. Ein Außendienstmitarbeiter kann Supporttickets erstellen. Das
PreAuthorizeAttribut schränkt den Zugriff auf bestimmte Rollen ein.@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"; } ...Zur Integration in die Microsoft Entra-ID verwendet die Referenzimplementierung den OAuth 2.0-Autorisierungscode-Genehmigungsfluss . Dieser Fluss ermöglicht es einem Benutzer, sich mit einem Microsoft-Konto anzumelden. Der folgende Codeausschnitt zeigt, wie Sie
SecurityFilterChainso konfigurieren, dass Microsoft Entra-ID für die Authentifizierung und Autorisierung verwendet wird.@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(); } } ...
Bevorzugen Sie temporären Zugriff auf den Speicher. Verwenden Sie temporäre Berechtigungen, um vor unbefugtem Zugriff und Verstößen zu schützen. Sie können beispielsweise freigegebene Zugriffssignaturen (SAS) verwenden, um den Zugriff auf einen bestimmten Zeitraum zu beschränken. Verwenden Sie die SAS-Benutzerdelegierung, um die Sicherheit zu maximieren, wenn Sie temporären Zugriff gewähren. Es ist die einzige SAS, die Microsoft Entra-ID-Anmeldeinformationen verwendet und keinen dauerhaften Speicherkontoschlüssel erfordert.
Erzwingen sie die Autorisierung in Azure. Verwenden Sie Azure RBAC), um Benutzeridentitäten am wenigsten Berechtigungen zuzuweisen. Azure RBAC definiert die Azure-Ressourcen, auf die Identitäten zugreifen können, was sie mit diesen Ressourcen tun können, und die Bereiche, auf die sie Zugriff haben.
Vermeiden Sie permanente erhöhte Berechtigungen. Verwenden Sie Microsoft Entra Privileged Identity Management (PIM), um just-in-time (JIT)-Zugriff für privilegierte Vorgänge zu gewähren. Entwickler benötigen beispielsweise häufig Zugriff auf Administratorebene, um Datenbanken zu erstellen und zu löschen, Tabellenschemas zu ändern und Benutzerberechtigungen zu ändern. Wenn Sie JIT-Zugriff verwenden, erhalten Benutzeridentitäten temporäre Berechtigungen zum Ausführen privilegierter Aufgaben.
Implementieren verwalteter Identitäten
Verwenden Sie verwaltete Identitäten für alle Azure-Dienste, die sie unterstützen. Eine verwaltete Identität ermöglicht Azure-Ressourcen, insbesondere Workloadidentitäten, die Authentifizierung und Interaktion mit anderen Azure-Diensten, ohne dass Sie Anmeldeinformationen verwalten müssen. Um die Migration zu vereinfachen, können Sie weiterhin lokale Authentifizierungslösungen für Hybrid- und Legacysysteme verwenden, aber Sie sollten diese so schnell wie möglich auf verwaltete Identitäten umstellen. Befolgen Sie die folgenden Empfehlungen, um verwaltete Identitäten zu implementieren:
Wählen Sie den richtigen Typ der verwalteten Identität aus. Bevorzugen Sie vom Benutzer zugewiesene verwaltete Identitäten, wenn Sie über zwei oder mehr Azure-Ressourcen verfügen, die denselben Satz von Berechtigungen benötigen. Dieser Ansatz ist effizienter als das Erstellen von vom System zugewiesenen verwalteten Identitäten für jede dieser Ressourcen und das Zuweisen der gleichen Berechtigungen für alle. Verwenden Sie andernfalls vom System zugewiesene verwaltete Identitäten.
Konfigurieren Sie die geringsten Berechtigungen. Verwenden Sie Azure RBAC , um nur Berechtigungen zu gewähren, die für Vorgänge wichtig sind, z. B. Erstellen, Lesen, Aktualisieren und Löschen (CRUD)-Aktionen in Datenbanken oder Zugreifen auf geheime Schlüssel. Workload-Identitätsberechtigungen sind persistent, sodass Sie JIT- oder kurzfristige Berechtigungen für Workload-Identitäten nicht bereitstellen können. Wenn Azure RBAC kein bestimmtes Szenario abdeckt, ergänzen Sie Azure RBAC mit Azure-Zugriffsrichtlinien auf Dienstebene.
Bieten Sie Sicherheit für verbleibende Geheimnisse. Speichern Sie alle verbleibenden geheimen Schlüssel im Key Vault. Laden Sie geheime Schlüssel aus Key Vault beim Starten der Anwendung statt während jeder HTTP-Anforderung. Der Hochfrequenzzugriff innerhalb von HTTP-Anforderungen kann die Transaktionsgrenzen von Key Vault überschreiten. Anwendungskonfigurationen in App Configuration speichern.
Rechteisieren von Umgebungen
Verwenden Sie Leistungsstufen (SKUs) von Azure-Diensten, die die Anforderungen jeder Umgebung erfüllen, ohne sie zu überschreiten. Um Ihre Umgebungen anzupassen, führen Sie die folgenden Aktionen aus:
Kosten schätzen. Verwenden Sie den Azure-Preisrechner , um die Kosten jeder Umgebung zu schätzen.
Optimieren Sie Produktionsumgebungen. Produktionsumgebungen benötigen SKUs, die SLA, Features und Skalierung erfüllen, die für die Produktion erforderlich sind. Überwachen Sie die Ressourcenauslastung kontinuierlich, und passen Sie SKUs an die tatsächlichen Leistungsanforderungen an.
Optimieren Sie Vorproduktionsumgebungen.Vorproduktionsumgebungen sollten Ressourcen mit niedrigeren Kosten verwenden und Rabatte wie Azure-Plan für Entwickler-/Testpreise nutzen. Deaktivieren Sie in diesen Umgebungen dienste, die nicht benötigt werden. Stellen Sie außerdem sicher, dass Preproduction-Umgebungen ausreichend mit Produktionsumgebungen vergleichbar sind , um Risiken zu vermeiden. Halten Sie dieses Gleichgewicht aufrecht, um sicherzustellen, dass die Tests wirksam bleiben, ohne unnötige Kosten zu verursachen.
Verwenden Sie IaC, um SKUs zu definieren. Implementieren Sie IaC, um die richtigen SKUs basierend auf der Umgebung dynamisch auszuwählen und bereitzustellen. Dieser Ansatz verbessert die Konsistenz und vereinfacht die Verwaltung.
Die Referenzimplementierung verfügt beispielsweise über einen optionalen Parameter, der die bereitzustellende SKU angibt. Ein Umgebungsparameter gibt an, dass die Terraform-Vorlage Entwicklungs-SKUs bereitstellen soll:
azd env set APP_ENVIRONMENT prod
Implementieren der automatischen Skalierung
Durch die automatische Skalierung wird sichergestellt, dass eine Web-App stabil, reaktionsfähig bleibt und dynamische Workloads effizient verarbeiten kann. Befolgen Sie die folgenden Empfehlungen, um die automatische Skalierung zu implementieren:
Automatisieren Sie die Skalierung. Verwenden Sie Azure AutoScale , um die horizontale Skalierung in Produktionsumgebungen zu automatisieren. Konfigurieren Sie automatische Skalierungsregeln, um basierend auf wichtigen Leistungsmetriken zu skalieren, damit Ihre Anwendung unterschiedliche Lasten verarbeiten kann.
Verfeinern von Skalierungstriggern. Verwenden Sie die CPU-Auslastung als anfänglichen Skalierungstrigger, wenn Sie mit den Skalierungsanforderungen Ihrer Anwendung nicht vertraut sind. Verfeinern Sie Ihre Skalierungstrigger, um weitere Metriken wie RAM, Netzwerkdurchsatz und Datenträgereingabe/Ausgabe (E/A) einzuschließen. Ziel ist es, das Verhalten Ihrer Webanwendung für eine bessere Leistung abzugleichen.
Stellen Sie einen Scale-out-Puffer bereit. Legen Sie Die Skalierungsschwellenwerte fest, um die Skalierung zu initiieren, bevor die maximale Kapazität erreicht wird. Konfigurieren Sie beispielsweise die Skalierung bei 85% CPU-Auslastung, anstatt zu warten, bis sie 100%erreicht. Dieser proaktive Ansatz trägt dazu bei, die Leistung aufrechtzuerhalten und potenzielle Engpässe zu vermeiden.
Automatisieren der Ressourcenbereitstellung
Verwenden Sie die Automatisierung, um Azure-Ressourcen und -Code in allen Umgebungen bereitzustellen und zu aktualisieren. Folgen Sie den folgenden Empfehlungen:
Verwenden Sie IaC. Stellen Sie IaC mithilfe von Pipelines für kontinuierliche Integration und kontinuierliche Bereitstellung (CI/CD) bereit. Azure stellt vorgefertigte Bicep-Vorlagen, AZURE Resource Manager-Vorlagen (ARM-Vorlagen) JSON und Terraform-Vorlagen für jede Azure-Ressource bereit.
Verwenden Sie eine CI/CD-Pipeline. Verwenden Sie eine CI/CD-Pipeline, um Code aus der Quellcodeverwaltung in Ihren verschiedenen Umgebungen bereitzustellen, z. B. Test, Staging und Produktion. Verwenden Sie Azure-Pipelines, wenn Sie mit Azure DevOps arbeiten. Verwenden Sie GitHub-Aktionen für GitHub-Projekte.
Integrieren von Komponententests. Priorisieren Sie die Ausführung und Überprüfung aller Komponententests in Ihrer Pipeline vor der Bereitstellung in App Service. Integrieren Sie Codequalitäts- und Abdeckungstools wie SonarQube, um eine umfassende Testabdeckung zu erzielen.
Adoptieren Sie Mocking-Frameworks. Verwenden Sie für Tests, die externe Endpunkte beinhalten, simulierte Frameworks. Mit diesen Frameworks können Sie simulierte Endpunkte erstellen. Sie vermeiden die Notwendigkeit, echte externe Endpunkte zu konfigurieren und einheitliche Testbedingungen in allen Umgebungen sicherzustellen.
Führen Sie Sicherheitsüberprüfungen durch. Verwenden Sie statische Anwendungssicherheitstests (SAST), um Sicherheitsfehler und Codierungsfehler in Ihrem Quellcode zu finden. Führen Sie eine Softwarekompositionsanalyse (SCA) durch, um Nicht-Microsoft-Bibliotheken und -Komponenten auf Sicherheitsrisiken zu untersuchen. Integrieren Sie Tools für diese Analysen sowohl in GitHub als auch in Azure DevOps.
Konfigurieren der Überwachung
Implementieren Sie Anwendungs- und Plattformüberwachung, um die betriebliche Exzellenz und Leistungsfähigkeit Ihrer Web-App zu verbessern. Befolgen Sie die folgenden Empfehlungen, um die Überwachung zu implementieren:
Erfassen von Anwendungstelemetrie. Verwenden Sie die automatische Instrumentierung in Application Insights, um Anwendungstelemetrie zu sammeln, z. B. Anforderungsdurchsatz, durchschnittliche Anforderungsdauer, Fehler und Abhängigkeitsüberwachung. Sie müssen keinen Code ändern, um diese Telemetrie zu verwenden. Spring Boot registriert mehrere Kernmetriken in Application Insights, z. B. java virtual machine (JVM), CPU und Tomcat. Application Insights sammelt automatisch aus Protokollierungsframeworks wie Log4j und Logback.
Die Referenzimplementierung aktiviert Application Insights über Terraform in der Konfiguration des App-Services
app_settings.app_settings = { APPLICATIONINSIGHTS_CONNECTION_STRING = var.app_insights_connection_string ApplicationInsightsAgent_EXTENSION_VERSION = "~3" ... }Weitere Informationen finden Sie in den folgenden Artikeln:
Erstellen sie benutzerdefinierte Anwendungsmetriken. Implementieren Sie codebasierte Instrumentierung, um benutzerdefinierte Anwendungstelemetrie zu erfassen, indem Sie das Application Insights SDK und dessen API hinzufügen.
Überwachen Sie die Plattform. Aktivieren Sie die Diagnose für alle unterstützten Dienste. Senden Sie die Diagnose an dasselbe Ziel wie die Anwendungsprotokolle für die Korrelation. Azure-Dienste erstellen Plattformprotokolle automatisch, speichern sie jedoch nur, wenn Sie die Diagnose aktivieren. Aktivieren Sie Diagnoseeinstellungen für jeden Dienst, der Diagnose unterstützt.
Die Referenzimplementierung verwendet Terraform, um die Azure-Diagnose für unterstützte Dienste zu aktivieren. Der folgende Terraform-Code konfiguriert die Diagnoseeinstellungen für den App-Dienst:
# 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 } }
Bereitstellen der Referenzimplementierung
Die Referenzimplementierung führt Sie durch die simulierte Migration einer lokalen Java-Anwendung zu Azure von Contoso Fiber. Außerdem werden die erforderlichen Änderungen während der anfänglichen Einführungsphase hervorgehoben.
Die folgende Architektur stellt den endgültigen Zustand der Implementierung des zuverlässigen Web App-Musters von Contoso Fiber basierend auf ihren Zielen dar.
Laden Sie eine Visio-Datei dieser Architektur herunter.