Bearbeiten

Share via


Zuverlässiges Web-App-Muster für Java – Anwenden des Musters

Azure App Service
Azure Front Door
Azure Cache for Redis
Microsoft-Authentifizierungsbibliothek für Java

In diesem Artikel erfahren Sie, wie Sie das zuverlässige Web-App-Muster anwenden. Das zuverlässige Web-App-Muster besteht aus einer Reihe von Prinzipien und Implementierungstechniken, die definieren, wie Sie Web-Apps bei der Migration zur Cloud ändern (zu einer neuen Plattform verlagern) sollten. Es führt nur die Codeupdates durch, die für eine erfolgreiche Ausführung in der Cloud benötigt werden.

Um die Anwendung dieser Anleitung zu unterstützen, gibt es eine Referenzimplementierung des zuverlässigen Web-App-Musters, die Sie bereitstellen können.

Diagramm der Architektur der Referenzimplementierung.Architektur der Referenzimplementierung: Laden Sie eine Visio-Datei dieser Architektur herunter.

In der folgenden Anleitung wird die Referenzimplementierung als Beispiel verwendet. Zur Anwendung des zuverlässigen Web-App-Musters folgen Sie diesen Empfehlungen, die an den Säulen des Well-Architected Framework ausgerichtet sind:

Zuverlässigkeit

Zuverlässigkeit stellt sicher, dass Ihre Anwendung Ihre Verpflichtungen gegenüber den Kunden erfüllen kann. Weitere Informationen finden Sie unter Erstellen einer Checkliste zur Überprüfung der Zuverlässigkeit. Das zuverlässige Web-App-Muster führt zwei wesentliche Entwurfsmuster auf Code-Ebene ein, um die Zuverlässigkeit zu verbessern: das Wiederholungsmuster und das Trennschaltermuster.

Verwenden des Wiederholungsmusters

Das Wiederholungsmuster behandelt vorübergehende Dienstunterbrechungen (als vorübergebende Fehler bezeichnet), die in der Regel innerhalb von Sekunden gelöst werden können. Diese Fehler werden häufig durch Diensteinschränkungen, einen dynamischen Lastausgleich sowie Netzwerkprobleme in Cloudumgebungen verursacht. Die Implementierung des Wiederholungsmusters umfasst das erneute Senden fehlgeschlagener Anforderungen, ermöglicht die Konfiguration von Verzögerungen und lässt wiederholte Versuche zu, bevor eine Ausnahme ausgelöst wird.

Verwenden Sie Resilience4j, um das Wiederholungsmuster in Java zu implementieren. Resilience4j ist eine schlanke Fehlertoleranzbibliothek. Sie stellt Funktionen höherer Ordnung (Decorators) bereit, um Funktionsschnittstellen, Lambdaausdrücke und Methodenverweise mit einem Trennschalter-, Ratenbegrenzer-, Wiederholungs- oder Bulkhead-Entwurfsmuster zu verbessern.

Beispiel: Die Referenzimplementierung fügt das Wiederholungsmuster hinzu, indem die Methode listServicePlans des Dienstplan-Controllers mit Wiederholungsanmerkungen versehen wird. Der Code ruft den Aufruf einer Liste von Dienstplänen aus der Datenbank erneut auf, wenn der anfängliche Aufruf fehlschlägt.

    @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";
    }

Die Referenzimplementierung konfiguriert die Wiederholungsrichtlinie, einschließlich der maximalen Anzahl der Versuche, der Wartezeiten und bei welchen Ausnahmen Wiederholungsversuche ausgeführt werden sollten. Die Wiederholungsrichtlinie ist in application.properties konfiguriert. Weitere Informationen finden Sie in der Dokumentation zu Resilience4j. Sie können das Wiederholungsmuster in der Referenzimplementierung simulieren.

Verwenden des Sicherungsmusters

Die Kombination von Wiederholungs- und Trennschaltermuster erweitert die Fähigkeit einer Anwendung, Dienstunterbrechungen zu behandeln, die nicht im Zusammenhang mit vorübergehenden Fehlern stehen. Das Wiederholungsmuster verhindert, dass eine Anwendung kontinuierlich versucht, auf einen nicht reagierenden Dienst zuzugreifen. Das Trennschaltermuster gibt die Anwendung frei und vermeidet die Veröffentlichung von CPU-Zyklen, damit die Leistungsintegrität der Anwendung für Endbenutzer erhalten bleibt. Weitere Informationen finden Sie unter Spring-Trennschalter und in der Resilience4j-Dokumentation.

Beispiel: Die Referenzimplementierung implementiert das Trennschaltermuster, indem Methoden mit dem Trennschalterattribut versehen werden. Sie können das Trennschaltermuster in der Referenzimplementierung simulieren.

Sicherheit

Sicherheit bietet Schutz vor vorsätzlichen Angriffen und dem Missbrauch Ihrer wertvollen Daten und Systeme. Weitere Informationen finden Sie unter Erstellen einer Checkliste zur Überprüfung der Sicherheit. Das zuverlässige Web-App-Muster verwendet verwaltete Identitäten, um eine identitätsbasierte Sicherheit zu implementieren. Private Endpunkte, eine Webanwendungs-Firewall und ein eingeschränkter Zugriff auf die Web-App sorgen für Sicherheit in Bezug auf den eingehenden Datenverkehr.

