Zuverlässiges Web-App-Muster für .NET

Azure App Service
Azure Front Door
Azure Cache for Redis
.NET

Dieser Artikel enthält Anleitungen zur Implementierung des zuverlässigen Web-App-Musters. Dieses Muster beschreibt, wie Web-Apps für die Cloudmigration geändert werden (Umzug auf eine neue Plattform). Es bietet präskriptive Anleitungen zur Architektur, Konfiguration und zum Code, die den Prinzipien des Well-Architected Framework entsprechen.

Gründe für das Muster für zuverlässige Web-Apps für .NET

Das zuverlässige Web-App-Muster besteht aus einer Reihe von Grundsätzen und Implementierungstechniken, die festlegen, wie Sie Web-Apps bei der Migration in die Cloud auf eine neue Plattform umziehen. Es führt nur die Codeupdates durch, die für eine erfolgreiche Ausführung in der Cloud benötigt werden. In den folgenden Anleitungen wird durchgehend die Referenzimplementierung als Beispiel verwendet und der Umstieg auf eine neue Plattform des fiktiven Unternehmens Relecloud verfolgt, um den geschäftlichen Kontext für Ihren geschäftlichen Weg zu schaffen. Vor der Implementierung des zuverlässigen Web-App-Musters für .NET verfügte Relecloud über eine monolithische, lokale Ticketing-Web-App, die das ASP.NET Framework verwendet hat.

Tipp

GitHub-Logo Es gibt eine Referenzimplementierung (Beispiel) des zuverlässigen Web-App-Musters. Sie stellt den Endzustand der zuverlässigen Web-App-Implementierung für ein fiktives Unternehmen namens Relecloud dar. Es handelt sich um eine Web-App mit Produktionsniveau, die alle in diesem Artikel beschriebenen Code-, Architektur- und Konfigurationsupdates enthält. Stellen Sie die Referenzimplementierung bereit, um die Implementierung des zuverlässigen Web-App-Musters anzuleiten.

Implementieren des zuverlässigen Web-App-Musters

Dieser Artikel enthält Architektur-, Code- und Konfigurationsanleitungen zum Implementieren des zuverlässigen Web-App-Musters. Verwenden Sie die folgenden Links, um zu den benötigten Anleitungen zu navigieren:

  • Geschäftskontext: Passen Sie diese Anleitung an Ihren geschäftlichen Kontext an und erfahren Sie, wie Sie unmittelbare und langfristige Ziele definieren, die die Entscheidungen für eine Neuausrichtung der Plattform beeinflussen.
  • Architekturanleitung: Erfahren Sie, wie Sie die richtigen Clouddienste auswählen und eine Architektur entwerfen, die Ihren Geschäftsanforderungen entspricht.
  • Codeanleitung: Implementieren Sie drei Entwurfsmuster, um die Zuverlässigkeit und Leistungsfähigkeit Ihrer Web-App in der Cloud zu verbessern: Retry, Circuit-Breaker, and Cache-Aside.
  • Konfigurationsanleitung: Konfigurieren Sie die Authentifizierung und Autorisierung, verwaltete Identitäten, rechteisierte Umgebungen, Infrastruktur als Code und die Überwachung.

Geschäftskontext

Der erste Schritt beim Umzug einer Web-App auf eine andere Plattform besteht darin, Ihre Geschäftsziele zu definieren. Sie sollten sofortige Ziele festlegen, z. B. Ziele auf Serviceebene und Kostenoptimierungsziele sowie zukünftige Ziele für Ihre Webanwendung. Diese Ziele sind für Ihre Wahl von Clouddiensten und die Architektur Ihrer Webanwendung in der Cloud relevant. Definieren Sie ein Ziel-SLO für Ihre Web-App, z. B. 99,9 % Betriebszeit. Berechnen Sie die zusammengesetzte SLA für alle Dienste, die sich auf die Verfügbarkeit Ihrer Web-App auswirken.

Beispiel: Relecloud hat eine positive Umsatzprognose und erwartet eine höhere Nachfrage für die Ticket-Web-App. Um diese Anforderung zu erfüllen, hat das Unternehmen die Ziele für die Webanwendung wie folgt definiert:

  • Anwendung kostengünstiger, aber hochwertiger Codeänderungen
  • Erreichen eines Servicelevel-Ziels (Service Level Objective, SLO) von 99,9 %
  • Einführung von DevOps-Verfahren
  • Entwicklung kostenoptimierter Umgebungen
  • Verbesserung von Zuverlässigkeit und Sicherheit

Die lokale Infrastruktur von Relecloud bot keine kostengünstige Lösung, um diese Ziele zu erreichen. Das Unternehmen kam zu dem Schluss, dass die Migration ihrer Webanwendung zu Azure die kostengünstigste Möglichkeit war, die unmittelbaren und zukünftigen Ziele zu erreichen.

Anleitung zur Architektur

Das zuverlässige Web-App-Muster verfügt über einige wesentliche Architekturelemente. Sie benötigen DNS zum Verwalten der Endpunktauflösung, einer Webanwendungsfirewall zum Blockieren des bösartigen HTTP-Datenverkehrs und einen Load Balancer zum Schutz und Weiterleiten eingehender Benutzeranforderungen. Die Anwendungsplattform hostet Ihren Web-App-Code und führt Aufrufe an alle Back-End-Dienste über private Endpunkte in einem virtuellen Netzwerk aus. Ein Tool zur Anwendungsleistungsüberwachung erfasst Metriken und Protokolle, um Ihre Web-App zu verstehen.

Diagramm mit den wesentlichen Architekturelementen des zuverlässigen Web-App-Musters.

Abbildung 1. Wesentliche Architekturelemente des zuverlässigen Web-App-Musters

Entwerfen der Architektur

