Bearbeiten

Freigeben über


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

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

Dieser Artikel enthält Anleitungen für die Implementierung des zuverlässigen Web App-Musters. Dieses Muster beschreibt, wie Web-Apps für die Cloudmigration geändert werden (Replatform). Es stellt präscriptive Architektur, Code und Konfigurationsanleitungen bereit, die den Prinzipien des Azure 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 ist eine Reihe von Prinzipien und Implementierungstechniken, die definieren, wie Sie Web-Apps replatformieren sollten, wenn Sie sie in die Cloud migrieren. Es führt nur die Codeupdates durch, die für eine erfolgreiche Ausführung in der Cloud benötigt werden. Die folgende Anleitung verwendet eine Referenzimplementierung als Beispiel. Die Anleitung folgt der Replatform-Reise des fiktiven Unternehmens Relecloud, um Geschäftskontext für Ihre Reise zu bieten. Vor der Implementierung des Zuverlässigen Web App-Musters für .NET hatte Relecloud 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 Reliable 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 für die Implementierung des zuverlässigen Web App-Musters. Verwenden Sie die folgenden Links, um zu den spezifischen Anleitungen zu wechseln, die Sie benötigen:

  • Geschäftskontext. Richten Sie diese Anleitung mit Ihrem Geschäftskontext aus, und erfahren Sie, wie Sie sofortige und langfristige Ziele definieren, die die Umformung von Entscheidungen fördern.
  • Architekturleitfaden. Erfahren Sie, wie Sie die richtigen Clouddienste auswählen und eine Architektur entwerfen, die Ihren Geschäftsanforderungen entspricht.
  • Codeleitfaden. Implementieren Sie drei Entwurfsmuster, um die Zuverlässigkeit und Leistungsfähigkeit Ihrer Web-App in der Cloud zu verbessern: "Wiederholen", "Schaltschalter" und Cache-Aside Muster.
  • Konfigurationsleitfaden. Konfigurieren von Authentifizierung und Autorisierung, verwalteten Identitäten, rechteisierten Umgebungen, Infrastruktur als Code und Ü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 (Service Level Objectives, SLO) 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:

  • Wenden Sie kostengünstige Codeänderungen mit hohem Wert an.
  • Erreichen Sie einen SLO von 99,9%.
  • Übernehmen Sie DevOps-Methoden.
  • Erstellen Sie kostenoptimierte Umgebungen.
  • Verbessern Sie Zuverlässigkeit und Sicherheit.

Die lokale Infrastruktur von Relecloud bot keine kostengünstige Lösung, um diese Ziele zu erreichen. Sie haben beschlossen, dass die Migration ihrer Webanwendung zu Azure die kostengünstigste Möglichkeit war, ihre 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 bösartigen HTTP-Datenverkehrs und eines Lastenausgleichs zum Weiterleiten und Schützen 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 so, dass Ihre Wiederherstellungsmetrikenunterstützt werden, z. B. Ihr Wiederherstellungszeitziel (RTO) und das Wiederherstellungspunktziel (Recovery Point Objective, RPO). 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.

  • Entscheiden Sie sich für die Zuverlässigkeit der Infrastruktur. Ermitteln Sie, wie viele Verfügbarkeitszonen und Regionen Ihre Verfügbarkeitsanforderungen erfüllen müssen. 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 erfordern dieselben Dienste, mit Ausnahme einer Region, ein virtuelles Hubnetzwerk, 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 mit verbesserter Sicherheit 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 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, sollten Sie Azure-Dienste auswählen, die Ihren Geschäftlichen Anforderungen entsprechen, und die aktuellen Features der lokalen Web-App entsprechen. Diese Ausrichtung trägt dazu bei, den Replatforming-Aufwand zu minimieren. 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.

