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ć.
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:
- Interfejs API usługi Application Insights dla niestandardowych zdarzeń i metryk
- TelemetryClient, klasa
- Metody klienta telemetrii
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.
- Omówienie przenoszenia z programu .NET Framework do platformy .NET. Uzyskaj wskazówki na podstawie określonego typu aplikacji .NET.
- Omówienie asystenta uaktualniania platformy .NET. Dowiedz się więcej o narzędziu konsoli, które może pomóc zautomatyzować wiele zadań związanych z uaktualnianiem projektów programu .NET Framework.
- Migrowanie z ASP.NET do ASP.NET Core w programie Visual Studio. Dowiedz się więcej o rozszerzeniu programu Visual Studio, które może pomóc w przyrostowych migracjach aplikacji internetowych.
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:
- Cloud Adoption Framework. Może pomóc organizacji przygotować i wykonać strategię tworzenia rozwiązań na platformie Azure.
- Dobrze zaprojektowana struktura. Zestaw wskazówek, które mogą służyć do poprawy jakości obciążenia.
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.
- Usługa Azure Migrate oferuje uproszczoną usługę migracji, modernizacji i optymalizacji dla platformy Azure, która obsługuje ocenę i migrację aplikacji internetowych, programu SQL Server i maszyn wirtualnych.
- Przewodniki migracji bazy danych platformy Azure udostępniają zasoby dla różnych typów baz danych i różne narzędzia przeznaczone dla scenariusza migracji.
- akcelerator strefy docelowej usługi aplikacja systemu Azure Service zawiera wskazówki dotyczące wzmacniania i skalowania wdrożeń usługi App Service.
- Ocena aplikacji i kodu usługi Azure Migrate