Entwerfen Sie Ihre Infrastruktur, um Ihre Wiederherstellungsmetriken zu unterstützen, z. B. Wiederherstellungszeitvorgabe (Recovery Time Objective, RTO) und Wiederherstellungspunktvorgabe (Recovery Point Objective, RPO). Das RTO wirkt sich auf die Verfügbarkeit aus und muss Ihre SLO unterstützen. Ermitteln Sie eine Wiederherstellungspunktvorgabe (RPO), und konfigurieren Sie die Datenredundanz, um das RPO zu erfüllen.

  • Entscheiden Sie sich für die Zuverlässigkeit der Infrastruktur. Ermitteln Sie, wie viele Verfügbarkeitszonen und Regionen Sie benötigen, um Ihre Verfügbarkeitsanforderungen zu erfüllen. Fügen Sie Verfügbarkeitszonen und Regionen hinzu, bis die zusammengesetzte SLA Ihre SLO erfüllt. Das zuverlässige Web-App-Muster unterstützt mehrere Regionen für eine aktive oder passive Konfiguration. Die Referenzimplementierung verwendet beispielsweise eine aktiv-passive Konfiguration, um eine SLO von 99,9 % zu erfüllen.

    Konfigurieren Sie für eine Web-App mit mehreren Regionen Ihren Lastenausgleich so, dass der Datenverkehr an die zweite Region weitergeleitet wird, um je nach Geschäftsbedarf eine aktive oder passive Konfiguration zu unterstützen. Die beiden Regionen benötigen dieselben Dienste, mit der Ausnahme, dass eine Region über ein virtuelles Hub-Netzwerk verfügt, das die Regionen verbindet. Verwenden Sie eine Hub-and-Spoke-Netzwerktopologie, um freigegebene Ressourcen wie eine Netzwerkfirewall zu zentralisieren und gemeinsam zu nutzen. Wenn Sie über virtuelle Computer verfügen, fügen Sie dem virtuellen Hubnetzwerk einen Bastionhost hinzu, um sie sicher zu verwalten (siehe Abbildung 2).

    Diagramm, das das zuverlässige Web-App-Muster mit einer zweiten Region und einer Hub-and-Spoke-Topologie zeigt.

    Abbildung 2. Das zuverlässige Web-App-Muster mit einer zweiten Region und einer Hub-and-Spoke-Topologie

  • Wählen Sie eine Netzwerktopologie aus. Wählen Sie die richtige Netzwerktopologie für Ihre Web- und Netzwerkanforderungen aus. Wenn Sie mehrere virtuelle Netzwerke haben möchten, verwenden Sie eine Hub- und Spoke-Netzwerktopologie. Sie bietet Kosten-, Verwaltungs- und Sicherheitsvorteile mit Hybridkonnektivitätsoptionen zu lokalen und virtuellen Netzwerken.

Wählen Sie die richtigen Azure-Dienste aus.

Wenn Sie eine Web-App zur Cloud migrieren, sollten Sie Azure-Dienste auswählen, die Ihren geschäftlichen Anforderungen entsprechen und an den aktuellen Funktionen der lokalen Web-App ausgerichtet sind. Die Ausrichtung trägt zur Minimierung des Aufwands für die Verlagerung zu einer neuen Plattform bei. Sie könnten beispielsweise Dienste verwenden, mit denen Sie das Datenbankmodul beibehalten und vorhandene Middleware und Frameworks unterstützen können. In den folgenden Abschnitten finden Sie Anleitungen für die Auswahl der richtigen Azure-Dienste für Ihre Web-App.