Erzwingen der geringsten Rechte

Um die Sicherheit und Effizienz zu gewährleisten, sollten Sie Benutzer*innen (Benutzungsidentitäten) und Azure-Diensten (Workloadidentitäten) nur die jeweils notwendigen Berechtigungen gewähren.

Weisen Sie Benutzungsidentitäten Berechtigungen zu.

Untersuchen Sie die Anforderungen Ihrer Anwendung, um einen Satz von Rollen zu definieren, die alle Aktionen von Benutzer*innen abdecken, ohne sich zu überschneiden. Ordnen Sie die einzelnen Benutzer*innen der jeweils am besten geeigneten Rolle zu. Stellen Sie sicher, dass sie nur Zugriff auf das erhalten, was sie für ihre Aufgaben benötigen.

Weisen Sie Workloadidentitäten Berechtigungen zu.

Gewähren Sie nur die Berechtigungen, die für die Ausführung kritisch sind, z. B. CRUD-Aktionen in Datenbanken oder den Zugriff auf Geheimnisse. Die Berechtigungen für Workloadidentitäten sind persistent. Sie können Workloadidentitäten daher keine kurzfristigen oder Just-in-Time-Berechtigungen gewähren.

  • Sie sollten die rollenbasierte Zugriffssteuerung (Role Based Access Control, RBAC) verwenden. Beginnen Sie stets mit Azure RBAC, um Berechtigungen zuzuweisen. Sie ermöglicht eine präzise Steuerung und stellt sicher, dass der Zugriff überprüfbar und granular ist. Verwenden Sie Azure RBAC, um nur die Berechtigungen zu gewähren, die der jeweilige Dienst für die Ausführung der vorgesehenen Funktionen benötigt.

  • Ergänzen Sie dies mit einer Zugriffsteuerung auf Azure-Dienst-Ebene. Wenn Azure RBAC ein bestimmtes Szenario nicht abdeckt, ergänzen Sie sie mit Zugriffsrichtlinien auf Azure-Dienst-Ebene.

Weitere Informationen finden Sie unter:

Konfigurieren der Benutzerauthentifizierung und -autorisierung

Authentifizierung und Autorisierung sind kritische Aspekte der Sicherheit von Webanwendungen. Authentifizierung ist der Prozess, bei dem die Identität eines Benutzers überprüft wird. Autorisierung gibt die Aktionen an, die ein Benutzer innerhalb der Anwendung ausführen darf. Das Ziel besteht darin, Authentifizierung und Autorisierung zu implementieren, ohne Ihren Sicherheitsstatus zu schwächen. Um dieses Ziel zu erreichen, müssen Sie die Features der Azure-Anwendungsplattform (Azure App Service) und des Identitätsanbieters (Microsoft Entra ID) verwenden.

Benutzerauthentifizierung konfigurieren

Sichern Sie Ihre Web-App, indem Sie die Authentifizierung von Benutzer*innen über die Funktionen Ihrer Plattform aktivieren. Azure App Service unterstützt die Authentifizierung mittels Identitätsanbietern wie Microsoft Entra ID. Damit wird der Authentifizierungs-Workload aus Ihrem Code ausgelagert.

Beispiel: Die Referenzimplementierung verwendet Microsoft Entra ID als Identitätsplattform. Microsoft Entra ID erfordert eine Anwendungsregistrierung im primären Mandanten. Die Anwendungsregistrierung stellt sicher, dass die Benutzer, die Zugriff auf die Web-App erhalten, über Identitäten im primären Mandanten verfügen. Der folgende Terraform-Code zeigt die Erstellung einer Entra ID-App-Registrierung zusammen mit einer App-spezifischen Kontomanagement-Rolle.

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"
  }
}

Key Vault speichert unsere Clientkonfigurationsdaten auf sichere Weise, und die App Service-Plattform stellt unserer App die Informationen als Umgebungsvariablen bereit.

Integrieren Sie Ihre Webanwendung mit dem Identitätsanbieter.

Integrieren Sie Ihre Webanwendung mit Microsoft Entra ID für eine sichere Authentifizierung und Autorisierung. Der Spring Boot Starter für Microsoft Entra ID optimiert diesen Prozess und nutzt Spring Security und Spring Boot für die einfache Einrichtung. Die Lösung stellt verschiedene Authentifizierungsflows, eine automatische Tokenverwaltung, anpassbare Autorisierungsrichtlinien und Funktionen für die Integration mit Spring Cloud-Komponenten bereit. Dies ermöglicht die einfache Integration von Microsoft Entra ID und OAuth 2.0 in Spring Boot-Anwendungen, ohne dass eine manuelle Bibliotheks- oder Einstellungskonfiguration erforderlich ist.

