Niezawodny wzorzec aplikacji internetowej dla platformy .NET — stosowanie wzorca

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

W tym artykule pokazano, jak zastosować wzorzec niezawodnej aplikacji internetowej. Wzorzec niezawodnej aplikacji internetowej to zestaw zasad i technik implementacji, które definiują sposób modyfikowania aplikacji internetowych (ponownego tworzenia platformy) podczas migracji do chmury. Koncentruje się on na minimalnych aktualizacjach kodu, które należy wprowadzić w chmurze.

Aby ułatwić stosowanie tych wskazówek, istnieje implementacja referencyjna wzorca niezawodnej aplikacji internetowej, którą można wdrożyć.

Diagram przedstawiający architekturę implementacji referencyjnej.Architektura implementacji referencyjnej. Pobierz plik programu Visio tej architektury.

Poniższe wskazówki używają implementacji referencyjnej jako przykładu w całym. Aby zastosować wzorzec niezawodnej aplikacji internetowej, postępuj zgodnie z tymi zaleceniami dostosowanymi do filarów dobrze zaprojektowanej struktury:

Niezawodność

Niezawodność zapewnia, że aplikacja może spełnić zobowiązania podjęte przez klientów. Aby uzyskać więcej informacji, zobacz Listę kontrolną przeglądu projektu pod kątem niezawodności. Wzorzec niezawodnej aplikacji internetowej wprowadza dwa kluczowe wzorce projektowe na poziomie kodu w celu zwiększenia niezawodności: wzorzec ponawiania prób i wzorzec wyłącznika.

Używanie wzorca ponawiania prób

Wzorzec ponawiania prób dotyczy tymczasowych zakłóceń usługi, terminowanych błędów przejściowych, które zwykle są rozwiązywane w ciągu kilku sekund. Te błędy często wynikają z ograniczania przepustowości usługi, dynamicznego rozkładu obciążenia i problemów z siecią w środowiskach chmury. Implementowanie wzorca ponawiania prób obejmuje ponowne wysyłanie żądań, które zakończyły się niepowodzeniem, co umożliwia skonfigurowanie opóźnień i prób przed niepowodzeniem.

Aplikacje korzystające ze wzorca ponawiania prób powinny integrować zestawy SDK i mechanizmy ponawiania prób specyficznych dla usługi platformy Azure w celu zwiększenia wydajności. Aplikacje, których brakuje tego wzorca, powinny go przyjąć, korzystając z poniższych wskazówek.

Najpierw wypróbuj zestawy SDK usługi i klienta platformy Azure

Większość usług platformy Azure i zestawów SDK klientów ma wbudowany mechanizm ponawiania prób. Aby przyspieszyć implementację, należy użyć wbudowanego mechanizmu ponawiania prób dla usług platformy Azure.

Przykład: Implementacja referencyjna używa odporności połączenia w programie Entity Framework Core , aby zastosować wzorzec ponawiania prób w żądaniach do usługi Azure SQL Database (zobacz następujący kod).

services.AddDbContextPool<ConcertDataContext>(options => options.UseSqlServer(sqlDatabaseConnectionString,
    sqlServerOptionsAction: sqlOptions =>
    {
        sqlOptions.EnableRetryOnFailure(
        maxRetryCount: 5,
        maxRetryDelay: TimeSpan.FromSeconds(3),
        errorNumbersToAdd: null);
    }));

Użyj biblioteki Polly, gdy biblioteka klienta nie obsługuje ponownych prób

Może być konieczne wywołanie zależności, która nie jest usługą platformy Azure lub nie obsługuje natywnie wzorca ponawiania prób. W takim przypadku należy użyć biblioteki Polly, aby zaimplementować wzorzec ponawiania prób. Polly to biblioteka odporności platformy .NET i obsługa błędów przejściowych. Dzięki niemu można używać płynnych interfejsów API do opisywania zachowania w centralnej lokalizacji aplikacji.

Przykład: Implementacja referencyjna używa narzędzia Polly do skonfigurowania iniekcji zależności ASP.NET Core. Polly wymusza wzorzec ponawiania za każdym razem, gdy kod tworzy obiekt, który wywołuje IConcertSearchService obiekt. W strukturze Polly to zachowanie jest nazywane zasadami. Kod wyodrębnia te zasady w metodzie GetRetryPolicy , a GetRetryPolicy metoda stosuje wzorzec ponawiania za każdym razem, gdy aplikacja internetowa frontonu wywołuje internetowe usługi wyszukiwania koncertów interfejsu API (zobacz następujący kod).

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);
}

Procedura obsługi zasad dla wystąpienia stosuje wzorzec ponawiania dla RelecloudApiConcertSearchService wszystkich żądań do interfejsu API. Używa HandleTransientHttpError logiki do wykrywania żądań HTTP, które można bezpiecznie ponowić, a następnie ponowić próbę żądania na podstawie konfiguracji. Obejmuje ona pewną losowość, aby wygładzić potencjalne wzrosty ruchu do interfejsu API, jeśli wystąpi błąd.