Beispiel: Vor dem Wechsel zur Cloud stellte die Ticket-Web-App von Relecloud eine lokale, monolithische ASP.NET-App dar. Sie wurde auf zwei virtuellen Computern auf der Basis einer Microsoft SQL Server-Datenbank ausgeführt. Die Web-App litt unter häufigen Problemen hinsichtlich Skalierbarkeit und Funktionsbereitstellung. Dieser Ausgangspunkt, die geschäftlichen Ziele und das SLO lagen der Auswahl der Dienste zugrunde.

  • Anwendungsplattform: Verwenden Sie Azure App Service als Ihre Anwendungsplattform. Relecloud hat sich aus den folgenden Gründen für Azure App Service als Anwendungsplattform entschieden:

    • Hohes Niveau der Vereinbarung zum Servicelevel (Service Level Agreement, SLA): Dieser Dienst verfügt über ein hohes SLA-Niveau, das die Anforderung an das Produktionsumgebungs-SLO von 99,9 % erfüllt.
    • Reduzierung des Verwaltungsaufwands: Azure App Service ist eine vollständig verwaltete Lösung für Skalierung, Integritätsprüfung und Lastenausgleich.
    • .NET-Unterstützung: Azure App Service unterstützt die Version von .NET, in der die Anwendung geschrieben ist.
    • Möglichkeit der Containerisierung: Die Web-App kann ohne Containerisierung zur Cloud migriert werden. Die Anwendungsplattform unterstützt jedoch eine Containerisierung, ohne Azure-Dienste ändern zu müssen.
    • Automatische Skalierung: Die Web-App kann abhängig von Datenverkehr und Konfigurationseinstellungen automatisch hoch- und herunterskaliert werden. Die Plattform unterstützt auch die Skalierung nach oben oder unten, um unterschiedliche Hostinganforderungen zu erfüllen.
  • Identitätsverwaltung: Verwenden Sie Microsoft Entra ID als Ihre Identitäts- und Zugriffsverwaltungslösung. Relecloud hat sich aus den folgenden Gründen für Microsoft Entra ID entschieden:

    • Authentifizierung und Autorisierung: Die Anwendung muss Mitarbeitende eines Callcenters authentifizieren und autorisieren.
    • Skalierbarkeit: Die Lösung kann skaliert werden, um größere Szenarien zu unterstützen.
    • Steuerung der Identitäten der Benutzer*innen: Mitarbeitende des Callcenters können ihre vorhandenen Unternehmensidentitäten verwenden.
    • Unterstützung des Autorisierungsprotokolls: Die Lösung 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 Datenspeicher Die Web-App von Relecloud hat SQL Server lokal verwendet. Daher wollten sie das vorhandene Datenbankschema, gespeicherte Prozeduren und Funktionen verwenden. Auf Azure sind verschiedene SQL-Produkte verfügbar. Relecloud hat sich jedoch aus den folgenden Gründen für Azure SQL-Datenbank entschieden:

    • Zuverlässigkeit: Die Dienstebene „Universell“ bietet ein hohes SLA-Niveau und multiregionale Redundanz. Es ist für eine hohe Benutzerauslastung geeignet.
    • Reduzierung des Verwaltungsaufwands: Der Dienst stellt eine verwaltete SQL-Datenbankinstanz bereit.
    • Migrationsunterstützung: Der Dienst unterstützt die Datenbankmigration von einer lokalen SQL Server-Installation.
    • Konsistenz mit lokalen Konfigurationen: Der Dienst unterstützt die vorhandenen gespeicherten Prozeduren, Funktionen und Ansichten.
    • Resilienz: Der Dienst unterstützt Sicherungen und die Zeitpunktwiederherstellung.
    • Wissen und minimale Nacharbeit: Für Azure SQL-Datenbank kann das interne Wissen verwendet werden, und der Arbeitsaufwand für die Einführung ist minimal.
  • Anwendungsleistungsüberwachung: Verwenden Sie Application Insights, um die Telemetrie in Ihrer Anwendung zu analysieren. Relecloud hat sich aus den folgenden Gründen für die Verwendung von Application Insights entschieden:

    • Integration in Azure Monitor: Die Lösung bietet die beste Integration in Azure Monitor.
    • Anomalieerkennung: Die Lösung erkennt automatisch Leistungsanomalien.
    • Fehlerbehebung: Die Lösung unterstützt Sie bei der Diagnose von Problemen in der ausgeführten App.
    • Überwachung: Die Lösung sammelt Informationen zur App-Nutzung der Benutzer*innen und ermöglicht die mühelose Nachverfolgung benutzerdefinierter Ereignisse.
    • Transparenzlücke: Die lokale Lösung verfügte über keine Lösung für die Überwachung der Anwendungsleistung. Application Insights bietet eine einfache Integration in die Anwendungsplattform und in den Code.
  • Cache: Legen Sie fest, ob der Web-App-Architektur ein Zwischenspeicher hinzugefügt werden soll. Azure Cache for Redis ist die primäre Zwischenspeicherlösung von Azure. Es handelt sich um einen verwalteten In-Memory-Datenspeicher auf der Basis der Redis-Software. Das Laden der Web-App von Relecloud ist stark in Richtung der Anzeige von Konzerten und Veranstaltungsortdetails verzerrt und hat Azure Cache für Redis aus den folgenden Gründen hinzugefügt:

    • Reduzierung des Verwaltungsaufwands: Es handelt sich um einen vollständig verwalteten Dienst.
    • Geschwindigkeit und Volumen: Azure Cache for Redis bietet einen hohen Datendurchsatz und Lesevorgänge mit geringer Latenz für häufig abgerufene Daten, die sich nur langsam ändern.
    • Vielfältige Unterstützung: Azure Cache for Redis ist ein konsolidierter Zwischenspeicher, der von allen Instanzen der Web-App verwendet werden kann.
    • Externer Datenspeicher: Die lokalen Anwendungsserver führten eine lokale Zwischenspeicherung von Daten auf den virtuellen Computern aus. Bei diesem Setup wurden häufig verwendete Daten nicht ausgelagert, und Daten konnten nicht ungültig gemacht werden.
    • Nicht fixierte Sitzungen: Die Externalisierung des Sitzungszustands unterstützt nicht fixierte Sitzungen.
  • Load Balancer: Webanwendungen, die PaaS-Lösungen verwenden, sollten Azure Front Door, Azure Application Gateway oder beide basierend auf Web-App-Architektur und -Anforderungen verwenden. Verwenden Sie die Entscheidungsstruktur des Load Balancer , um das richtige Lastenausgleichsmodul auszuwählen. Relecloud benötigte einen Layer-7-Load Balancer, der den Datenverkehr durch mehrere Regionen leiten kann. Relecloud benötigte eine multiregionale Web-App, um das SLO von 99,9 % zu erreichen. Relecloud hat sich aus den folgenden Gründen für Azure Front Door entschieden:

    • Globaler Lastenausgleich: Es handelt sich um einen Layer-7-Load Balancer, der den Datenverkehr durch mehrere Regionen leiten kann.
    • Web Application Firewall: Der Load Balancer kann nativ in Azure Web Application Firewall integriert werden.
    • Flexibilität beim Routing: Der Load Balancer ermöglicht dem Anwendungsteam die Konfiguration der Anforderungen an den eingehenden Datenverkehr, um zukünftige Änderungen in der Anwendung zu unterstützen.
    • Beschleunigung des Datenverkehrs: Der Load Balancer verwendet Anycast, um den nächstgelegenen Azure Point of Presence (PoP) zu erreichen und die schnellste Route zur Web-App zu finden.
    • Angepasste Domänen: Der Load Balancer unterstützt angepasste Domänennamen mit flexibler Domänenvalidierung.
    • Integritätstests: Die Anwendung benötigt eine intelligente Überwachung mittels Integritätstests. Azure Front Door ermittelt anhand der Ergebnisse des Tests den besten Ursprung für die Weiterleitung Ihrer Clientanforderungen.
    • Unterstützung der Überwachung: Der Load Balancer unterstützt integrierte Berichte mit einem zentralen Dashboard für Front Door und Sicherheitsmuster. Sie können Warnungen konfigurieren, die in Azure Monitor integriert werden. Die Anwendung kann jede Anforderung sowie fehlerhafte Integritätstests protokollieren.
    • DDoS-Schutz: Der Load Balancer verfügt über integrierten DDoS-Schutz für Layer 3 und 4.
    • Netzwerk zur Bereitstellung von Inhalten: Der Load Balancer ermöglicht Relecloud die Verwendung eines Netzwerk zur Bereitstellung von Inhalten. Das Netzwerk zur Bereitstellung von Inhalten ermöglicht die Beschleunigung der Website.
  • Web Application Firewall: Verwenden Sie Azure Web Application Firewall, um zentralisierten Schutz vor gängigen Exploits und Sicherheitsrisiken für Ihre Webanwendungen bereitzustellen. Relecloud hat sich aus den folgenden Gründen für Azure Web Application Firewall entschieden:

    • Globaler Schutz: Web Application Firewall bietet einen verbesserten globalen Schutz für die Web-App, ohne dass die Leistung beeinträchtigt wird.
    • Botnet-Schutz: Dem Team stehen Überwachungs- und Konfigurationseinstellungen zur Behandlung von Sicherheitsbedenken im Zusammenhang mit Botnets zur Verfügung.
    • Parität mit der lokalen Umgebung: Die lokale Lösung wurde hinter einer Webanwendungsfirewall ausgeführt, die von der IT verwaltet wurde.
    • Benutzerfreundlichkeit: Web Application Firewall kann in Azure Front Door integriert werden.
  • Konfigurationsspeicher: Legen Sie fest, ob Ihrer Web-App ein App-Konfigurationsspeicher hinzugefügt werden soll. Azure App Configuration ist ein Dienst zur zentralen Verwaltung von Anwendungseinstellungen und Featureflags. Machen Sie sich mit bewährten Methoden für Azure App Configuration vertraut, um zu entscheiden, ob dieser Dienst für Ihre App geeignet ist. Relecloud wollte die dateibasierte Konfiguration durch einen zentralen Konfigurationsspeicher ersetzen, der in die Anwendungsplattform und in den Code integriert werden kann. Das Unternehmen hat sich aus den folgenden Gründen für App Configuration entschieden:

    • Flexibilität: Die Lösung unterstützt Featureflags. Featureflags ermöglichen es Benutzern, Features einer frühen Vorschauversion in einer Produktionsumgebung zu aktivieren und zu deaktivieren, ohne die App erneut bereitstellen zu müssen.
    • Unterstützung der Git-Pipeline: Bei der Source of Truth für Konfigurationsdaten musste es sich um ein Git-Repository handeln. Die Pipeline musste die Daten im zentralen Konfigurationsspeicher aktualisieren.
    • Unterstützung verwalteter Identitäten: App Configuration unterstützt verwaltete Identitäten, um die Verbindung zum Konfigurationsspeicher zu vereinfachen und zu schützen.
  • Geheimnisverwaltung: Verwenden Sie Azure Key Vault, wenn Sie geheime Schlüssel in Azure verwalten müssen. Key Vault kann mithilfe des ConfigurationBuilder-Objekts in .NET-Apps integriert werden. Die lokale Web-App von Relecloud speicherte Geheimnisse in Code-Konfigurationsdateien, aber es ist eine bessere Sicherheitspraxis, Geheimnisse an einem Ort zu speichern, der RBAC und Audit-Kontrollen unterstützt. Während verwaltete Identitäten die bevorzugte Lösung für die Verbindung zu Azure-Ressourcen sind, musste Relecloud auch Anwendungsgeheimnisse verwalten. Relecloud hat sich aus den folgenden Gründen für Key Vault entschieden:

    • Verschlüsselung: Key Vault unterstützt die Verschlüsselung im Ruhezustand und während der Übertragung.
    • Unterstützung verwalteter Identitäten: Die Anwendungsdienste können verwaltete Identitäten verwenden, um auf den Geheimnisspeicher zuzugreifen.
    • Überwachung und Protokollierung: Key Vault unterstützt den Überwachungszugriff und generiert Warnungen, wenn gespeicherte Geheimnisse geändert werden.
    • Integration: Key Vault bietet eine native Integration mit dem Azure-Konfigurationsspeicher (App Configuration) und der Webhostingplattform (App Service).
  • Speicherlösung: Überprüfen Sie die Azure-Speicheroptionen, um die richtige Speicherlösung basierend auf Ihren Anforderungen zu wählen. In der lokalen Web-App von Relecloud gab es auf jedem Webserver einen Datenträgerspeicher. Das Team wollte jedoch eine externe Datenspeicherlösung verwenden. Relecloud hat sich aus den folgenden Gründen für Azure Blob Storage entschieden:

    • Sicherer Zugriff: Die Web-App kann Endpunkte ausschließen, die über das öffentliche Internet mit anonymem Zugriff auf den Speicher zugreifen.
    • Verschlüsselung: Blob Storage verschlüsselt Daten im Ruhezustand und während der Übertragung.
    • Resilienz: Blob Storage unterstützt den zonenredundanten Speicher (ZRS). Zonenredundanter Speicher repliziert Ihre Daten synchron in drei Azure-Verfügbarkeitszonen in der primären Region. Jede Verfügbarkeitszone ist ein getrennter physischer Standort mit unabhängiger Stromversorgung und Kühlung sowie mit einem unabhängigen Netzwerk. Diese Konfiguration sollte die Ticket-Images vor Verlust schützen.
  • Endpunktsicherheit: Verwenden Sie Azure Private Link, um den Zugriff auf Platform-as-a-Service-Lösungen über einen privaten Endpunkt in Ihrem virtuellen Netzwerk bereitzustellen. Datenverkehr zwischen Ihrem virtuellen Netzwerk und dem Dienst wird über das Microsoft-Backbone-Netzwerk übertragen. Relecloud hat sich aus den folgenden Gründen für Private Link entschieden:

    • Verbesserte Sicherheit für die Kommunikation: Private Link ermöglicht den privaten Zugriff der Anwendung auf Dienste auf der Azure-Plattform und reduziert die Netzwerkausdehnung von Datenspeichern zum Schutz vor Datenlecks.
    • Minimaler Aufwand: Die privaten Endpunkte unterstützen die von der Web-App verwendete Web-App- und Datenbankplattform. Beide Plattformen spiegeln vorhandene lokale Konfigurationen, sodass nur minimale Änderungen erforderlich sind.
  • Netzwerksicherheit: Verwenden Sie Azure Firewall, um ein- und ausgehenden Datenverkehr auf Netzwerkebene zu steuern. Verwenden Sie Azure Bastion für die sichere Verbindung zu virtuellen Computern, ohne dass RDP/SSH-Ports verfügbar werden. Relecloud führte eine Hub-Spoke-Netzwerktopologie ein und wollte gemeinsam genutzte Netzwerksicherheitsdienste im Hub platzieren. Azure Firewall verbessert die Sicherheit durch die Überprüfung des gesamten ausgehenden Datenverkehrs aus den Speichen, um die Netzwerksicherheit zu erhöhen. Relecloud benötigte Azure Bastion für sichere Bereitstellungen über einen Bastion Host im DevOps-Subnetz.