Beispiel: Die Referenzimplementierung verwendet die Microsoft-Identitätsplattform (Microsoft Entra ID) als Identitätsanbieter für die Web-App. Sie verwendet die OAuth 2.0-Autorisierungscodegenehmigung für die Anmeldung eines Benutzers bzw. einer Benutzerin mit einem Microsoft Entra-Konto. Der folgende XML-Codeausschnitt definiert die zwei erforderlichen Abhängigkeiten des OAuth 2.0-Autorisierungscode-Genehmigungsflows. Die Abhängigkeit com.azure.spring: spring-cloud-azure-starter-active-directory ermöglicht die Microsoft Entra-Authentifizierung und -Autorisierung in einer Spring Boot-Anwendung. Die Abhängigkeit org.springframework.boot: spring-boot-starter-oauth2-client unterstützt 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>

Weitere Informationen finden Sie unter Spring Cloud Azure-Unterstützung für Spring Security.

Implementieren Sie von Geschäftsregeln für Authentifizierung und Autorisierung.

Die Implementierung von Geschäftsregeln für Authentifizierung und Autorisierung umfasst das Definieren der Zugriffssteuerungsrichtlinien und -berechtigungen für verschiedene Anwendungsfunktionen und -ressourcen. Sie müssen Spring Security für die Verwendung von Spring Boot Starter für Microsoft Entra ID konfigurieren. Diese Bibliothek ermöglicht die Integration mit Microsoft Entra ID und hilft Ihnen sicherzustellen, dass Benutzer*innen sicher authentifiziert werden. Das Konfigurieren und Aktivieren der Microsoft Authentication Library (MSAL) bietet Zugriff auf weitere Sicherheitsfeatures. Zu diesen Features gehören Tokenzwischenspeicherung und automatische Tokenaktualisierung.

Beispiel: 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 App-spezifische Rollen in CAMS sind Konto-Manager*in, Supportmitarbeiter*in auf Stufe 1 und Mitarbeiter*in im Außendienst. Die Rolle „Konto-Manager*in“ besitzt Berechtigungen zum Hinzufügen neuer App-Benutzer*innen und Kund*innen. Außendienstmitarbeiter*innen können Supporttickets erstellen. Das Attribut PreAuthorize 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";
    }
    ...

Für die Integration mit Microsoft Entra-ID verwendet die Referenzimplementierung den Codegenehmigungsflow für die OAuth 2.0-Autorisierung. Dieser Flow ermöglicht Benutzer*innen die Anmeldung mit einem Microsoft-Konto. Der folgende Codeausschnitt zeigt, wie Sie die SecurityFilterChain konfigurieren können, um Microsoft Entra ID für die Authentifizierung und Autorisierung zu konfigurieren.

@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();
    }
}
...

Weitere Informationen finden Sie unter:

Konfigurieren der Dienstauthentifizierung und -autorisierung

Konfigurieren Sie die Dienstauthentifizierung und -autorisierung so, dass die Dienste in Ihrer Umgebung die erforderlichen Berechtigungen für die Ausführung notwendiger Funktionen erhalten. Verwenden Sie Verwaltete Identitäten in Microsoft Entra ID, um die Erstellung und Verwaltung von Dienstidentitäten zu automatisieren. Dies beseitigt die Notwendigkeit für die manuelle Verwaltung von Anmeldeinformationen. Mit einer verwalteten Identität kann Ihre Web-App sicher auf Azure-Dienste zugreifen, z. B. Azure Key Vault und Datenbanken. Sie unterstützt darüber hinaus die Integration von CI/CD-Pipelines für Bereitstellungen zu Azure App Service. In Szenarien wie hybriden Bereitstellungen oder Bereitstellungen mit Legacy-Systemen sollten Sie Ihre lokalen Authentifizierungslösungen jedoch weiter verwenden, um die Migration zu vereinfachen. Wechseln Sie zu verwalteten Identitäten, wenn Ihr System für einen modernen Ansatz für die Identitätsverwaltung bereit ist. Weitere Informationen finden Sie unter Überwachung verwalteter Identitäten.

Beispiel: Die Referenzimplementierung behält die lokalen Authentifizierungsmechanismen für die Datenbank bei (Benutzername und Kennwort). Als Resultat hieraus speichert die Referenzimplementierung das Datenbankgeheimnis in Key Vault. Die Web-App verwendet eine verwaltete Identität (systemseitig zugewiesen), um Geheimnisse aus Key Vault abzurufen.

Verwenden Sie einen zentralen Geheimnisspeicher, um Geheimnisse zu verwalten.

Verwenden Sie Azure Key Vault, wenn Sie Ihre Anwendung zur Cloud migrieren, um alle Geheimnisse sicher zu speichern. Dieses zentrale Repository bietet sichere Speicherung, Schlüsselrotation, Zugriffsüberwachung und Überwachung für Dienste, die keine verwalteten Identitäten unterstützen. Für die Konfiguration von Anwendungen wird Azure App Configuration empfohlen.

Beispiel: Die Referenzimplementierung speichert die folgenden Geheimnisse in Key Vault: (1) Benutzername und Kennwort für die PostgreSQL-Datenbank, (2) das Redis Cache-Kennwort und (3) das Clientgeheimnis für Microsoft Entra ID, das mit der MSAL-Implementierung verknüpft ist.

Fügen Sie Key Vault nicht in den HTTP-Anforderungsflow ein.