Korzystanie z wzorca wyłącznika

Parowanie wzorców ponawiania i wyłącznika rozszerza możliwości aplikacji do obsługi zakłóceń usługi, które nie są związane z przejściowymi błędami. Wzorzec wyłącznika uniemożliwia aplikacji ciągłe próby uzyskania dostępu do usługi, która nie odpowiada. Wzorzec wyłącznika zwalnia aplikację i unika marnowania cykli procesora CPU, dzięki czemu aplikacja zachowuje integralność wydajności dla użytkowników końcowych.

Przykład: Implementacja referencyjna dodaje wzorzec wyłącznika w metodzie GetCircuitBreakerPolicy (zobacz następujący kod).

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

W kodzie program obsługi zasad dla RelecloudApiConcertSearchService wystąpienia stosuje wzorzec wyłącznika dla wszystkich żądań do interfejsu API. Używa HandleTransientHttpError logiki do wykrywania żądań HTTP, które można bezpiecznie ponowić, ale ogranicza liczbę zagregowanych błędów w określonym przedziale czasu.

Zabezpieczenia

Zabezpieczenia zapewniają ochronę przed celowymi atakami i nadużyciami cennych danych i systemów. Aby uzyskać więcej informacji, zobacz Lista kontrolna przeglądu projektu dotycząca zabezpieczeń. Wzorzec niezawodnej aplikacji internetowej używa tożsamości zarządzanych do implementowania zabezpieczeń skoncentrowanych na tożsamościach. Prywatne punkty końcowe, zapora aplikacji internetowej i ograniczony dostęp do aplikacji internetowej zapewniają bezpieczny ruch przychodzący.

Wymuszanie najmniejszych uprawnień

Aby zapewnić bezpieczeństwo i wydajność, przyznaj tylko użytkownikom (tożsamościom użytkowników) i usługom platformy Azure (tożsamościom obciążeń) uprawnienia, których potrzebują.

Przypisywanie uprawnień do tożsamości użytkowników

Oceń potrzeby aplikacji, aby zdefiniować zestaw ról, które obejmują wszystkie akcje użytkownika bez nakładania się. Zamapuj każdego użytkownika na najbardziej odpowiednią rolę. Upewnij się, że otrzymują dostęp tylko do tego, co jest niezbędne do ich obowiązków.

Przypisywanie uprawnień do tożsamości obciążeń

Przyznaj tylko uprawnienia krytyczne dla operacji, takie jak akcje CRUD w bazach danych lub uzyskiwanie dostępu do wpisów tajnych. Uprawnienia tożsamości obciążenia są trwałe, więc nie można zapewnić uprawnień just in time ani krótkoterminowych do tożsamości obciążeń.

  • Preferuj kontrolę dostępu opartą na rolach (RBAC). Zawsze zacznij od kontroli dostępu opartej na rolach platformy Azure, aby przypisać uprawnienia. Zapewnia precyzyjną kontrolę, zapewniając dostęp zarówno do inspekcji, jak i szczegółową. Użyj kontroli dostępu opartej na rolach platformy Azure, aby udzielić tylko uprawnień niezbędnych dla usługi do wykonywania jej zamierzonych funkcji.

  • Uzupełnienie kontroli dostępu na poziomie usług platformy Azure. Jeśli kontrola dostępu oparta na rolach platformy Azure nie obejmuje określonego scenariusza, uzupełnij zasady dostępu na poziomie usług platformy Azure.

Konfigurowanie uwierzytelniania i autoryzacji użytkownika

Uwierzytelnianie i autoryzacja są krytycznymi aspektami zabezpieczeń aplikacji internetowych. Uwierzytelnianie to proces weryfikowania tożsamości użytkownika. Autoryzacja określa akcje, które użytkownik może wykonać w aplikacji. Celem jest zaimplementowanie uwierzytelniania i autoryzacji bez osłabienia stanu zabezpieczeń. Aby osiągnąć ten cel, należy użyć funkcji platformy aplikacji platformy Azure (aplikacja systemu Azure Service) i dostawcy tożsamości (Microsoft Entra ID).

Konfigurowanie uwierzytelniania użytkowników

Zabezpiecz aplikację internetową, włączając uwierzytelnianie użytkowników za pomocą funkcji platformy. usługa aplikacja systemu Azure obsługuje uwierzytelnianie z dostawcami tożsamości, takimi jak Microsoft Entra ID, odciążając obciążenie uwierzytelniania z kodu.

Konfigurowanie uwierzytelniania i autoryzacji usługi