Anleitung zum Code

Um eine Web-App erfolgreich in die Cloud zu verschieben, müssen Sie Ihren Web-App-Code mit den Wiederholungs-, Circuit-Breaker- und Cache-Aside-Mustern aktualisieren.

Diagramm, das die Rolle der Entwurfsmuster in der wesentlichen zuverlässigen Web-App-Architektur zeigt.

Abbildung 3. Rolle der Entwurfsmuster.

Jedes Entwurfsmuster bietet Workloadentwurfsvorteile, die sich an einer von mehreren Säulen des Well-Architected Framework orientieren. Hier ist eine Übersicht über die Muster, die Sie implementieren sollten:

  1. Wiederholungsmuster: Das Wiederholungsmuster behandelt vorübergehende Fehler durch Wiederholungsvorgänge, die zeitweise fehlschlagen können. Implementieren Sie dieses Muster für alle ausgehenden Aufrufe an andere Azure-Dienste.

  2. Circuit Breaker-Muster: Das Circuit Breaker-Muster verhindert, verhindert, dass eine Anwendung Vorgänge erneut versucht, die nicht vorübergehend sind. Implementieren Sie dieses Muster in allen ausgehenden Aufrufen an andere Azure-Dienste.

  3. Cache-Aside-Muster: Das Cache-Aside-Muster fügt Daten häufiger zu einem Cache hinzu und ruft sie häufiger aus einem Cache ab als ein Datenspeicher. Implementieren Sie dieses Muster für Anforderungen an die Datenbank.