Vor dem Umstieg in die Cloud war releclouds Ticketing-Web-App beispielsweise eine lokale monolithische ASP.NET-App. Sie wurde auf zwei virtuellen Computern ausgeführt und eine SQL Server-Datenbank verwendet. Die Web-App litt unter häufigen Problemen bei der Skalierbarkeit und Featurebereitstellung. 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 app Service aus folgenden Gründen als Anwendungsplattform ausgewählt:

    • Vereinbarung auf hoher Serviceebene (SLA). Es verfügt über eine hohe SLA, die die Produktionsumgebung SLO von 99,9%erfüllt.
    • Reduzierter Verwaltungsaufwand. Es ist eine vollständig verwaltete Lösung, die Skalierung, Integritätsprüfungen und Lastenausgleich behandelt.
    • .NET-Unterstützung. Sie unterstützt die Version von .NET, in die die Anwendung geschrieben wurde.
    • Containerisierungsfunktion. Die Web-App kann ohne Containerisierung in der Cloud konvergent werden, aber die Anwendungsplattform unterstützt auch die Containerisierung, ohne Azure-Dienste zu ändern.
    • Automatische Skalierung. Die Web-App kann basierend auf Benutzerdatenverkehr und Konfigurationseinstellungen automatisch skaliert und verkleinert 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 aus folgenden Gründen die Microsoft Entra-ID ausgewählt:

    • Authentifizierung und Autorisierung. Die Anwendung muss Mitarbeiter des Callcenters authentifizieren und autorisieren.
    • Skalierbar. 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 Datenspeicher-Entscheidungsstruktur, um Ihre Auswahl zu leiten. Die Web-App von Relecloud hat SQL Server lokal verwendet. Sie wollten 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 allgemeine Ebene bietet eine hohe SLA- und Multiregionsredundanz. Es ist für eine hohe Benutzerauslastung geeignet.
    • Reduzierter Verwaltungsaufwand. SQL-Datenbank stellt eine verwaltete SQL-Datenbankinstanz bereit.
    • Migrationsunterstützung. Sie unterstützt die Datenbankmigration von lokalem SQL Server.
    • Konsistenz mit lokalen Konfigurationen. Sie unterstützt die vorhandenen gespeicherten Prozeduren, Funktionen und Ansichten.
    • Elastizität. Es unterstützt Sicherungen und Point-in-Time-Wiederherstellung.
    • Know-how und minimale Überarbeitungen. SQL-Datenbank ermöglicht Relecloud die Nutzung bestehender Kenntnisse und erfordert minimale Arbeit.
  • Anwendungsleistungsüberwachung: Verwenden Sie Application Insights, um Telemetrie für Ihre Anwendung zu analysieren. Relecloud hat sich aus den folgenden Gründen für die Verwendung von Application Insights entschieden:

    • Integration in Azure Monitor. Es bietet die beste Integration in Azure Monitor.
    • Anomalieerkennung. Es erkennt automatisch Leistungsanomalien.
    • Fehlerbehebung. Es hilft Ihnen, Probleme in der ausgeführten App zu diagnostizieren.
    • Überwachung. Sie sammelt Informationen darüber, wie Benutzer die App verwenden, und ermöglicht es Ihnen, benutzerdefinierte Ereignisse auf einfache Weise nachzuverfolgen.
    • Sichtbarkeitslücke. Die lokale Lösung hat keine Anwendungsleistungsüberwachungslösung. Application Insights bietet eine einfache Integration in die Anwendungsplattform und in den Code.
  • Cache: Wählen Sie aus, ob Der Web App-Architektur ein Cache hinzugefügt werden soll. Azure-Cache für Redis ist die primäre Azure-Cachelösung. Es ist ein verwalteter Speicher im Arbeitsspeicher, der auf Redis-Software basiert. Das Laden der Web-App von Relecloud ist stark verzerrt, um Konzerte und Veranstaltungsortdetails anzuzeigen. Aus folgenden Gründen hat Relecloud Azure Cache für Redis hinzugefügt:

    • Reduzierter Verwaltungsaufwand. Es ist ein vollständig verwalteter Dienst.
    • Geschwindigkeit und Lautstärke. Sie verfügt über einen hohen Datendurchsatz und lesevorgänge mit geringer Latenz für häufig verwendete, langsam ändernde Daten.
    • Vielfältige Unterstützung. Es handelt sich um einen einheitlichen Cachespeicherort für alle Zu verwendenden Instanzen der Web-App.
    • Externer Datenspeicher. Die lokalen Anwendungsserver haben vm-lokale Zwischenspeicherung ausgeführt. Bei diesem Setup wurden häufig verwendete Daten nicht ausgelagert, und Daten konnten nicht ungültig gemacht werden.
    • Nichtstickige Sitzungen. Das Externalisieren des Sitzungszustands unterstützt nichtstickige Sitzungen.
  • Lastenausgleichsmodul: Webanwendungen, die PaaS-Lösungen verwenden, sollten je nach Web-App-Architektur und -Anforderungen Azure-Anwendungsgateway oder beides 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. Das Unternehmen brauchte eine Mehrregion-Web-App, um den SLO von 99.9%zu erfüllen. Relecloud hat sich aus den folgenden Gründen für Azure Front Door entschieden:

    • Globaler Lastenausgleich. Es ist ein Lastenausgleich der Ebene 7, der den Datenverkehr über mehrere Regionen weiterleiten kann.
    • Webanwendungsfirewall. Sie ist nativ in die Azure-Webanwendungsfirewall integriert.
    • Routingflexibilität. Es ermöglicht dem Anwendungsteam, den Eingangsschritt zu konfigurieren, um zukünftige Änderungen in der Anwendung zu unterstützen.
    • Verkehrsbeschleunigung. Es verwendet Anycast, 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.
    • Integritätssonden. Die Anwendung erfordert intelligente Integritätssondenüberwachung. Azure Front Door ermittelt anhand der Ergebnisse des Tests den besten Ursprung für die Weiterleitung Ihrer Clientanforderungen.
    • Unterstützung für die Überwachung. Es unterstützt integrierte Berichte mit einem All-in-One-Dashboard sowohl für Azure Front Door als auch für Sicherheitsmuster. Sie können Warnungen konfigurieren, die in Azure Monitor integriert werden. Azure Front Door ermöglicht es der Anwendung, jede Anforderung und fehlerhafte Integritätssonden zu protokollieren.
    • DDoS-Schutz. Es verfügt über einen integrierten DDoS-Schutz der Ebene 3-4.
    • Netzwerk für die Inhaltsübermittlung. Es positioniert Relecloud für die Verwendung eines Inhaltsübermittlungsnetzwerks. 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 verwendet die Azure Web Application Firewall aus den folgenden Gründen:

    • Globaler Schutz. Es bietet einen verbesserten globalen Web App-Schutz, ohne die Leistung zu beeinträchtigen.
    • Botnetschutz. Das Team kann Einstellungen überwachen und konfigurieren, um Sicherheitsbedenken im Zusammenhang mit Botnets zu beheben.
    • Parität mit lokal. Die lokale Lösung wurde hinter einer von der IT verwalteten Webanwendungsfirewall ausgeführt.
    • Benutzerfreundlichkeit. Die Webanwendungsfirewall ist in Azure Front Door integriert.
  • 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. Es unterstützt Featurekennzeichnungen. Featurekennzeichnungen ermöglichen Benutzern das Anmelden und Abmelden von Early Preview-Features in einer Produktionsumgebung, ohne dass eine erneute Bereitstellung der App erforderlich ist.
    • Git-Pipelineunterstützung. Die Quelle der Wahrheit für Konfigurationsdaten, die als Git-Repository erforderlich sind. Die Pipeline musste die Daten im zentralen Konfigurationsspeicher aktualisieren.
    • Unterstützung für verwaltete Identitäten. Es unterstützt verwaltete Identitäten, um die Verbindung mit dem Konfigurationsspeicher zu vereinfachen und zu sichern.
  • 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 speichert geheime Schlüssel in Codekonfigurationsdateien, aber eine bessere Sicherheitspraxis besteht darin, geheime Schlüssel an einem Speicherort zu speichern, der RBAC und Überwachungssteuerelemente unterstützt. Obwohl verwaltete Identitäten die bevorzugte Lösung für die Verbindung mit Azure-Ressourcen sind, hatte Relecloud Anwendungsgeheimnisse, die sie zum Verwalten benötigten. Relecloud hat sich aus den folgenden Gründen für Key Vault entschieden:

    • Verschlüsselung. Es unterstützt ruhende und während der Übertragung verschlüsselung.
    • 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 (App-Konfiguration) und der Webhostingplattform (App Service).
  • Speicherlösung: Siehe Azure Storage-Optionen, 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:

    • Erweiterter Sicherheitszugriff. Die Web-App kann Endpunkte für den Zugriff auf Speicher beseitigen, der für das öffentliche Internet mit anonymen Zugriff verfügbar gemacht wird.
    • Verschlüsselung. Blob Storage verschlüsselt ruhende und während der Übertragung gespeicherte Daten.
    • Elastizität. Blob Storage unterstützt 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 für den Zugriff auf Plattform as a Service (PaaS)-Lösungen über einen privaten Endpunkt in Ihrem virtuellen Netzwerk. 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 Sicherheitskommunikation. Private Link 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 virtuellen Computern mit erweiterter Sicherheit herzustellen, ohne RDP/SSH-Ports verfügbar zu machen. Relecloud hat eine Hub-and-Spoke-Netzwerktopologie eingeführt 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 erweiterte Sicherheitsbereitstellungen von einem Sprunghost im DevOps-Subnetz.