Skonfiguruj uwierzytelnianie i autoryzację usługi, aby usługi w danym środowisku miały uprawnienia do wykonywania niezbędnych funkcji. Użyj tożsamości zarządzanych w usłudze Microsoft Entra ID, aby zautomatyzować tworzenie tożsamości usług i zarządzanie nimi, eliminując ręczne zarządzanie poświadczeniami. Tożsamość zarządzana umożliwia aplikacji internetowej bezpieczny dostęp do usług platformy Azure, takich jak usługa Azure Key Vault i bazy danych. Ułatwia również integrację potoków ciągłej integracji/ciągłego wdrażania dla wdrożeń w usłudze aplikacja systemu Azure Service. Jednak w scenariuszach, takich jak wdrożenia hybrydowe lub starsze systemy, kontynuuj korzystanie z lokalnych rozwiązań uwierzytelniania w celu uproszczenia migracji. Przejście do tożsamości zarządzanych, gdy system jest gotowy do nowoczesnego podejścia do zarządzania tożsamościami. Aby uzyskać więcej informacji, zobacz Monitorowanie tożsamości zarządzanych.

Konfigurowanie kodu przy użyciu elementu DefaultAzureCredential

Służy DefaultAzureCredential do dostarczania poświadczeń dla lokalnych tożsamości programistycznych i zarządzanych w chmurze. DefaultAzureCredential generuje element TokenCredential na potrzeby pozyskiwania tokenu OAuth. Obsługuje większość scenariuszy zestawu Azure SDK i bibliotek klienckich firmy Microsoft. Wykrywa środowisko aplikacji do używania prawidłowej tożsamości i żąda tokenów dostępu zgodnie z potrzebami. DefaultAzureCredential usprawnia uwierzytelnianie aplikacji wdrożonych na platformie Azure Aby uzyskać więcej informacji, zobacz DefaultAzureCredential.

Przykład: Implementacja referencyjna używa DefaultAzureCredential klasy podczas uruchamiania, aby umożliwić korzystanie z tożsamości zarządzanej między internetowym interfejsem API i usługą Key Vault (zobacz następujący kod).

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 Key Vault. Use
            // the managed identity of this host for the authentication.
            kv.SetCredential(new DefaultAzureCredential());
        });
});

Używanie infrastruktury jako kodu do tworzenia tożsamości zarządzanych

Szablony Bicep powinny być używane do tworzenia i konfigurowania infrastruktury platformy Azure do obsługi tożsamości zarządzanych. Tożsamości zarządzane nie używają wpisów tajnych ani haseł, więc nie potrzebujesz usługi Key Vault ani strategii rotacji wpisów tajnych w celu zapewnienia integralności. Parametry połączenia można przechowywać w usłudze App Configuration Service.

Przykład: Implementacja referencyjna używa szablonów Bicep do (1) utworzenia tożsamości zarządzanej, (2) skojarzenia tożsamości z aplikacją internetową, a (3) przyznanie tożsamości uprawnień dostępu do bazy danych SQL. Argument Authentication w parametry połączenia informuje bibliotekę klienta firmy Microsoft o nawiązaniu połączenia z tożsamością zarządzaną (zobacz następujący kod).

    Server=tcp:my-sql-server.database.windows.net,1433;Initial Catalog=my-sql-database;Authentication=Active Directory Default

Aby uzyskać więcej informacji, zobacz Połączenie do bazy danych SQL z usługi App Service platformy .NET.

Zarządzanie wpisami tajnymi za pomocą centralnego magazynu wpisów tajnych

Podczas przenoszenia aplikacji do chmury użyj usługi Azure Key Vault , aby bezpiecznie przechowywać wszystkie takie wpisy tajne. To scentralizowane repozytorium oferuje bezpieczny magazyn, rotację kluczy, inspekcję dostępu i monitorowanie usług, które nie obsługują tożsamości zarządzanych. W przypadku konfiguracji aplikacji zaleca się aplikacja systemu Azure Konfiguracja.

Przykład: Implementacja referencyjna przechowuje następujące wpisy tajne w usłudze Key Vault: (1) Nazwa użytkownika i hasło bazy danych PostgreSQL, (2) hasło usługi Redis Cache oraz (3) klucz tajny klienta dla usługi Microsoft Entra ID skojarzony z implementacją biblioteki Microsoft Authentication Library (MSAL).

Nie umieszczaj usługi Key Vault w przepływie żądania HTTP

Załaduj wpisy tajne z usługi Key Vault podczas uruchamiania aplikacji zamiast podczas każdego żądania HTTP. Usługa Key Vault jest przeznaczona do bezpiecznego przechowywania i pobierania poufnych danych podczas wdrażania. Dostęp o wysokiej częstotliwości w żądaniach HTTP może przekraczać możliwości przepływności usługi Key Vault, co prowadzi do ograniczeń żądań i błędów kodu stanu HTTP 429. Aby uzyskać więcej informacji, zobacz Limity transakcji usługi Key Vault.

Uzyskiwanie dostępu do wpisów tajnych w usłudze Key Vault przy użyciu jednej metody

Podczas konfigurowania aplikacji internetowej w celu uzyskiwania dostępu do wpisów tajnych w usłudze Key Vault dostępne są dwie podstawowe opcje:

  • Ustawienie aplikacji usługi App Service: użyj ustawienia aplikacji w usłudze App Service, aby wstrzyknąć wpis tajny bezpośrednio jako zmienną środowiskową.

  • Bezpośrednie odwołanie do wpisu tajnego: bezpośrednio odwołuje się do wpisu tajnego w kodzie aplikacji. Dodaj określone odwołanie w pliku właściwości aplikacji, na przykład application.properties dla aplikacji Java, aby aplikacja mogła komunikować się z usługą Key Vault.