Entwurfsmuster Zuverlässigkeit (Reliability, RE) Sicherheit (Security, SE) Kostenoptimierung (Cost Optimization, CO) Erstklassige Betriebsprozesse (Operational Excellence, OE) Leistungseffizienz (Performance Efficiency, PE) Unterstützung von WAF-Prinzipien
Wiederholungsmuster RE:07
Circuit-Breaker-Muster RE:03
RE:07
PE:07
PE:11
Cache-Aside-Muster RE:05
PE:08
PE:12

Implementieren des Wiederholungsmusters

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 werden in der Regel innerhalb von Sekunden behoben. Mit dem Wiederholungsmuster können Sie fehlgeschlagene Anforderungen erneut senden. Außerdem können Sie die Anforderungsverzögerungen und die Anzahl der Versuche konfigurieren, bevor ein Fehler akzeptiert wird.

  • Verwenden der integrierten Wiederholungsmechanismen Nutzen Sie den integrierten Wiederholungsmechanismus, den die meisten Azure-Dienste zum Beschleunigen der Implementierung verwenden müssen. Beispiel: Die Referenzimplementierung verwendet die Verbindungsresilienz in Entity Framework Core, um das Wiederholungsmuster auf Anfragen für Azure SQL-Datenbank anzuwenden (siehe folgenden Code).

    services.AddDbContextPool<ConcertDataContext>(options => options.UseSqlServer(sqlDatabaseConnectionString,
        sqlServerOptionsAction: sqlOptions =>
        {
            sqlOptions.EnableRetryOnFailure(
            maxRetryCount: 5,
            maxRetryDelay: TimeSpan.FromSeconds(3),
            errorNumbersToAdd: null);
        }));
    
  • Verwenden Sie Wiederholungsprogrammierungsbibliotheken. Integrieren Sie für die HTTP-Kommunikation eine Standardresilienzbibliothek wie Polly oder Microsoft.Extensions.Http.Resilience. Diese Bibliotheken bieten umfassende Wiederholungsmechanismen, die für die Verwaltung der Kommunikation mit externen Webdiensten von entscheidender Bedeutung sind. Beispielsweise verwendet die Referenzimplementierung Polly, um das Wiederholungsmuster jedes Mal zu erzwingen, wenn der Code ein Objekt erstellt, das das IConcertSearchService Objekt aufruft (siehe folgenden Code).

    private void AddConcertSearchService(IServiceCollection services)
    {
        var baseUri = Configuration["App:RelecloudApi:BaseUri"];
        if (string.IsNullOrWhiteSpace(baseUri))
        {
            services.AddScoped<IConcertSearchService, MockConcertSearchService>();
        }
        else
        {
            services.AddHttpClient<IConcertSearchService, RelecloudApiConcertSearchService>(httpClient =>
            {
                httpClient.BaseAddress = new Uri(baseUri);
                httpClient.DefaultRequestHeaders.Add(HeaderNames.Accept, "application/json");
                httpClient.DefaultRequestHeaders.Add(HeaderNames.UserAgent, "Relecloud.Web");
            })
            .AddPolicyHandler(GetRetryPolicy())
            .AddPolicyHandler(GetCircuitBreakerPolicy());
        }
    }
    
    private static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
    {
        var delay = Backoff.DecorrelatedJitterBackoffV2(TimeSpan.FromMilliseconds(500), retryCount: 3);
        return HttpPolicyExtensions
          .HandleTransientHttpError()
          .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
          .WaitAndRetryAsync(delay);
    }
    

Implementieren des Trennschaltermusters

Verwenden Sie das Circuit Breaker-Muster, um Dienstunterbrechungen zu behandeln, bei denen es sich nicht um vorübergehende Fehler handelt. Das Wiederholungsmuster verhindert, dass eine Anwendung kontinuierlich versucht, auf einen nicht reagierenden Dienst zuzugreifen. Es gibt die Anwendung frei und vermeidet die Veröffentlichung von CPU-Zyklen, damit die Leistungsintegrität der Anwendung für Endbenutzer erhalten bleibt.