Anleitung zum Code

Um eine Web-App erfolgreich in die Cloud zu verschieben, müssen Sie Ihren Web-App-Code mit dem Muster "Wiederholen", "Schaltkreistrennung" und Cache-Aside-Muster aktualisieren.

Diagramm mit den Rollen von Entwurfsmustern im Zuverlässigen Web App-Muster.

Abbildung 3. Rollen der Entwurfsmuster.

Jedes Entwurfsmuster bietet Arbeitsauslastungsdesignvorteile, die mit einer oder mehreren Säulen des Well-Architected Frameworks übereinstimmen. Hier ist eine Übersicht über die Muster, die Sie implementieren sollten:

  1. Wiederholen Sie das Muster. 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. Schaltkreistrennmuster. Das Schaltkreistrennmuster verhindert, dass eine Anwendung wiederholungsvorgänge ausführt, 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 lädt Daten bei Bedarf in einen Cache aus einem 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
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 Verzögerung zwischen Wiederholungen und der Anzahl der Versuche konfigurieren, die vor dem Zuweisen eines Fehlers ausgeführt werden sollen.

  • Verwenden Sie integrierte Wiederholungsmechanismen. Verwenden Sie den integrierten Wiederholungsmechanismus, den die meisten Azure-Dienste bereitstellen, um Ihre Implementierung zu beschleunigen. Die Referenzimplementierung verwendet z. B. Verbindungsresilienz in Entity Framework Core, um das Wiederholungsmuster in Anforderungen auf SQL-Datenbank anzuwenden:

    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:

    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. Sie gibt die Anwendung frei und verhindert, dass CPU-Zyklen verzehrt werden, sodass die Anwendung ihre Leistungsintegrität für Endbenutzer behält.