Ważne jest, aby wybrać jedną z tych metod i trzymać się jej dla uproszczenia i uniknąć niepotrzebnej złożoności.

Preferuj metody dostępu tymczasowego

Użyj tymczasowych uprawnień, aby chronić przed nieautoryzowanym dostępem i naruszeniami. Użyj sygnatur dostępu współdzielonego (SAS), aby uzyskać dostęp tymczasowy. Użyj sygnatury dostępu współdzielonego delegowania użytkownika, aby zmaksymalizować zabezpieczenia podczas udzielania tymczasowego dostępu. Jest to jedyna sygnatura dostępu współdzielonego, która używa poświadczeń usługi Microsoft Entra i nie wymaga klucza konta magazynu.

Używanie prywatnych punktów końcowych

Używaj prywatnych punktów końcowych we wszystkich środowiskach produkcyjnych dla wszystkich obsługiwanych usług platformy Azure. Prywatne punkty końcowe zapewniają prywatne połączenia między zasobami w sieci wirtualnej platformy Azure i usługach platformy Azure. Domyślnie komunikacja z większością usług platformy Azure przekracza publiczny Internet. Prywatne punkty końcowe nie wymagają żadnych zmian kodu, konfiguracji aplikacji ani parametry połączenia. Aby uzyskać więcej informacji, zobacz How to create a private endpoint and Best practices for endpoint security (Jak utworzyć prywatny punkt końcowy ) i Best practices for endpoint security (Najlepsze rozwiązania dotyczące zabezpieczeń punktu końcowego).

Przykład: aplikacja systemu Azure Configuration, Azure SQL Database, Azure Cache for Redis, Azure Storage, aplikacja systemu Azure Service i Key Vault używają prywatnego punktu końcowego.

Używanie zapory aplikacji internetowej i ograniczanie przychodzącego ruchu internetowego

Cały przychodzący ruch internetowy do aplikacji internetowej musi przechodzić przez zaporę aplikacji internetowej, aby chronić przed typowymi programami wykorzystującymi luki w sieci Web. Wymuś cały przychodzący ruch internetowy, aby przechodził przez publiczny moduł równoważenia obciążenia, jeśli go masz, i zaporę aplikacji internetowej.

Przykład: Implementacja referencyjna wymusza cały przychodzący ruch internetowy przez usługę Front Door i usługę Azure Web Application Firewall. W środowisku produkcyjnym zachowaj oryginalną nazwę hosta HTTP.

Konfigurowanie zabezpieczeń bazy danych

Administracja istrator dostępu na poziomie do bazy danych przyznaje uprawnienia do wykonywania operacji uprzywilejowanych. Operacje uprzywilejowane obejmują tworzenie i usuwanie baz danych, modyfikowanie schematów tabel lub zmienianie uprawnień użytkownika. Deweloperzy często potrzebują dostępu na poziomie administratora, aby zachować bazę danych lub rozwiązać problemy.

  • Unikaj trwałych uprawnień z podwyższonym poziomem uprawnień. Należy przyznać deweloperom dostęp just in time tylko do wykonywania uprzywilejowanych operacji. W przypadku dostępu just in time użytkownicy otrzymują tymczasowe uprawnienia do wykonywania uprzywilejowanych zadań

  • Nie należy udzielać aplikacji z podwyższonym poziomem uprawnień. Nie należy udzielać dostępu na poziomie administratora do tożsamości aplikacji. Należy skonfigurować dostęp z najniższymi uprawnieniami dla aplikacji do bazy danych. Ogranicza on promień wysadzanych usterek i naruszeń zabezpieczeń.

Optymalizacja kosztów

Optymalizacja kosztów dotyczy sposobów zmniejszenia niepotrzebnych wydatków i kosztów związanych z zarządzaniem. Aby uzyskać więcej informacji, zobacz Listę kontrolną przeglądu projektu dotyczącą optymalizacji kosztów. Wzorzec niezawodnej aplikacji internetowej implementuje techniki rightsizing, autoskalowanie i wydajne użycie zasobów dla bardziej zoptymalizowanej pod kątem kosztów aplikacji internetowej.

Odpowiednie rozmiary zasobów dla każdego środowiska

Poznaj różne warstwy wydajności usług platformy Azure i używaj tylko odpowiedniej jednostki SKU dla potrzeb każdego środowiska. Środowiska produkcyjne wymagają jednostek SKU spełniających umowy dotyczące poziomu usług (SLA), funkcji i skali wymaganej do produkcji. Środowiska nieprodukcyjne zwykle nie potrzebują tych samych możliwości. Aby uzyskać dodatkowe oszczędności, rozważ opcje cen tworzenia i testowania platformy Azure, rezerwacje platformy Azure i plany oszczędności platformy Azure na potrzeby obliczeń.