Die Referenzimplementierung wendet z. B. das Circuit Breaker-Muster auf alle Anforderungen an die API an. Sie verwendet die HandleTransientHttpError-Logik, um HTTP-Anforderungen zu erkennen, die sicher wiederholt werden können, begrenzt aber die Anzahl der aggregierten Fehler über einen bestimmten Zeitraum (siehe folgenden Code).

private static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
}

Impelementieren des Cache-Aside-Musters

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 Konsistenz zwischen dem Zwischenspeicher und einem persistenten Speicher her, z. B. einer Datenbank. Dies verkürzt die Reaktionszeiten, verbessert den Durchsatz und reduziert die Notwendigkeit für eine weitere Skalierung. Außerdem wird die Auslastung des primären Datenspeichers reduziert, 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 von Cache. Produktionsanwendungen sollten den verteilten Redis-Cache verwenden, da er die Leistung verbessert, indem er Datenbankabfragen reduziert, und nicht fixierte Sitzungen ermöglicht, sodass der Load Balancer den Datenverkehr gleichmäßig verteilen kann. Die Referenzimplementierung verwendet beispielsweise den verteilten Redis-Cache. Die AddAzureCacheForRedis-Methode konfiguriert die Anwendung für die Verwendung von Azure Cache for Redis (siehe folgenden Code).

    private void AddAzureCacheForRedis(IServiceCollection services)
    {
        if (!string.IsNullOrWhiteSpace(Configuration["App:RedisCache:ConnectionString"]))
        {
            services.AddStackExchangeRedisCache(options =>
            {
                options.Configuration = Configuration["App:RedisCache:ConnectionString"];
            });
        }
        else
        {
            services.AddDistributedMemoryCache();
        }
    }
    
  • Zwischenspeichern von Daten mit hohem Bedarf. Wenden Sie das Cache-Aside-Muster auf Daten mit hohem Bedarf an, um ihre Effektivität zu verstärken. Verwenden Sie Azure Monitor, um die CPU, den Arbeitsspeicher und den Speicher der Datenbank nachzuverfolgen. Anhand dieser Metriken können Sie bestimmen, ob Sie nach dem Anwenden des Cache-Aside-Musters eine kleinere Datenbank-SKU verwenden können. Beispiel: Die Referenzimplementierung speichert die Daten mit hohem Bedarf für die Seite „Bevorstehende Konzerte“ zwischen. Die GetUpcomingConcertsAsync-Methode ruft Daten aus dem SQL-Datenbank in den Redis-Cache ab und füllt den Cache mit den neuesten Konzertdaten auf (siehe folgenden Code).

    public async Task<ICollection<Concert>> GetUpcomingConcertsAsync(int count)
    {
        IList<Concert>? concerts;
        var concertsJson = await this.cache.GetStringAsync(CacheKeys.UpcomingConcerts);
        if (concertsJson != null)
        {
            // There is cached data. Deserialize the JSON data.
            concerts = JsonSerializer.Deserialize<IList<Concert>>(concertsJson);
        }
        else
        {
            // There's nothing in the cache. Retrieve data 
            // from the repository and cache it for one hour.
            concerts = await this.database.Concerts.AsNoTracking()
                .Where(c => c.StartTime > DateTimeOffset.UtcNow && c.IsVisible)
                .OrderBy(c => c.StartTime)
                .Take(count)
                .ToListAsync();
            concertsJson = JsonSerializer.Serialize(concerts);
            var cacheOptions = new DistributedCacheEntryOptions {
                AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
            };
            await this.cache.SetStringAsync(CacheKeys.UpcomingConcerts, concertsJson, cacheOptions);
        }
        return concerts ?? new List<Concert>();
    }
    
  • Cachedaten auf dem neuesten Stand halten. 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. Beispielsweise speichert die Referenzimplementierung Daten nur eine Stunde lang zwischen und verwendet die CreateConcertAsync-Methode, um den Cacheschlüssel zu löschen, wenn sich die Daten ändern (siehe folgenden Code).

    public async Task<CreateResult> CreateConcertAsync(Concert newConcert)
    {
        database.Add(newConcert);
        await this.database.SaveChangesAsync();
        this.cache.Remove(CacheKeys.UpcomingConcerts);
        return CreateResult.SuccessResult(newConcert.Id);
    }
    
  • Sicherstellen der Datenkonsistenz. 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: Die Referenzimplementierung verwendet die Methode UpdateConcertAsync, um die Daten im Zwischenspeicher konsistent zu halten (siehe folgenden Code).

    public async Task<UpdateResult> UpdateConcertAsync(Concert existingConcert), 
    {
       database.Update(existingConcert);
       await database.SaveChangesAsync();
       this.cache.Remove(CacheKeys.UpcomingConcerts);
       return UpdateResult.SuccessResult();
    }
    

Anleitung zur Konfiguration

In den folgenden Abschnitten finden Sie Anleitungen zum Implementieren der Konfigurationsupdates. Jeder Abschnitt richtet sich an einer oder mehreren Säulen des Well-Architected Frameworks aus.

Konfiguration Zuverlässigkeit (Reliability, RE) Sicherheit (Security, SE) Kostenoptimierung (Cost Optimization, CO) Erstklassige Betriebsprozesse (Operational Excellence, OE) Leistungseffizienz (Performance Efficiency, PE) Unterstützung von WAF-Prinzipien
Konfigurieren der Benutzerauthentifizierung & -autorisierung SE:05
OE:10
Implementieren verwalteter Identitäten SE:05
OE:10
Umgebungen in der richtigen Größe CO:05
CO:06
Implementieren automatischer Skalierung RE:06
CO:12
PE:05
Automatische Ressourcenbereitstellung OE:05
Implementieren von Überwachung OE:07
PE:04

Konfigurieren der Benutzerauthentifizierung und -autorisierung