Die Referenzimplementierung wendet z. B. das Circuit Breaker-Muster auf alle Anforderungen an die API an. Es verwendet die HandleTransientHttpError-Logik, um HTTP-Anforderungen zu erkennen, die sie sicher wiederholen kann, aber die Anzahl der Aggregatfehler über einen bestimmten Zeitraum beschränkt:

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 die Konsistenz zwischen dem Cache und dem persistenten Speicher wie z. B. einer Datenbank sicher. Dies verkürzt die Reaktionszeiten, verbessert den Durchsatz und reduziert die Notwendigkeit für eine weitere 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 von Cache. Produktions-Apps sollten einen verteilten Redis-Cache verwenden. Dieser Cache verbessert die Leistung, indem Datenbankabfragen reduziert werden. Außerdem werden nichtstickige Sitzungen aktiviert, sodass der Lastenausgleich den Datenverkehr gleichmäßig verteilen kann. Die Referenzimplementierung verwendet einen verteilten Redis-Cache. Die AddAzureCacheForRedis Methode die Anwendung so konfiguriert, dass Azure Cache für Redis verwendet wird:

    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 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. Beispiel: Die Referenzimplementierung speichert die Daten mit hohem Bedarf für die Seite „Bevorstehende Konzerte“ zwischen. Die GetUpcomingConcertsAsync-Methode ruft Daten aus der SQL-Datenbank in den Redis-Cache ab und füllt den Cache mit den neuesten Konzertdaten auf:

    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. 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 sowohl 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:

    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. Die Referenzimplementierung verwendet die UpdateConcertAsync-Methode, um die Daten im Cache konsistent zu halten:

    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 und -autorisierung SE:05
OE:10
Implementieren verwalteter Identitäten SE:05
OE:10
Rechteisieren von Umgebungen 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 Anwendungsregistrierung. 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.

  • Verwenden Sie Plattformfeatures. Minimieren Sie die Notwendigkeit von benutzerdefiniertem Authentifizierungscode, indem Sie Plattformfunktionen verwenden, um Benutzer zu authentifizieren und auf Daten zuzugreifen. Beispielsweise bietet App Service integrierte Authentifizierungsunterstützung, sodass Sie Benutzer anmelden und auf Daten zugreifen können, während Sie minimalen oder keinen Code in Ihrer Web-App schreiben.

  • Erzwingen Sie die Autorisierung in der Anwendung. Verwenden Sie RBAC, um Anwendungsrollenam wenigsten Rechte 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 auf erforderliche Ressourcen und Aktionen zugreifen können.

  • Ziehen Sie temporären Zugriff auf den Speicher vor. Verwenden Sie temporäre Berechtigungen, um vor unbefugtem Zugriff und Verstößen zu schützen. Sie können z. B. 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. 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 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 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. Wenn Sie just-in-time-Zugriff verwenden, erhalten Benutzeridentitäten temporäre Berechtigungen zum Ausführen privilegierter Aufgaben.

Verwenden von verwalteten Identitäten