Przykład: Implementacja referencyjna używa parametrów Bicep do wyzwalania konfiguracji wdrażania zasobów. Jeden z tych parametrów wskazuje warstwy zasobów (SKU) do wdrożenia. Aplikacja internetowa używa bardziej wydajnych i kosztownych jednostek SKU dla środowisk produkcyjnych oraz tańszych jednostek SKU dla środowiska nieprodukcyjnego (zobacz następujący kod).

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

Korzystanie ze skalowania automatycznego

Autoskalowanie automatyzuje skalowanie w poziomie dla środowisk produkcyjnych. Autoskaluj na podstawie metryk wydajności. Wyzwalacze wydajności użycia procesora CPU są dobrym punktem wyjścia, jeśli nie rozumiesz kryteriów skalowania aplikacji. Należy skonfigurować i dostosować wyzwalacze skalowania (procesor CPU, pamięć RAM, sieć i dysk), aby odpowiadały zachowaniu aplikacji internetowej. Nie skaluj w pionie, aby sprostać częstym zmianom zapotrzebowania. Jest to mniej opłacalne. Aby uzyskać więcej informacji, zobacz Skalowanie w usłudze aplikacja systemu Azure i Autoskalowanie na platformie Microsoft Azure.

Przykład: Implementacja referencyjna używa następującej konfiguracji w szablonie Bicep. Tworzy regułę autoskalowania dla usługi aplikacja systemu Azure. Reguła skaluje do 10 wystąpień i domyślnie do jednego wystąpienia. Używa użycia procesora CPU jako wyzwalacza do skalowania w i na wyjęcie. Platforma hostingu aplikacji internetowej skaluje się w poziomie przy użyciu procesora CPU o 85% i skaluje w poziomie 60%. Ustawienie skalowania w poziomie 85%, a nie wartość procentowa bliżej 100%, zapewnia bufor chroniący przed skumulowanym ruchem użytkowników spowodowanym przez przyklejone sesje. Chroni również przed dużymi wzrostami ruchu, skalując wcześnie, aby uniknąć maksymalnego użycia procesora CPU. Te reguły skalowania automatycznego nie są uniwersalne (zobacz następujący kod).

resource autoScaleRule 'Microsoft.Insights/autoscalesettings@2022-10-01' = if (autoScaleSettings != null) { 
  name: '${name}-autoscale' 
  location: location 
  tags: tags 
  properties: { 
    targetResourceUri: appServicePlan.id 
    enabled: true 
    profiles: [ 
      { 
        name: 'Auto created scale condition' 
        capacity: { 
          minimum: string(zoneRedundant ? 3 : autoScaleSettings!.minCapacity) 
          maximum: string(autoScaleSettings!.maxCapacity) 
          default: string(zoneRedundant ? 3 : autoScaleSettings!.minCapacity) 
        } 
        rules: [ 
          ... 
        ] 
      } 
    ] 
  } 
}

Wydajne korzystanie z zasobów

  • Korzystanie z usług udostępnionych. Scentralizowanie i udostępnianie niektórych zasobów zapewnia optymalizację kosztów i niższe obciążenie związane z zarządzaniem. Umieść udostępnione zasoby sieciowe w sieci wirtualnej koncentratora.

    Przykład: Implementacja referencyjna umieszcza usługę Azure Firewall, usługę Azure Bastion i usługę Key Vault w sieci wirtualnej piasty.

  • Usuń nieużywane środowiska. Usuń środowiska nieprodukcyjne po godzinach lub w czasie świąt, aby zoptymalizować koszty. Możesz użyć infrastruktury jako kodu, aby usunąć zasoby platformy Azure i całe środowiska. Usuń deklarację zasobu, który chcesz usunąć z szablonu Bicep. Użyj operacji analizy co-jeżeli, aby wyświetlić podgląd zmian przed ich wprowadzeniem. Tworzenie kopii zapasowej potrzebnych danych później. Zapoznaj się z zależnościami od zasobu, który usuwasz. Jeśli istnieją zależności, może być konieczne zaktualizowanie lub usunięcie tych zasobów. Aby uzyskać więcej informacji, zobacz Bicep deployment what-if operation (Operacja analizy co-jeżeli wdrożenia Bicep).

  • Colocate funkcjonalność. W przypadku wolnej pojemności colokuj zasoby aplikacji i funkcje w jednym zasobie platformy Azure. Na przykład wiele aplikacji internetowych może używać jednego serwera (plan usługi App Service) lub pojedynczej pamięci podręcznej może obsługiwać wiele typów danych.

    Przykład: Implementacja referencyjna używa pojedynczego wystąpienia usługi Azure Cache for Redis do zarządzania sesjami w obu frontonach (przechowywanie koszyka i tokenów MSAL) oraz zaplecza (zawierającego dane dotyczące nadchodzących koncertów) aplikacji internetowych. Decyduje się na najmniejszą jednostkę SKU Redis, oferując więcej niż potrzebną pojemność, wydajnie wykorzystywaną przez zastosowanie wielu typów danych w celu kontrolowania kosztów.