Wenn Sie Webanwendungen zu Azure migrieren, konfigurieren Sie die Benutzerauthentifizierungs- und Autorisierungsmechanismen. Befolgen Sie die nachstehenden Empfehlungen:

  • Verwenden Sie eine Identitätsplattform. Verwenden Sie die Microsoft Identity-Plattform, 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.

  • Erstellen Sie eine -App-Registrierung. 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.

  • Verwenden Sie Plattformfeatures. Minimieren Sie die Notwendigkeit von benutzerdefiniertem Authentifizierungscode, indem Sie Plattformfunktionen verwenden, um Benutzer zu authentifizieren und auf Daten zuzugreifen. Beispiel: App Service verfügt über integrierte Authentifizierungs- und Autorisierungsunterstützung, sodass Sie für die Benutzeranmeldung und den Zugriff auf Daten in Ihrer Web-App nur wenig oder gar keinen Code schreiben müssen.

  • 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.

  • Ziehen Sie temporären Zugriff auf den Speicher vor. Verwenden Sie temporäre Berechtigungen, um sich vor unbefugtem Zugriff und Verstößen, wie Shared Access Signatures (SASs) zu schützen. Verwenden Sie SASs für die Benutzerdelegierung, um bei der Gewährung eines temporären Zugriffs die Sicherheit zu maximieren. Dies ist die einzige SAS, die Microsoft Entra ID-Anmeldeinformationen verwendet und keinen permanenten Speicherkontoschlüssel erfordert.

  • Erzwingen Sie die Autorisierung in Azure. Verwenden Sie Azure RBAC, um Benutzeridentitäten am wenigsten Berechtigungen zuzuweisen. Azure RBAC bestimmt, auf welche Azure-Ressourcen die Identitäten einen Zugriff haben, welche Aktionen sie für diese Ressourcen ausführen und auf welche Bereiche sie zugreifen können.

  • Vermeiden Sie dauerhaft erhöhte Berechtigungen. Verwenden Sie Microsoft Entra Privileged Identity Management, um Just-in-Time-Zugriff für privilegierte Vorgänge zu gewähren. Entwickler benötigen beispielsweise häufig Zugriff auf die Administratorebene, um Datenbanken zu erstellen/zu löschen, Tabellenschemas zu ändern und Benutzerberechtigungen zu ändern. Mit einem Just-in-Time-Zugriff erhalten Benutzeridentiäten temporäre Berechtigungen für die Ausführung privilegierter Aufgaben.

Implementieren verwalteter Identitäten

Verwenden Sie verwaltete Identitäten für alle Azure-Dienste, die verwaltete Identitäten unterstützen. Eine verwaltete Identität ermöglicht Azure-Ressourcen (Workloadidentitäten), sich bei anderen Azure-Diensten zu authentifizieren und mit anderen Azure-Diensten zu interagieren, ohne Anmeldeinformationen zu verwalten. Hybrid- und Legacysysteme können lokale Authentifizierungslösungen beibehalten, um die Migration zu vereinfachen, sollten aber so schnell wie möglich zu verwalteten Identitäten wechseln. Befolgen Sie die folgenden Empfehlungen, um verwaltete Identitäten zu implementieren:

  • Wählen Sie den richtigen Typ der verwalteten Identität aus. Ziehen Sie vom Benutzer zugewiesene verwaltete Identitäten vor, wenn Sie über zwei oder mehr Azure-Ressourcen verfügen, die denselben Satz von Berechtigungen benötigen. Diese Einrichtung 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 die Berechtigungen zu gewähren, 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. Wenn Azure RBAC ein bestimmtes Szenario nicht abdeckt, ergänzen Sie Azure RBAC mit Zugriffsrichtlinien auf der Azure-Dienstebene.

  • Sichern Sie verbleibende geheime Schlüssel. Speichern Sie alle verbleibenden geheimen Schlüssel in Azure Key Vault. Laden Sie Geheimnisse aus Key Vault beim Starten der Anwendung, nicht während jeder einzelnen HTTP-Anforderung. Der Hochfrequenzzugriff innerhalb von HTTP-Anforderungen kann die Transaktionsgrenzen von Key Vault überschreiten. Speichern Sie Anwendungskonfigurationen in Azure App Configuration.

Die Referenzimplementierung verwendet z. B. das Authentication-Argument in der SQL-Datenbank-Verbindungszeichenfolge, damit App Service eine Verbindung mit der SQL-Datenbank mit einer verwalteten Identität herstellen kann: Server=tcp:my-sql-server.database.windows.net,1433;Initial Catalog=my-sql-database;Authentication=Active Directory Default. Sie verwendet DefaultAzureCredential, um zuzulassen, dass die Web-API mithilfe einer verwalteten Identität eine Verbindung mit Key Vault herstellt (siehe folgenden Code).

    builder.Configuration.AddAzureAppConfiguration(options =>
    {
         options
            .Connect(new Uri(builder.Configuration["Api:AppConfig:Uri"]), new DefaultAzureCredential())
            .ConfigureKeyVault(kv =>
            {
                // Some of the values coming from Azure App Configuration
                // are stored in Key Vault. Use the managed identity
                // of this host for the authentication.
                kv.SetCredential(new DefaultAzureCredential());
            });
    });

Umgebungen in der richtigen Größe

Verwenden Sie die Leistungsstufen (SKUs) von Azure-Diensten, die die Anforderungen jeder Umgebung erfüllen, ohne dass sie übermäßig groß sind. Um Ihre Umgebungen auf die richtige Größe zu bringen, befolgen Sie diese Empfehlungen:

  • Schätzen der Kosten Mit dem Azure-Preisrechner können Sie die Kosten für jede Umgebung abschätzen.

  • Kostenoptimierung in Produktionsumgebungen. 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. Überwachen Sie die Ressourcenauslastung kontinuierlich, und passen Sie SKUs an die tatsächlichen Leistungsanforderungen an.

  • Kostenoptimierung von Vorproduktionsumgebungen. Vorproduktionsumgebungen sollten Ressourcen mit niedrigeren Kosten verwenden, nicht benötigte Dienste deaktivieren und Rabatte wie Azure Dev/Test-Preise anwenden. Stellen Sie sicher, dass Vorproduktionsumgebungen der Produktion ausreichend ähnlich sind, um Risiken zu vermeiden. Diese Balance sorgt dafür, dass Tests wirksam bleiben, ohne unnötige Kosten entstehen zu lassen.

  • Definieren Sie SKUs mithilfe der Infrastruktur als Code (IaC). 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 verwendet z. B. Bicep-Parameter, um teurere Ebenen (SKUs) in der Produktionsumgebung bereitzustellen.

    var redisCacheSkuName = isProd ? 'Standard' : 'Basic'
    var redisCacheFamilyName = isProd ? 'C' : 'C'
    var redisCacheCapacity = isProd ? 1 : 0