Laden Sie Geheimnisse aus Key Vault beim Starten der Anwendung, nicht während jeder einzelnen HTTP-Anforderung. Key Vault dient zum sicheren Speichern und Abrufen vertraulicher Daten während der Bereitstellung. Zugriffe mit hoher Häufigkeit innerhalb von HTTP-Anforderungen können die Durchsatzkapazitäten von Key Vault überschreiten, was zu Anforderungseinschränkungen und Fehlern mit dem HTTP-Statuscode 429 führt. Weitere Informationen finden Sie unter Key Vault-Transaktionslimits.

Verwenden Sie nur eine einzige Methode für den Zugriff auf Geheimnisse in Key Vault.

Beim Konfigurieren einer Web-App für den Zugriff auf Geheimnisse in Key Vault haben Sie zwei primäre Optionen:

  • App-Einstellung in App Service: Verwenden Sie eine App-Einstellung in App Service, um das Geheimnis direkt als Umgebungsvariable einzufügen.

  • Direkter Geheimnisverweis: Verweisen Sie im Anwendungscode direkt auf das Geheimnis. Fügen Sie in der Eigenschaftendatei Ihrer Anwendung einen spezifischen Verweis hinzu, z. B. application.properties für Java-Anwendungen, damit Ihre App mit Key Vault kommunizieren kann.

Es ist wichtig, eine dieser Methoden auszuwählen und aus Gründen der Einfachheit nur diese Methode zu verwenden und so eine unnötige Komplexität zu vermeiden. Für die Integration von Key Vault mit einer Spring-Anwendung umfasst der Prozess Folgendes:

  1. Fügen Sie die Abhängigkeit „Azure Spring Boot Starter für Azure Key Vault-Geheimnisse“ Secrets in Ihrer pom.xml-Datei hinzu.
  2. Konfigurieren Sie einen Key Vault-Endpunkt in Ihrer Anwendung. Dies kann entweder über die Datei „application.properties“ oder als Umgebungsvariable erfolgen.

Beispiel: Die Referenzimplementierung verwendet eine App-Einstellung in App Service und fügt Geheimnisse ein.

Verwenden privater Endpunkte

Verwenden Sie in allen Produktionsumgebungen für alle unterstützen Azure-Dienste private Endpunkte. Private Endpunkte stellen private Verbindungen zwischen Ressourcen in einem virtuellen Azure-Netzwerk und in Azure-Diensten bereit. Standardmäßig erfolgt die Kommunikation mit den meisten Azure-Diensten über das öffentliche Internet. Für private Endpunkte sind keine Codeänderungen, App-Konfigurationen oder Verbindungszeichenfolgen erforderlich. Weitere Informationen finden Sie unter Erstellen eines privaten Endpunkts und Bewährte Methoden für die Endpunktsicherheit.

Beispiel: Die Referenzimplementierung verwendet private Endpunkte für Key Vault, Azure Cache for Redis und Azure Database for PostgreSQL.

Verwenden einer Web Application Firewall

Der gesamte eingehende Internetdatenverkehr an die Web-App muss über Web Application Firewall geleitet werden, um die Web-App vor häufigen Web-Exploits zu schützen. Setzen Sie die Leitung des gesamten eingehenden Internetdatenverkehrs über den öffentlichen Load Balancer (wenn vorhanden) und die Web Application Firewall durch. Sie können (1) den privaten Azure Front Door-Endpunkt verwenden, oder (2) Sie können Anforderungen nach dem X-Azure-FDID-Headerwert filtern.

Die App Service-Plattform und Java Spring können nach Headerwert filtern. Sie sollten App Service als erste Option verwenden. Das Filtern auf Plattformebene verhindert, dass unerwünschte Anforderungen Ihren Code erreichen. Sie müssen konfigurieren, welcher Datenverkehr durch Ihre Web Application Firewall geleitet werden soll. Sie können basierend auf dem Hostnamen, der Client-IP-Adresse und anderen Werten filtern. Weitere Informationen finden Sie unter Beibehalten des ursprünglichen HTTP-Hostnamens.

Beispiel: Die Referenzimplementierung verwendet einen privaten Endpunkt in der Produktionsumgebung und den X-Azure-FDID Headerwert in der Entwicklungsumgebung.

Datenbanksicherheit konfigurieren

Der Datenbankzugriff auf Administratorebene gewährt Berechtigungen zum Ausführen privilegierter Vorgänge. Privilegierte Vorgänge umfassen das Erstellen und Löschen von Datenbanken, das Ändern von Tabellenschemas oder das Ändern von Benutzerberechtigungen. Entwickler benötigen häufig Zugriff auf Administratorebene, um die Datenbank zu verwalten oder Probleme zu behandeln.

  • Vermeiden Sie dauerhaft erhöhte Berechtigungen. Gewähren Sie den Entwickler*innen Just-in-Time-Zugriff, um privilegierte Vorgänge auszuführen. Mit einem Just-in-Time-Zugriff erhalten Benutzer*innen temporäre Berechtigungen für die Ausführung privilegierter Aufgaben.

  • Erteilen Sie der Anwendung keine erhöhten Berechtigungen. Gewähren Sie keinen Zugriff auf Administratorebene für die Anwendungsidentität. Konfigurieren Sie für die Anwendung den geringstprivilegierten Zugriff auf die Datenbank. Dies begrenzt den Schadensradius von Fehlern und Sicherheitsverletzungen. Sie verfügen über zwei primäre Methoden für den Zugriff auf die Azure PostgreSQL-Datenbank. Sie können Microsoft Entra-Authentifizierung oder PostgreSQL-Authentifizierung verwenden. Weitere Informationen finden Sie unter JDBC mit Azure PostgreSQL.