Doskonałość operacyjna

Doskonałość operacyjna obejmuje procesy operacyjne, które wdrażają aplikację i działają w środowisku produkcyjnym. Aby uzyskać więcej informacji, zobacz Listę kontrolną przeglądu projektu dotyczącą doskonałości operacyjnej. Wzorzec niezawodnej aplikacji internetowej implementuje infrastrukturę jako kod dla wdrożeń infrastruktury i monitorowania w celu obserwowania.

Automatyzowanie wdrażania

Użyj potoku ciągłej integracji/ciągłego wdrażania, aby wdrożyć zmiany z kontroli źródła do środowiska produkcyjnego. Jeśli używasz usługi Azure DevOps, użyj usługi Azure Pipelines. Jeśli używasz usługi GitHub, użyj funkcji GitHub actions. szablon usługi POMOC TECHNICZNA PLATFORMY AZURE s ARM (JSON), Bicep i Terraform oraz szablony dla każdego zasobu platformy Azure Aby uzyskać więcej informacji, zobacz Szablony Bicep, Azure Resource Manager i Terraform oraz powtarzalna infrastruktura.

Przykład: Implementacja referencyjna używa interfejsu wiersza polecenia platformy Azure i infrastruktury jako kodu (szablonów Bicep) do tworzenia zasobów platformy Azure, konfigurowania konfiguracji i wdrażania wymaganych zasobów.

Konfigurowanie monitorowania

Aby monitorować aplikację internetową, zbierać i analizować metryki i dzienniki z kodu aplikacji, infrastruktury (środowiska uruchomieniowego) i platformy (zasobów platformy Azure). Dodaj ustawienie diagnostyczne dla każdego zasobu platformy Azure w architekturze. Każda usługa platformy Azure ma inny zestaw dzienników i metryk, które można przechwycić. Aby uzyskać więcej informacji, zobacz Monitorowanie platformy i monitorowanie usługi App Service.

Monitorowanie metryk punktu odniesienia

Użyj aplikacja systemu Azure Szczegółowe informacje do śledzenia metryk linii bazowej, takich jak przepływność żądań, średni czas trwania żądania, błędy i monitorowanie zależności. Użyj AddApplicationInsightsTelemetry z pakietu Microsoft.ApplicationInsights.AspNetCore NuGet, aby włączyć zbieranie danych telemetrycznych. Aby uzyskać więcej informacji, zobacz Włączanie telemetrii Szczegółowe informacje aplikacji i wstrzykiwanie zależności na platformie .NET.

Przykład: Implementacja referencyjna używa kodu do konfigurowania metryk bazowych w usłudze Application Szczegółowe informacje (zobacz następujący kod).

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.AddApplicationInsightsTelemetry(Configuration["App:Api:ApplicationInsights:ConnectionString"]);
   ...
}

Tworzenie niestandardowych danych telemetrycznych zgodnie z potrzebami

Użyj Szczegółowe informacje aplikacji, aby zebrać niestandardowe dane telemetryczne, aby lepiej zrozumieć użytkowników aplikacji internetowej. Utwórz wystąpienie TelemetryClient klasy i użyj TelemetryClient metod do utworzenia właściwej metryki. Przekształcanie zapytania w widżet pulpitu nawigacyjnego platformy Azure.

Przykład: Implementacja referencyjna dodaje metryki, które pomagają zespołowi operacyjnemu zidentyfikować, czy aplikacja internetowa pomyślnie kończy transakcje. Sprawdza, czy aplikacja internetowa jest w trybie online, monitorując, czy klienci mogą składać zamówienia, a nie przez pomiar liczby żądań lub użycia procesora CPU. Implementacja referencyjna używa TelemetryClient metody iniekcji zależności i TrackEvent metody do zbierania danych telemetrycznych dotyczących zdarzeń związanych z działaniem koszyka. Dane telemetryczne śledzą bilety, które użytkownicy dodają, usuń i kupią (zobacz następujący kod).

  • AddToCart zlicza, ile razy użytkownicy dodają określony bilet (ConcertID) do koszyka.
  • RemoveFromCart rejestruje bilety, które użytkownicy usuwają z koszyka.
  • CheckoutCart rejestruje zdarzenie za każdym razem, gdy użytkownik kupuje bilet.

this.telemetryClient.TrackEvent zlicza bilety dodane do koszyka. Dostarcza nazwę zdarzenia (AddToCart) i określa słownik, który ma concertId element i count (zobacz następujący kod).

this.telemetryClient.TrackEvent("AddToCart", new Dictionary<string, string> {
    { "ConcertId", concertId.ToString() },
    { "Count", count.ToString() }
});

Aby uzyskać więcej informacji, zobacz:

Zbieranie metryk opartych na dziennikach