Verwenden Sie verwaltete Identitäten für alle Azure-Dienste, die sie unterstützen. Eine verwaltete Identität ermöglicht Azure-Ressourcen (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. 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. 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 erteilen, die für Vorgänge wichtig sind, z. B. CRUD-Aktionen in Datenbanken oder zugriff auf geheime Schlüssel. 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.

  • Stellen Sie Sicherheit für verbleibende geheime Schlüssel bereit. 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 das argument Authentication in der SQL-Datenbankverbindungszeichenfolge, sodass App Service mithilfe einer verwalteten Server=tcp:my-sql-server.database.windows.net,1433;Initial Catalog=my-sql-database;Authentication=Active Directory DefaultIdentität eine Verbindung mit der SQL-Datenbank kann. Es verwendet DefaultAzureCredential, um der Web-API die Verbindung mit Key Vault mithilfe einer verwalteten Identität zu ermöglichen:

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

Rechteisieren von Umgebungen

Verwenden Sie Leistungsstufen (SKUs) von Azure-Diensten, die die Anforderungen jeder Umgebung erfüllen, ohne sie zu überschreiten. Befolgen Sie die folgenden Empfehlungen, um Ihre Umgebungen zurecht zu machen:

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

  • Kostenoptimiere 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.Preproduction-Umgebungen sollten Ressourcen mit niedrigeren Kosten verwenden und Rabatte wie Azure Dev/Test-Preisnutzen. In diesen Umgebungen sollten Sie Dienste deaktivieren, die nicht benötigt werden. Stellen Sie gleichzeitig sicher, dass Vorproduktionsumgebungen ausreichend mit Produktionsumgebungen Umgebungen vergleichbar sind, um Risiken zu vermeiden. Durch die Aufrechterhaltung dieses Gleichgewichts wird sichergestellt, dass tests wirksam bleiben, ohne unnötige Kosten entstehen zu müssen.

  • Verwenden Sie die Infrastruktur als Code (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 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. 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äger-E/A einzuschließen. Das Ziel besteht darin, das Verhalten Ihrer Webanwendung für eine bessere Leistung anzupassen.

  • Stellen Sie einen Skalierungspuffer bereit. Legen Sie die Skalierungsschwellenwerte fest, die ausgelöst werden sollen, bevor die maximale Kapazität erreicht wird. 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 Infrastruktur als Code bereit, indem Sie fortlaufende Integrations- und Kontinuierliche Übermittlungspipelinen (CI/CD) verwenden. Azure bietet vorgefertigte Bicep-, ARM-, JSON- und Terraform-Vorlagen 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. Verwenden Sie Azure-Pipelines, wenn Sie mit Azure DevOps arbeiten. Verwenden Sie GitHub-Aktionen für GitHub-Projekte.

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

  • Übernehmen Sie Simulierte Frameworks. Verwenden Sie für Tests, die externe Endpunkte beinhalten, simulierte Frameworks. 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 in Ihrem 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 einfach in GitHub und Azure DevOps zu integrieren.

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 autoinstrumentation in Azure Application Insights, um Anwendungs-Telemetrie-zu sammeln, z. B. Anforderungsdurchsatz, durchschnittliche Anforderungsdauer, Fehler und Abhängigkeitsüberwachung. Sie müssen keine Codeänderungen vornehmen, um diese Telemetrie zu verwenden.

    Die Referenzimplementierung verwendet AddApplicationInsightsTelemetry aus dem NuGet-Paket Microsoft.ApplicationInsights.AspNetCore, um Telemetrieauflistungzu aktivieren:

    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. Sie stellt den Ereignisnamen (AddToCart) bereit und gibt ein Wörterbuch mit dem concertId und countan:

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

Bereitstellen der Referenzimplementierung

Die Referenzimplementierung führt Entwickler durch eine simulierte Migration von einer lokalen ASP.NET Anwendung zu Azure und hebt Änderungen hervor, die während der ersten Einführungsphase erforderlich sind. 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 Sie kostengünstige Codeänderungen mit hohem Wert.
  • Erreichen Sie einen SLO von 99,9%.
  • Übernehmen Sie DevOps-Methoden.
  • Erstellen Sie kostenoptimierte Umgebungen.
  • Verbessern Sie Zuverlässigkeit und Sicherheit.

Relecloud hat festgestellt, dass ihre lokale Infrastruktur keine kostengünstige Lösung für die Erfüllung dieser Ziele war. Sie haben beschlossen, dass die Migration ihrer Webanwendung zu Azure die kostengünstigste Methode war, um ihre unmittelbaren und zukünftigen Ziele zu erreichen. Die folgende Architektur stellt den Endzustand der Zuverlässigen Web App-Musterimplementierung von Relecloud dar.

Diagramm mit der Architektur der Referenzimplementierung. Abbildung 4. Architektur der Referenzimplementierung. Laden Sie eine Visio-Datei dieser Architektur herunter.