Kostenoptimierung

Bei der Kostenoptimierung geht es um die Suche nach Möglichkeiten, unnötige Ausgaben und den Verwaltungsoverhead zu reduzieren. Weitere Informationen finden Sie unter Erstellen einer Checkliste zur Überprüfung der Kostenoptimierung. Das zuverlässige Web-App-Muster implementiert Dimensionierungstechniken, die automatische Skalierung und die effiziente Ressourcennutzung, um eine stärker kostenoptimierte Web-App zu erhalten.

Richtige Größe der Ressourcen für jede Umgebung

Informieren Sie sich über die verschiedenen Leistungsstufen von Azure-Diensten, und verwenden Sie stets die richtige SKU für die Anforderungen der einzelnen Umgebungen. Produktionsumgebungen benötigen SKUs, die den Vereinbarungen zum Servicelevel (Service Level Agreements, SLA), Features und der Skalierung gerecht werden, die für die Produktion erforderlich sind. Nichtproduktionsumgebungen benötigen in der Regel jedoch nicht die gleiche Funktionalität. Ziehen Sie Azure Dev/Test-Preisoptionen, Azure Reservations und Azure-Compute-Sparpläne in Betracht, um zusätzliche Einsparungen zu erzielen.

Beispiel: Die Referenzimplementierung verwendet keine Azure Dev/Test-Preise, da die Preise für Azure Dev/Test keine der Komponenten abdecken. Azure Database for PostgreSQL ist ein erstklassiger Kandidat für eine reservierte Instanz, da geplant ist, nach dieser ersten Konvergenzphase in der Cloud mindestens ein Jahr lang bei dieser Datenbank-Engine zu bleiben. Die Referenzimplementierung verfügt über einen optionalen Parameter, der verschiedene SKUs bereitstellt. Ein Umgebungsparameter weist die Terraform-Vorlage an, Entwicklungs-SKUs auszuwählen. Der folgende Code zeigt diesen Umgebungsparameter.

azd env set APP_ENVIRONMENT prod

Contoso Fiber verwendet Infrastructure-as-Code (IaC)-Vorlagen für Entwicklungs- und Produktionsbereitstellungen. Die Entwicklungsumgebung ist kostenoptimiert und verwendet die kostengünstigsten SKUs, die für die App-Entwicklung erforderlich sind. Die Produktionsumgebung verwendet SKUs, die die Anforderungen an das Servicelevel-Ziel der Anwendung auf Produktionsebene erfüllen.

Verwenden der Autoskalierung

Die automatische Skalierung automatisiert die horizontale Skalierung für Produktionsumgebungen. Automatisches Skalieren auf der Grundlage von Leistungsmetriken. Leistungsauslöser für die CPU-Auslastung sind ein guter Ausgangspunkt, wenn Sie die Skalierungskriterien Ihrer Anwendung nicht kennen. Sie müssen Skalierungsauslöser (CPU, RAM, Netzwerk und Datenträger) konfigurieren und anpassen, um dem Verhalten Ihrer Webanwendung zu entsprechen. Skalieren Sie nicht vertikal, um häufigen Nachfrageänderungen zu entsprechen. Es ist weniger kosteneffizient. Weitere Informationen finden Sie unter Skalieren in Azure App Service und Autoskalierung in Microsoft Azure.

Verwenden Sie Ressourcen effizient.

Die effiziente Ressourcennutzung umfasst die strategische Verwaltung und Zuteilung von Cloudressourcen, um die organisatorischen Anforderungen ohne Überbereitstellungen zu erfüllen. Ressourcenausgaben und Verwaltungsaufwand werden so minimiert. Befolgen Sie die folgenden Empfehlungen, um die Ressourceneffizienz zu verbessern:

  • Verwenden Sie gemeinsam genutzte Dienste. Die Zentralisierung und gemeinsame Nutzung bestimmter Ressourcen bedeutet eine Kostenoptimierung und einen geringeren Verwaltungsaufwand. Sie können beispielsweise gemeinsam verwendete Netzwerkressourcen im virtuellen Hubnetzwerk platzieren.

  • Löschen Sie nicht verwendete Umgebungen. Löschen Sie Nichtproduktionsumgebungen nach dem Ende der normalen Geschäftszeiten oder an Feiertagen, um die Kosten zu optimieren. Sie können die Infrastruktur als Code verwenden, um Azure-Ressourcen und ganze Umgebungen zu löschen. Entfernen Sie die Deklaration der Ressource, die Sie aus Ihrer Infrastruktur-as-Code-Vorlage löschen möchten. Sichern Sie Daten, die Sie später benötigen. Informieren Sie sich über die Abhängigkeiten in Bezug auf die Ressource, die Sie löschen. Wenn es Abhängigkeiten gibt, müssen Sie diese Ressourcen möglicherweise aktualisieren oder ebenfalls entfernen.

  • Funktionalität für die gemeinsame Platzierung. Wenn genügend Kapazitäten vorhanden sind, können Sie Anwendungsressourcen und -funktionen gemeinsam in einer einzigen Azure-Ressource platzieren. Mehrere Web-Apps können beispielsweise einen einzelnen Server verwenden (App Service-Plan). Ein einzelner Zwischenspeicher kann beispielsweise mehrere Datentypen unterstützen.