Śledzenie metryk opartych na dziennikach w celu uzyskania większego wglądu w podstawową kondycję i metryki aplikacji. Zapytania język zapytań Kusto (KQL) można używać w Szczegółowe informacje aplikacji w celu znajdowania i organizowania danych. Aby uzyskać więcej informacji, zobacz aplikacja systemu Azure Szczegółowe informacje metryki oparte na dziennikach oraz metryki oparte na dziennikach i wstępnie agregowane w usłudze Application Szczegółowe informacje.

Włączanie diagnostyki platformy

Ustawienie diagnostyczne na platformie Azure umożliwia określenie dzienników i metryk platformy, które mają być zbierane, oraz miejsca ich przechowywania. Dzienniki platformy to wbudowane dzienniki, które zapewniają informacje diagnostyczne i inspekcji. Możesz włączyć diagnostykę platformy dla większości usług platformy Azure, ale każda usługa definiuje własne kategorie dzienników. Różne usługi platformy Azure mają wybrane kategorie dzienników.

  • Włącz diagnostykę dla wszystkich obsługiwanych usług. Usługi platformy Azure automatycznie tworzą dzienniki platformy, ale usługa nie przechowuje ich automatycznie. Należy włączyć ustawienie diagnostyczne dla każdej usługi i włączyć je dla każdej usługi platformy Azure obsługującej diagnostykę.

  • Wyślij diagnostykę do tego samego miejsca docelowego co dzienniki aplikacji. Po włączeniu diagnostyki wybierasz dzienniki, które chcesz zbierać, i gdzie mają być wysyłane. Dzienniki platformy należy wysłać do tego samego miejsca docelowego co dzienniki aplikacji, aby można było skorelować dwa zestawy danych.

Efektywność wydajności

Efektywność wydajności to możliwość skalowania obciążenia w celu zaspokojenia zapotrzebowania użytkowników w wydajny sposób. Aby uzyskać więcej informacji, zobacz listę kontrolną przeglądu projektu pod kątem wydajności. Wzorzec niezawodnej aplikacji internetowej używa wzorca Odkładanie do pamięci podręcznej, aby zminimalizować opóźnienie dla wysoce żądanych danych.

Używanie wzorca z odkładania do pamięci podręcznej

Wzorzec z odkładaniem do pamięci podręcznej to strategia buforowania, która usprawnia zarządzanie danymi w pamięci. Wzorzec przypisuje aplikacji odpowiedzialność za obsługę żądań danych i zapewnienie spójności między pamięcią podręczną a magazynem trwałym, takim jak baza danych. Gdy aplikacja internetowa odbierze żądanie danych, najpierw przeszukuje pamięć podręczną. Jeśli brakuje danych, pobiera je z bazy danych, odpowiada na żądanie i odpowiednio aktualizuje pamięć podręczną. To podejście skraca czas odpowiedzi i zwiększa przepływność i zmniejsza potrzebę większego skalowania. Zwiększa również dostępność usługi, zmniejszając obciążenie podstawowego magazynu danych i minimalizując ryzyko awarii.

Przykład: Implementacja referencyjna zwiększa wydajność aplikacji przez buforowanie krytycznych danych, takich jak informacje o nadchodzących koncertach, które mają kluczowe znaczenie dla sprzedaży biletów. Używa ona rozproszonej pamięci podręcznej ASP.NET Core dla magazynu elementów w pamięci. Aplikacja automatycznie używa usługi Azure Cache for Redis w przypadku znalezienia określonego parametry połączenia. Obsługuje również lokalne środowiska deweloperskie bez usługi Redis, aby uprościć konfigurację i zmniejszyć koszty i złożoność. Metoda (AddAzureCacheForRedis) konfiguruje aplikację do korzystania z usługi Azure Cache for Redis (zobacz następujący kod).

private void AddAzureCacheForRedis(IServiceCollection services)
{
    if (!string.IsNullOrWhiteSpace(Configuration["App:RedisCache:ConnectionString"]))
    {
        services.AddStackExchangeRedisCache(options =>
        {
            options.Configuration = Configuration["App:RedisCache:ConnectionString"];
        });
    }
    else
    {
        services.AddDistributedMemoryCache();
    }
}

Aby uzyskać więcej informacji, zobacz Distributed caching in ASP.NET Core and AddDistributedMemoryCache method (Buforowanie rozproszone w ASP.NET Core ) i AddDistributedMemoryCache method (Metoda AddDistributedMemoryCache).

Buforowanie danych o wysokiej potrzebie

Określanie priorytetów buforowania dla najczęściej używanych danych. Zidentyfikuj kluczowe punkty danych, które napędzają zaangażowanie użytkowników i wydajność systemu. Zaimplementuj strategie buforowania przeznaczone specjalnie dla tych obszarów, aby zoptymalizować skuteczność wzorca z odkładaniem do pamięci podręcznej, co znacznie zmniejsza opóźnienie i obciążenie bazy danych. Usługa Azure Monitor umożliwia śledzenie procesora CPU, pamięci i magazynu bazy danych. Te metryki ułatwiają określenie, czy można użyć mniejszej jednostki SKU bazy danych.