Implementieren automatischer 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 horizontale Skalierung. Verwenden Sie Azure-Autoskalierung 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. Beginnen Sie mit der CPU-Auslastung als ersten Skalierungsauslöser, wenn Sie mit den Skalierungsanforderungen Ihrer Anwendung nicht vertraut sind. Verfeinern Sie Ihre Skalierungstrigger, um weitere Metriken wie RAM, Netzwerkdurchsatz und Datenträger-E/A einzuschließen. Das Ziel besteht darin, das Verhalten Ihrer Webanwendung für eine bessere Leistung anzupassen.

  • Stellen Sie einen Skalierungspuffer bereit. Stellen Sie Ihre Skalierungsschwellen so ein, dass sie vor Erreichen der maximalen Kapazität ausgelöst werden. Konfigurieren Sie die Skalierung beispielsweise so, dass sie bei einer CPU-Auslastung von 85 % erfolgt, anstatt zu warten, bis sie 100 % erreicht. Dieser proaktive Ansatz trägt dazu bei, die Leistung aufrechtzuerhalten und potenzielle Engpässe zu vermeiden.

Automatische Ressourcenbereitstellung

Verwenden Sie die Automatisierung, um Azure-Ressourcen und -Code in allen Umgebungen bereitzustellen und zu aktualisieren. Befolgen Sie die nachstehenden Empfehlungen:

  • Verwenden Sie Infrastructure-as-Code. Stellen Sie Infrastructure-as-Code über CI/CD-Pipelines (Continuous Integration und Continuous Delivery) bereit. Azure verfügt über vorgefertigte Vorlagen für Bicep, ARM (JSON) und Terraform für jede Azure-Ressource.

  • Verwenden SIe eine Pipeline für Continuous Integration (CI) bzw. Continuous Deployment (CD) Verwenden Sie eine CI/CD-Pipeline, um Code aus der Quellcodeverwaltung in Ihren verschiedenen Umgebungen bereitzustellen, z. B. 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 innerhalb Ihrer Pipeline, bevor Sie eine Bereitstellung für App Services durchführen. Integrieren Sie Codequalitäts- und Abdeckungstools wie SonarQube, um eine umfassende Testabdeckung zu erzielen.

  • Verwenden Sie ein Simulationsframework. Verwenden Sie Simulationsframeworks 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.

Implementieren von Überwachung

Implementieren Sie die 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:

  • Sammeln Sie Anwendungstelemetriedaten. Verwenden Sie die die automatische Instrumentierung in Azure Application Insights, um Telemetriedaten der Anwendung zu sammeln, z. B. Anforderungsdurchsatz, durchschnittliche Anforderungsdauer, Fehler und Abhängigkeitsüberwachung, ohne Codeänderungen.

    Die Referenzimplementierung verwendet AddApplicationInsightsTelemetry aus dem NuGet-Paket Microsoft.ApplicationInsights.AspNetCore zum Aktivieren der Telemetriesammlung (siehe folgenden Code).

    public void ConfigureServices(IServiceCollection services)
    {
       ...
       services.AddApplicationInsightsTelemetry(Configuration["App:Api:ApplicationInsights:ConnectionString"]);
       ...
    }
    
  • Erstellen Sie benutzerdefinierte Anwendungsmetriken. Verwenden Sie die codebasierte Instrumentierung für benutzerdefinierte Telemetriedaten. Fügen Sie ihrem Code das Application Insights SDK hinzu, und verwenden Sie die Application Insights-API.

    Die Referenzimplementierung sammelt Telemetriedaten zu Ereignissen, die sich auf die Warenkorbaktivität beziehen. this.telemetryClient.TrackEvent zählt die Tickets, die dem Warenkorb hinzugefügt wurden. Er stellt den Ereignisnamen (AddToCart) bereit und gibt ein Wörterbuch mit concertId und count an (siehe folgenden Code).

    this.telemetryClient.TrackEvent("AddToCart", new Dictionary<string, string> {
        { "ConcertId", concertId.ToString() },
        { "Count", count.ToString() }
    });
    
  • Überwachen Sie die Plattform. Aktivieren Sie die Diagnose für alle unterstützten Dienste, und senden Sie Diagnosen 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.

Bereitstellen der Referenzimplementierung

Die Referenzimplementierung führt Entwickler durch eine simulierte Migration von einer lokalen ASP.NET-Anwendung zu Azure, wobei die erforderlichen Änderungen während der ersten Einführungsphase hervorgehoben werden. In diesem Beispiel wird eine Konzertticketing-Anwendung für das fiktive Unternehmen Relecloud verwendet, das Tickets über seine lokale Webanwendung verkauft. Relecloud legt die folgenden Ziele für ihre Webanwendung fest:

  • Implementieren kostengünstiger, aber hochwertiger Codeänderungen
  • Erreichen eines Servicelevel-Ziels (Service Level Objective, SLO) von 99,9 %
  • Einführung von DevOps-Verfahren
  • Entwicklung kostenoptimierter Umgebungen
  • Verbesserung von Zuverlässigkeit und Sicherheit

Relecloud hat festgestellt, dass seine lokale Infrastruktur keine kostengünstige Lösung für das Erreichen dieser Ziele darstellte. Das Unternehmen kam zu dem Schluss, dass die Migration ihrer CAMS-Webanwendung zu Azure die kostengünstigste Möglichkeit war, die unmittelbaren und zukünftigen Ziele zu erreichen. Die folgende Architektur stellt den Endzustand der Implementierung des zuverlässigen Web-App-Musters von Relecloud dar.

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