Optimaler Betrieb

Die Säule „Optimaler Betrieb“ deckt die Betriebsprozesse ab, die für die Bereitstellung einer Anwendung und deren Ausführung in der Produktion sorgen. Weitere Informationen finden Sie unter Erstellen einer Checkliste zur Überprüfung des optimalen Betriebs. Das zuverlässige Web-App-Muster implementiert Infrastruktur als Code für Infrastrukturbereitstellungen und zur Überwachung, um Einblicke zu bieten.

Konfigurieren der Überwachung

Zum Nachverfolgen und Debuggen sollten Sie die Protokollierung aktivieren, um zu diagnostizieren, wenn eine Anforderung fehlschlägt. Die Telemetriedaten, die Sie von Ihrer Anwendung erfassen, sollten den betrieblichen Anforderungen dienlich sein. Sie müssen mindestens Telemetriedaten für Baselinemetriken sammeln. Sie sollten Informationen zum Benutzerverhalten sammeln, die Ihnen helfen können, gezielte Verbesserungen anzuwenden.

Überwachen Sie die Baselinemetriken.

Die Workload sollte Baselinemetriken überwachen. Wichtige Metriken, die gemessen werden müssen, sind Anforderungsdurchsatz, durchschnittliche Anforderungsdauer, Fehler und Überwachung von Abhängigkeiten. Wir empfehlen die Verwendung von Application Insights, um diese Telemetriedaten zu erfassen.

Beispiel: Die Referenzimplementierung verwendet Application Insights. Application Insights wird über Terraform als Teil der app_settings-Konfiguration von App Service aktiviert.

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

Spring Boot registriert mehrere Kernmetriken in Application Insights, z. B. Java Virtual Machine (JVM), CPU, Tomcat und andere. Application Insights sammelt automatisch aus Protokollierungsframeworks wie Log4j und Logback. Weitere Informationen finden Sie unter

Erstellen Sie angepasste Telemetriedaten und Metriken wie erforderlich.

Zusätzlich zu den Baselinemetriken in Application Insights sollten Sie benutzerdefinierte Telemetriedaten erstellen, um Ihre Benutzer und deren Interaktionen mit Ihrer Anwendung besser zu verstehen. Mit Application Insights können Sie benutzerdefinierte Telemetriedaten erfassen und auch benutzerdefinierte Metriken über Micrometer sammeln. Das Ziel besteht darin, tiefere Einblicke in die Leistung Ihrer Anwendung und das Benutzerverhalten zu erhalten, damit Sie fundiertere Entscheidungen treffen und Verbesserungen vornehmen können.

Sammeln Sie protokollbasierte Metriken.

Verfolgen Sie protokollbasierte Metriken nach, um bessere Einblicke in wichtige Fragen der Anwendungsintegrität und Metriken zu erhalten. Sie können Abfragen in der Kusto-Abfragesprache (KQL) in Application Insights verwenden, um Daten zu suchen und zu organisieren. Weitere Informationen finden Sie unter Protokollbasierte Metriken von Azure Application Insights und Protokollbasierte und vorab aggregierte Metriken in Application Insights.

Aktivieren der Plattformdiagnose

Mit einer Diagnoseeinstellung in Azure können Sie die Plattformprotokolle und Metriken angeben, die Sie sammeln möchten, und wo sie gespeichert werden sollen. Plattformprotokolle sind integrierte Protokolle, die Diagnose- und Überprüfungsinformationen bereitstellen. Sie können Plattformdiagnosen für die meisten Azure-Dienste aktivieren, aber jeder Dienst definiert seine eigenen Protokollkategorien. Bei verschiedenen Azure-Diensten können Protokollkategorien ausgewählt werden.

  • Aktivieren Sie die Diagnose für alle unterstützten Dienste. Azure-Dienste erstellen Plattformprotokolle automatisch, aber der Dienst speichert sie nicht automatisch. Sie müssen die Diagnoseeinstellung für jeden Dienst aktivieren, und Sie sollten sie für jeden Azure-Dienst aktivieren, der Diagnose unterstützt.

  • Senden Sie Diagnosen an dasselbe Ziel wie die Anwendungsprotokolle. Wenn Sie Diagnosen aktivieren, wählen Sie die Protokolle aus, die Sie sammeln möchten, und wohin sie gesendet werden sollen. Sie sollten die Plattformprotokolle an dasselbe Ziel wie die Anwendungsprotokolle senden, damit Sie die beiden Datasets korrelieren können.

Beispiel: Die Referenzimplementierung verwendet Terraform, um für alle unterstützten Dienste Azure-Diagnosen zu aktivieren. Mit dem folgenden Terraform-Code werden die Diagnoseeinstellungen für App Service konfiguriert.

# 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
  }
}

Verwenden einer CI/CD-Pipeline