Przykład: Implementacja referencyjna buforuje dane, które obsługują nadchodzące koncerty. Strona Nadchodzące koncerty tworzy najwięcej zapytań do usługi SQL Database i generuje spójne dane wyjściowe dla każdej wizyty. Wzorzec odkładania do pamięci podręcznej buforuje dane po pierwszym żądaniu dla tej strony, aby zmniejszyć obciążenie bazy danych. Poniższy kod używa GetUpcomingConcertsAsync metody w celu ściągnięcia danych do pamięci podręcznej Redis z usługi SQL Database. Metoda wypełnia pamięć podręczną najnowszymi koncertami. Metoda filtruje według czasu, sortuje dane i zwraca dane do kontrolera, aby wyświetlić wyniki (zobacz następujący kod).

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

Zachowaj świeżość danych pamięci podręcznej

Zaplanuj regularne aktualizacje pamięci podręcznej w celu synchronizacji z najnowszymi zmianami bazy danych. Określ optymalną częstotliwość odświeżania na podstawie zmienności danych i potrzeb użytkowników. Dzięki temu aplikacja korzysta ze wzorca z odkładania do pamięci podręcznej w celu zapewnienia szybkiego dostępu i bieżących informacji.

Przykład: implementacja referencyjna buforuje dane tylko przez jedną godzinę. Ma on proces czyszczenia klucza pamięci podręcznej po zmianie danych. Metoda CreateConcertAsync czyści klucz pamięci podręcznej (zobacz następujący kod).

public async Task<CreateResult> CreateConcertAsync(Concert newConcert)
{
    database.Add(newConcert);
    await this.database.SaveChangesAsync();
    this.cache.Remove(CacheKeys.UpcomingConcerts);
    return CreateResult.SuccessResult(newConcert.Id);
}

Zapewnianie spójności danych

Zaimplementuj mechanizmy aktualizacji pamięci podręcznej bezpośrednio po każdej operacji zapisu bazy danych. Użyj aktualizacji opartych na zdarzeniach lub dedykowanych klas zarządzania danymi, aby zapewnić spójność pamięci podręcznej. Spójna synchronizacja pamięci podręcznej z modyfikacjami bazy danych jest kluczowa dla wzorca z odkładaniem do pamięci podręcznej.

Przykład: Implementacja referencyjna używa UpdateConcertAsync metody w celu zachowania spójności danych w pamięci podręcznej (zobacz następujący kod).

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

Testowanie wydajności bazy danych

Wydajność bazy danych może mieć wpływ na wydajność i skalowalność aplikacji. Ważne jest, aby przetestować wydajność bazy danych, aby upewnić się, że jest ona zoptymalizowana. Niektóre kluczowe zagadnienia obejmują wybór odpowiedniego regionu chmury, buforowanie połączeń, wzorzec z odkładaniem do pamięci podręcznej i optymalizowanie zapytań.

  • Przeskoki sieci testowej. Przeniesienie aplikacji do chmury może powodować dodatkowe przeskoki sieciowe i opóźnienia w bazie danych. Należy przetestować dodatkowe przeskoki wprowadzone w nowym środowisku chmury.

  • Ustal punkt odniesienia wydajności. Należy użyć lokalnych metryk wydajności jako początkowego punktu odniesienia, aby porównać wydajność aplikacji w chmurze.

Następne kroki

Wdróż implementację referencyjną, postępując zgodnie z instrukcjami w repozytorium GitHub. Skorzystaj z poniższych zasobów, aby dowiedzieć się więcej na temat aplikacji platformy .NET, aplikacji internetowych, najlepszych rozwiązań w chmurze i migracji.

Uaktualnianie aplikacji .NET Framework

Implementacja referencyjna jest wdrażana w usłudze App Service z systemem Windows, ale może działać w systemie Linux. Platforma App Service dla systemu Windows umożliwia przenoszenie aplikacji internetowych .NET Framework na platformę Azure bez uaktualniania do nowszych wersji platformy. Aby uzyskać informacje o planach usługi App Service systemu Linux lub nowych funkcjach i ulepszeniach wydajności dodanych do najnowszych wersji platformy .NET, zobacz poniższe wskazówki.

Wprowadzenie do aplikacji internetowych na platformie Azure

Aby zapoznać się z praktycznym wprowadzeniem do aplikacji internetowych platformy .NET na platformie Azure, zobacz te wskazówki dotyczące wdrażania podstawowej aplikacji internetowej platformy .NET.

Najlepsze rozwiązania dotyczące chmury

Aby uzyskać wskazówki dotyczące wdrażania i architektury platformy Azure, zobacz:

W przypadku aplikacji, które wymagają wyższego celu slo niż wzorzec niezawodnej aplikacji internetowej, zobacz obciążenia o znaczeniu krytycznym.

Wskazówki dotyczące migracji

Poniższe narzędzia i zasoby mogą ułatwić migrację zasobów lokalnych na platformę Azure.