Integrieren Sie eine kontinuierliche Integrations- und Bereitstellungspipeline (CI/CD), um Ihre Bereitstellungen zu automatisieren. Diese Automatisierung sollte von der Quellcodeverwaltung direkt auf Ihre App Service-Umgebungen erweitert werden, einschließlich Test, Staging und Produktion. Nutzen Sie Azure-Pipelines, wenn Sie mit Azure DevOps- oder GitHub-Aktionen für GitHub-Projekte arbeiten.

  • Integrieren Sie Komponententests. Priorisieren Sie die Ausführung und Übergabe aller Komponententests (mit JUnit) innerhalb Ihrer Pipeline, bevor Sie eine Bereitstellung für App Services durchführen. Integrieren Sie Codequalitäts- und Abdeckungstools wie SonarQube und JaCoCo, um eine umfassende Testabdeckung zu erzielen.

  • Verwenden Sie ein Java-Simulationsframework. Verwenden Sie Java-Simulationsframeworks (Mockito, EasyMock) für Tests mit externen Endpunkten. Mit diesen Frameworks können Sie simulierte Endpunkte erstellen. Auf diese Weise müssen Sie keine echten externen Endpunkte konfigurieren und können einheitliche Testbedingungen in allen Umgebungen sicherstellen.

  • Führen Sie Sicherheitsüberprüfungen durch. Verwenden Sie statische Anwendungssicherheitstests (SAST), um Sicherheitsfehler und Codierungsfehler im Quellcode zu finden. Führen Sie außerdem eine Softwarekompositionsanalyse (SCA) durch, um Bibliotheken und Komponenten von Drittanbietern auf Sicherheitsrisiken zu untersuchen. Tools für diese Analysen sind direkt in GitHub und Azure DevOps integriert.

Steuern Sie Produktionsbereitstellungen.

Sie müssen Richtlinien für die Bereitstellung von Code in der Produktion festlegen und einen Genehmigungsprozess für alle Produktionsbereitstellungen erstellen.

Effiziente Leistung

Leistungseffizienz ist die Fähigkeit Ihrer Workload, eine effiziente Skalierung entsprechend den Anforderungen der Benutzer auszuführen. Weitere Informationen finden Sie unter Erstellen einer Checkliste zur Überprüfung der Leistungseffizienz. Das zuverlässige Web-App-Muster verwendet das cachefremde Muster, um die Latenz für häufig angeforderte Daten zu minimieren.

Verwenden des cachefremden Musters

Das cachefremde Muster ist eine Strategie für die Zwischenspeicherung zur Verbesserung der Verwaltung von In-Memory-Daten. Das Muster weist der Anwendung die Verantwortung für die Verarbeitung von Datenanforderungen zu und stellt Konsistenz zwischen dem Zwischenspeicher und einem persistenten Speicher her, z. B. einer Datenbank. Wenn die Web-App eine Datenanforderung empfängt, durchsucht sie zuerst den Zwischenspeicher. Wenn die Daten fehlen, ruft sie diese aus der Datenbank ab, antwortet auf die Anforderung und aktualisiert den Zwischenspeicher entsprechend. Dieser Ansatz verkürzt die Reaktionszeiten, verbessert den Durchsatz und reduziert die Notwendigkeit für eine weitere Skalierung. Darüber hinaus ist der Dienst besser verfügbar, da die Auslastung des primären Datenspeichers reduziert wird und Ausfallrisiken minimiert werden.

Aktivieren der Zwischenspeicherung

Um die Zwischenspeicherung zu aktivieren, fügen Sie das Paket spring-boot-starter-cache in Ihrer pom.xml-Datei als Abhängigkeit hinzu. Das spring-boot-starter-cache-Paket konfiguriert den Redis-Cache mit Standardwerten. Sie sollten diese Werte in der Datei application.properties oder in den Umgebungsvariablen aktualisieren, um die Anforderungen Ihrer Web-App zu erfüllen. Beispielsweise bestimmt spring.cache.redis.time-to-live (dargestellt in Millisekunden) die Zeitspanne, über die Daten vor dem Entfernen im Cache verbleiben. Sie müssen einen Wert angeben, der die Anforderungen Ihrer Web-App erfüllt. Schließlich müssen Sie die erforderlichen Daten in Ihrem Code mithilfe der @Cacheable-Anmerkung zwischenspeichern.

Speichern Sie häufig abgerufene Daten im Zwischenspeicher.

Priorisieren Sie die Zwischenspeicherung für die am häufigsten abgerufenen Daten. Identifizieren Sie wichtige Datenpunkte, die Kundenbindung und Systemleistung fördern. Implementieren Sie Strategien für die Zwischenspeicherung speziell für diese Bereiche, um die Effektivität des cachefremden Musters zu optimieren. Dies reduziert die Latenz und die Datenbankauslastung erheblich. 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.

Halten Sie die Daten im Zwischenspeicher stets aktuell.

Planen Sie regelmäßige Aktualisierungen des Zwischenspeichers, um die Daten mit den neuesten Änderungen in der Datenbank zu synchronisieren. Ermitteln Sie die optimale Aktualisierungsrate basierend auf Datenvolatilität und Anforderungen der Benutzer*innen. Dieses Verfahren stellt sicher, dass die Anwendung das cachefremde Muster verwendet, um sowohl einen schnellen Zugriff als auch aktuelle Informationen bereitzustellen.

Stellen Sie die Datenkonsistenz sicher.

Implementieren Sie Mechanismen zum Aktualisieren des Zwischenspeichers direkt nach jedem Schreibvorgang in der Datenbank. Verwenden Sie ereignisgesteuerte Updates oder dedizierte Datenverwaltungsklassen, um die Kohärenz des Zwischenspeichers sicherzustellen. Die konsistente Synchronisierung des Zwischenspeichers mit Datenbankänderungen ist für das cachefremde Muster von zentraler Bedeutung.

Beispiel: Der folgende Code fügt das Paket spring-boot-starter-cache der Datei pom.xml als Abhängigkeit hinzu, um die Zwischenspeicherung zu aktivieren.

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-cache</artifactid>
</dependency>

Die Referenzimplementierung aktiviert Redis in der Datei application.properties.

# Redis
spring.data.redis.ssl.enabled=true
spring.session.redis.namespace=spring:session

Der folgende Code definiert eine Methode namens getAccountDetail. Die Methode ruft die Benutzereinstellungen ab, die einem bestimmten Benutzernamen zugeordnet sind. @Cacheable(value="account-details", key="#id") kommentiert die Methode getAccountDetail und weist die Web-App an, die Benutzereinstellungen in einem Zwischenspeicher zu speichern.

    @Cacheable(value="account-details", key="#id")
    public AccountDetail getAccountDetail(Long id) {
        Optional<Account> optionalAccount = accountRepository.findById(id);
        if (optionalAccount.isEmpty()) {
            throw new IllegalArgumentException("Account ID " + id + " does not exist");
        }

        Account account = optionalAccount.get();
        AccountDetail accountDetail = mapToAccountDetail(account);

        return accountDetail;
    }

Datenbankleistung

Die Datenbankleistung kann sich auf die Leistung und Skalierbarkeit einer Anwendung auswirken. Es ist wichtig, die Leistung Ihrer Datenbank zu testen, um sicherzustellen, dass sie optimiert ist. Einige wichtige Überlegungen sind die Auswahl der richtigen Cloudregion, das Verbindungspooling, das cachefremde Muster (Cache-Aside) und die Optimierung von Abfragen.

  • Testen von Netzwerkhops. Das Verschieben einer Anwendung in die Cloud kann zu zusätzlichen Netzwerkhops und Wartezeiten in Ihrer Datenbank führen. Sie sollten auf zusätzliche Hops testen, die von der neuen Cloudumgebung eingeführt werden.

  • Ermitteln Sie eine Leistungsbasislinie. Sie sollten lokale Leistungsmetriken als anfängliche Baseline verwenden, um die Anwendungsleistung in der Cloud zu vergleichen.

  • Verwenden von Application Insights Application Insights bietet detaillierte Metriken zu Datenbankabfragen und allen JDBC-Schnittstellen. Sie sollten die Lösung verwenden, um sicherzustellen, dass eine portierte Datenbank die SLAs erfüllt, oder um Abfragen zu finden, die Sie optimieren müssen. Sie sollten niemals dynamisches SQL verwenden, da es Sicherheits- und Leistungsprobleme verursacht.

  • Verwenden von Verbindungspools. Sie sollten JDBC-Verbindungspools verwenden und diese basierend auf den TPS-Metriken (Transactions per Second, Transaktionen pro Sekunde) und SLAs optimieren. Sie sollten Tools zur Überwachung der Datenbankleistung verwenden, um die Datenbankleistung unter Last zu testen und auszuwerten.

Nächste Schritte

Stellen Sie die Referenzimplementierung bereit, indem Sie den Anweisungen im GitHub-Repository folgen. In den folgenden Ressourcen erfahren Sie mehr über bewährte Methoden für die Cloud und Migrationen zur Cloud.

Bewährte Methoden für die Cloud. Anleitungen zur Einführung und Architektur von Azure finden Sie unter:

  • Cloud Adoption Framework. Ein Framework, das Ihrer Organisation beim Vorbereiten und Ausführen einer Strategie zum Erstellen von Lösungen in Azure helfen kann.
  • Well-Architected Framework. Diesen Satz von Leitgedanken können Sie zur Verbesserung der Workloadqualität verwenden.

Informationen zu Anwendungen, die ein höheres Service Level Objective (SLO) erfordern, finden Sie unter Unternehmenskritische Workloads.

Migrationsleitfaden. Mit den folgenden Tools und Ressourcen können Sie lokale Ressourcen zu Azure migrieren:

  • Azure Migrate bietet einen vereinfachten Migrations-, Modernisierungs- und Optimierungsdienst für Azure, der die Bewertung und Migration von Web-Apps, SQL Server und virtuellen Computern übernimmt.
  • Leitfäden zur Azure-Datenbankmigration bieten Ressourcen für verschiedene Datenbanktypen sowie Tools, die für Ihr Migrationsszenario entwickelt wurden.
  • Azure App Service-Zielzonenbeschleuniger bietet einen Leitfaden zum Härten und Skalieren von App Service-Bereitstellungen.