Modello di app Web affidabile per Java - Applicare il modello

Servizio app di Azure
Frontdoor di Azure
Cache di Azure per Redis
Microsoft Authentication Library per Java

Questo articolo illustra come applicare il modello Reliable Web App. Il modello Reliable Web App è un set di principi e tecniche di implementazione che definiscono come modificare le app Web (replatform) durante la migrazione al cloud. È incentrato sugli aggiornamenti minimi del codice che è necessario apportare per avere successo nel cloud.

Per facilitare l'applicazione di queste linee guida, è disponibile un'implementazione di riferimento del modello Reliable Web App che è possibile distribuire.

Diagramma che mostra l'architettura dell'implementazione di riferimento.Architettura dell'architettura di implementazione di riferimento. Scaricare un file di Visio di questa architettura.

Le indicazioni seguenti usano l'implementazione di riferimento come esempio in tutto. Per applicare il modello Reliable Web App, seguire queste indicazioni allineate ai pilastri di Well-Architected Framework:

Affidabilità

L'affidabilità garantisce che l'applicazione possa soddisfare gli impegni che l'utente ha preso con i clienti. Per altre informazioni, vedere l'elenco di controllo per la revisione della progettazione per l'affidabilità. Il modello Reliable Web App introduce due modelli di progettazione chiave a livello di codice per migliorare l'affidabilità: il modello Di ripetizione dei tentativi e il modello a interruttore.

Usare il modello Di ripetizione dei tentativi

Il modello Di ripetizione dei tentativi risolve le interruzioni temporanee del servizio, definiti errori temporanei, che in genere si risolvono entro pochi secondi. Questi errori spesso derivano dalla limitazione del servizio, dalla distribuzione dinamica del carico e dai problemi di rete negli ambienti cloud. L'implementazione del modello Di ripetizione dei tentativi comporta la reinviazione di richieste non riuscite, consentendo ritardi configurabili e tentativi prima di generare un'eccezione.

Usare Resilience4j per implementare il modello Di ripetizione dei tentativi in Java. Resilience4j è una libreria di tolleranza di errore leggera. Fornisce funzioni di ordine superiore (decorator) per migliorare le interfacce funzionali, le espressioni lambda e i riferimenti ai metodi con un interruttore, un limiter di frequenza, un retry o un modello di progettazione bulkhead.

Esempio: l'implementazione di riferimento aggiunge il modello Retry decorating the Service Plan Controller's listServicePlans method with Retry annotations .Example: The reference implementation adds the Retry pattern by decorating the Service Plan Controller's listServicePlans method with Retry annotations. Il codice ritenta la chiamata a un elenco di piani di servizio dal database se la chiamata iniziale ha esito negativo.

    @GetMapping("/list")
    @PreAuthorize("hasAnyAuthority('APPROLE_AccountManager')")
    @CircuitBreaker(name = SERVICE_PLAN)
    @Retry(name = SERVICE_PLAN)
    public String listServicePlans(Model model) {
        List<serviceplandto> servicePlans = planService.getServicePlans();
        model.addAttribute("servicePlans", servicePlans);
        return "pages/plans/list";
    }

L'implementazione di riferimento configura i criteri di ripetizione dei tentativi, inclusi i tentativi massimi, la durata dell'attesa e le eccezioni da ritentare. I criteri di ripetizione dei tentativi sono configurati in application.properties. Per altre informazioni, vedere la documentazione di Resilience4j. È possibile simulare il modello di ripetizione dei tentativi nell'implementazione di riferimento.

Usare il modello a interruttore

L'associazione dei modelli di ripetizione dei tentativi e interruttore espande la funzionalità di un'applicazione per gestire le interruzioni del servizio che non sono correlate a errori temporanei. Il modello interruttore impedisce a un'applicazione di tentare continuamente di accedere a un servizio non rispondente. Il modello interruttore rilascia l'applicazione ed evita di sprecare cicli di CPU in modo che l'applicazione mantenga l'integrità delle prestazioni per gli utenti finali. Per altre informazioni, vedere Spring Circuit Breaker e la documentazione di Resilience4j.

Esempio: l'implementazione di riferimento implementa il modello interruttore decorata con l'attributo Circuit Breaker. È possibile simulare il modello di interruttore nell'implementazione di riferimento.

Sicurezza

La sicurezza offre garanzie contro attacchi intenzionali e l'abuso di dati e sistemi preziosi. Per altre informazioni, vedere Elenco di controllo per la revisione della progettazione per la sicurezza. Il modello Reliable Web App usa le identità gestite per implementare la sicurezza basata sulle identità. Gli endpoint privati, il web application firewall e l'accesso limitato all'app Web forniscono un ingresso sicuro.

Applicare privilegi minimi

Per garantire sicurezza ed efficienza, concedere solo agli utenti (identità utente) e ai servizi di Azure (identità del carico di lavoro) le autorizzazioni necessarie.

Assegnare autorizzazioni alle identità utente

Valutare le esigenze dell'applicazione per definire un set di ruoli che coprono tutte le azioni utente senza sovrapposizioni. Eseguire il mapping di ogni utente al ruolo più appropriato. Assicurarsi che ricevano l'accesso solo a ciò che è necessario per i loro compiti.

Assegnare autorizzazioni alle identità del carico di lavoro

Concedere solo le autorizzazioni critiche per le operazioni, ad esempio le azioni CRUD nei database o l'accesso ai segreti. Le autorizzazioni di identità del carico di lavoro sono persistenti, quindi non è possibile fornire autorizzazioni JUST-In-Time o a breve termine per le identità del carico di lavoro.

  • Preferisce il controllo degli accessi in base al ruolo. Iniziare sempre con il controllo degli accessi in base al ruolo di Azure per assegnare le autorizzazioni. Offre un controllo preciso, assicurando che l'accesso sia controllabile e granulare. Usare il controllo degli accessi in base al ruolo di Azure per concedere solo le autorizzazioni necessarie per il servizio per eseguire le funzioni desiderate.

  • Integrare i controlli di accesso a livello di servizio di Azure. Se il controllo degli accessi in base al ruolo di Azure non copre uno scenario specifico, integrare i criteri di accesso a livello di servizio di Azure.

Per altre informazioni, vedi:

Configurare l'autenticazione e l'autorizzazione degli utenti

L'autenticazione e l'autorizzazione sono aspetti critici della sicurezza delle applicazioni Web. L'autenticazione è il processo di verifica dell'identità di un utente. L'autorizzazione specifica le azioni che un utente può eseguire all'interno dell'applicazione. L'obiettivo è implementare l'autenticazione e l'autorizzazione senza indebolire il comportamento di sicurezza. Per raggiungere questo obiettivo, è necessario usare le funzionalità della piattaforma applicativa di Azure (app Azure Service) e del provider di identità (Microsoft Entra ID).

Configurare l'autenticazione utente

Proteggere l'app Web abilitando l'autenticazione utente tramite le funzionalità della piattaforma. app Azure Servizio supporta l'autenticazione con provider di identità come Microsoft Entra ID, offload del carico di lavoro di autenticazione dal codice.

Esempio: l'implementazione di riferimento usa l'ID Entra di Microsoft come piattaforma di gestione delle identità. Microsoft Entra ID richiede una registrazione dell'applicazione nel tenant primario. La registrazione dell'applicazione garantisce che gli utenti che ottengono l'accesso all'app Web abbiano identità nel tenant primario. Il codice Terraform seguente consente di creare una registrazione dell'app Entra ID insieme a un ruolo di Account Manager specifico dell'app.

resource "azuread_application" "app_registration" {
  display_name     = "${azurecaf_name.app_service.result}-app"
  owners           = [data.azuread_client_config.current.object_id]
  sign_in_audience = "AzureADMyOrg"  # single tenant

  app_role {
    allowed_member_types = ["User"]
    description          = "Account Managers"
    display_name         = "Account Manager"
    enabled              = true
    id                   = random_uuid.account_manager_role_id.result
    value                = "AccountManager"
  }
}

Key Vault archivia in modo sicuro i dati di configurazione client e la piattaforma servizio app espone le informazioni all'app come variabili di ambiente.

Eseguire l'integrazione con il provider di identità

Integrare l'applicazione Web con Microsoft Entra ID per l'autenticazione e l'autorizzazione sicure. Spring Boot Starter per Microsoft Entra ID semplifica questo processo, usando Spring Security e Spring Boot per semplificare la configurazione. Offre diversi flussi di autenticazione, gestione automatica dei token e criteri di autorizzazione personalizzabili, insieme alle funzionalità di integrazione con i componenti spring cloud. Ciò consente un'integrazione semplice di Microsoft Entra ID e OAuth 2.0 nelle applicazioni Spring Boot senza configurazione manuale della libreria o delle impostazioni.

Esempio: l'implementazione di riferimento usa Microsoft Identity Platform (ID Microsoft Entra) come provider di identità per l'app Web. Usa la concessione del codice di autorizzazione OAuth 2.0 per accedere a un utente con un account Microsoft Entra. Il frammento XML seguente definisce le due dipendenze necessarie del flusso di concessione del codice di autorizzazione OAuth 2.0. La dipendenza com.azure.spring: spring-cloud-azure-starter-active-directory abilita l'autenticazione e l'autorizzazione di Microsoft Entra in un'applicazione Spring Boot. La dipendenza org.springframework.boot: spring-boot-starter-oauth2-client supporta l'autenticazione e l'autorizzazione OAuth 2.0 in un'applicazione Spring Boot.

<dependency>
    <groupid>com.azure.spring</groupid>
    <artifactid>spring-cloud-azure-starter-active-directory</artifactid>
</dependency>
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-oauth2-client</artifactid>
</dependency>

Per altre informazioni, vedere Spring Cloud supporto tecnico di Azure for Spring Security.

Implementare regole business di autenticazione e autorizzazione

L'implementazione di regole business di autenticazione e autorizzazione implica la definizione dei criteri di controllo di accesso e delle autorizzazioni per varie funzionalità e risorse dell'applicazione. È necessario configurare Spring Security per usare Spring Boot Starter per Microsoft Entra ID. Questa libreria consente l'integrazione con Microsoft Entra ID e consente di assicurarsi che gli utenti siano autenticati in modo sicuro. La configurazione e l'abilitazione di Microsoft Authentication Library (MSAL) fornisce l'accesso a più funzionalità di sicurezza. Queste funzionalità includono la memorizzazione nella cache dei token e l'aggiornamento automatico dei token.

Esempio: l'implementazione di riferimento crea ruoli dell'app che riflettono i tipi di ruoli utente nel sistema di gestione degli account di Contoso Fiber. I ruoli si traducono in autorizzazioni durante l'autorizzazione. Esempi di ruoli specifici dell'app in CAMS includono il responsabile dell'account, il rappresentante del supporto di Livello 1 (L1) e il rappresentante di Field Service. Il ruolo Account Manager ha le autorizzazioni per aggiungere nuovi utenti e clienti di app. Un rappresentante di Field Service può creare ticket di supporto. L'attributo limita l'accesso PreAuthorize a ruoli specifici.

    @GetMapping("/new")
    @PreAuthorize("hasAnyAuthority('APPROLE_AccountManager')")
    public String newAccount(Model model) {
        if (model.getAttribute("account") == null) {
            List<ServicePlan> servicePlans = accountService.findAllServicePlans();
            ServicePlan defaultServicePlan = servicePlans.stream().filter(sp -> sp.getIsDefault() == true).findFirst().orElse(null);
            NewAccountRequest accountFormData = new NewAccountRequest();
            accountFormData.setSelectedServicePlanId(defaultServicePlan.getId());
            model.addAttribute("account", accountFormData);
            model.addAttribute("servicePlans", servicePlans);
        }
        model.addAttribute("servicePlans", accountService.findAllServicePlans());
        return "pages/account/new";
    }
    ...

Per l'integrazione con Microsoft Entra ID, l'implementazione di riferimento usa il flusso di concessione del codice di autorizzazione OAuth 2.0. Questo flusso consente a un utente di accedere con un account Microsoft. Il frammento di codice seguente illustra come configurare per l'uso dell'ID SecurityFilterChain Entra Di Microsoft per l'autenticazione e l'autorizzazione.

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
            .and()
                .authorizeHttpRequests()
            .requestMatchers(EndpointRequest.to("health")).permitAll()
            .anyRequest().authenticated()
            .and()
                .logout(logout -> logout
                            .deleteCookies("JSESSIONID", "XSRF-TOKEN")
                            .clearAuthentication(true)
                            .invalidateHttpSession(true));
        return http.build();
    }
}
...

Per altre informazioni, vedi:

Configurare l'autenticazione e l'autorizzazione del servizio

Configurare l'autenticazione e l'autorizzazione del servizio in modo che i servizi nell'ambiente dispongano delle autorizzazioni per eseguire le funzioni necessarie. Usare identità gestite in Microsoft Entra ID per automatizzare la creazione e la gestione delle identità del servizio, eliminando la gestione manuale delle credenziali. Un'identità gestita consente all'app Web di accedere in modo sicuro ai servizi di Azure, ad esempio Azure Key Vault e database. Facilita inoltre le integrazioni di pipeline CI/CD per le distribuzioni in app Azure Servizio. Tuttavia, in scenari come distribuzioni ibride o con sistemi legacy, continuare a usare le soluzioni di autenticazione locali per semplificare la migrazione. Transizione alle identità gestite quando il sistema è pronto per un approccio moderno alla gestione delle identità. Per altre informazioni, vedere Monitoraggio delle identità gestite.

Esempio: l'implementazione di riferimento mantiene il meccanismo di autenticazione locale per il database (nome utente e password). Di conseguenza, l'implementazione di riferimento archivia il segreto del database in Key Vault. L'app Web usa un'identità gestita (assegnata dal sistema) per recuperare i segreti da Key Vault.

Usare un archivio segreti centrale per gestire i segreti

Quando si sposta l'applicazione nel cloud, usare Azure Key Vault per archiviare in modo sicuro tutti questi segreti. Questo repository centralizzato offre archiviazione sicura, rotazione delle chiavi, controllo degli accessi e monitoraggio per i servizi che non supportano le identità gestite. Per le configurazioni dell'applicazione, è consigliabile app Azure Configurazione.

Esempio: l'implementazione di riferimento archivia i segreti seguenti in Key Vault: (1) nome utente e password del database PostgreSQL, (2) Password cache Redis e (3) il segreto client per l'ID Entra Microsoft associato all'implementazione msal.

Non inserire Key Vault nel flusso di richiesta HTTP

Caricare i segreti da Key Vault all'avvio dell'applicazione anziché durante ogni richiesta HTTP. Key Vault è destinato all'archiviazione e al recupero sicuro dei dati sensibili durante la distribuzione. L'accesso ad alta frequenza all'interno delle richieste HTTP può superare le funzionalità di velocità effettiva di Key Vault, causando limitazioni delle richieste e errori di codice di stato HTTP 429. Per altre informazioni, vedere Limiti delle transazioni di Key Vault.

Usare un metodo per accedere ai segreti in Key Vault

Quando si configura un'app Web per accedere ai segreti in Key Vault, sono disponibili due opzioni principali:

  • impostazione servizio app'app: Usa un'impostazione dell'app in servizio app per inserire il segreto direttamente come variabile di ambiente.

  • Riferimento diretto al segreto: fare riferimento direttamente al segreto all'interno del codice dell'applicazione. Aggiungere un riferimento specifico nel file delle proprietà dell'applicazione, ad esempio application.properties per le applicazioni Java, in modo che l'app comunichi con Key Vault.

È importante scegliere uno di questi metodi e attenersi a esso per semplicità ed evitare complessità non necessarie. Per l'integrazione di Key Vault con un'applicazione Spring, il processo prevede:

  1. Aggiungere la dipendenza Azure Spring Boot Starter per i segreti di Azure Key Vault nel file pom.xml.
  2. Configurare un endpoint di Key Vault nell'applicazione. Questa operazione può essere eseguita tramite il file application.properties o come variabile di ambiente.

Esempio: l'implementazione di riferimento usa un'impostazione dell'app in servizio app e inserisce segreti.

Usare endpoint privati

Usare endpoint privati in tutti gli ambienti di produzione per tutti i servizi di Azure supportati. Gli endpoint privati forniscono connessioni private tra le risorse in una rete virtuale di Azure e i servizi di Azure. Per impostazione predefinita, la comunicazione con la maggior parte dei servizi di Azure attraversa la rete Internet pubblica. Gli endpoint privati non richiedono modifiche al codice, configurazioni dell'app o stringa di connessione. Per altre informazioni, vedere Come creare un endpoint privato e Procedure consigliate per la sicurezza degli endpoint.

Esempio: l'implementazione di riferimento usa endpoint privati per Key Vault, cache di Azure per Redis e Database di Azure per PostgreSQL.

Usare un web application firewall

Tutto il traffico Internet in ingresso verso l'app Web deve passare attraverso un web application firewall per proteggersi da exploit Web comuni. Forzare tutto il traffico Internet in ingresso a passare attraverso il servizio di bilanciamento del carico pubblico, se disponibile, e il web application firewall. È possibile (1) usare l'endpoint privato di Frontdoor di Azure oppure (2) è possibile filtrare le richieste in base al valore dell'intestazione X-Azure-FDID .

La piattaforma servizio app e Java Spring possono filtrare in base al valore dell'intestazione. È consigliabile usare servizio app come prima opzione. Il filtro a livello di piattaforma impedisce alle richieste indesiderate di raggiungere il codice. È necessario configurare il traffico che si vuole passare attraverso il web application firewall. È possibile filtrare in base al nome host, all'IP client e ad altri valori. Per altre informazioni, vedere Mantenere il nome host HTTP originale.

Esempio: l'implementazione di riferimento usa un endpoint privato nell'ambiente di produzione e il X-Azure-FDID valore dell'intestazione nell'ambiente di sviluppo.

Configurare la sicurezza del database

Amministrazione istrator a livello di database concede le autorizzazioni per eseguire operazioni con privilegi. Le operazioni con privilegi includono la creazione e l'eliminazione di database, la modifica di schemi di tabella o la modifica delle autorizzazioni utente. Gli sviluppatori hanno spesso bisogno dell'accesso a livello di amministratore per gestire il database o risolvere i problemi.

  • Evitare autorizzazioni con privilegi elevati permanenti. Concedere agli sviluppatori l'accesso JIT per eseguire operazioni con privilegi. Con l'accesso JIT, gli utenti ricevono autorizzazioni temporanee per eseguire attività con privilegi.

  • Non assegnare autorizzazioni elevate all'applicazione. Non concedere l'accesso a livello di amministratore all'identità dell'applicazione. Configurare l'accesso con privilegi minimi per l'applicazione al database. Limita il raggio di esplosione di bug e violazioni della sicurezza. Sono disponibili due metodi principali per accedere al database PostgreSQL di Azure. È possibile usare l'autenticazione di Microsoft Entra o l'autenticazione PostgreSQL. Per altre informazioni, vedere JDBC con Azure PostgreSQL.

Ottimizzazione dei costi

L'ottimizzazione dei costi consiste nell'esaminare i modi per ridurre le spese non necessarie e il sovraccarico di gestione. Per altre informazioni, vedere Elenco di controllo per la revisione della progettazione per Ottimizzazione costi. Il modello Reliable Web App implementa tecniche di rightsizing, scalabilità automatica ed utilizzo efficiente delle risorse per un'app Web ottimizzata per i costi.

Diritti delle risorse per ogni ambiente

Comprendere i diversi livelli di prestazioni dei servizi di Azure e usare solo lo SKU appropriato per le esigenze di ogni ambiente. Gli ambienti di produzione necessitano di SKU che soddisfino i contratti di servizio (SLA), le funzionalità e la scalabilità necessarie per la produzione. Gli ambienti non di produzione in genere non richiedono le stesse funzionalità. Per un risparmio aggiuntivo, prendere in considerazione le opzioni dei prezzi di Sviluppo/test di Azure, le prenotazioni di Azure e i piani di risparmio di Azure per il calcolo.

Esempio: l'implementazione di riferimento non usa i prezzi di Sviluppo/test di Azure perché i prezzi di Sviluppo/test di Azure non coprono nessuno dei componenti. Database di Azure per PostgreSQL è un candidato primo per un'istanza riservata in base al piano di mantenere questo motore di database per almeno un anno dopo questa convergenza iniziale nella fase cloud. L'implementazione di riferimento ha un parametro facoltativo che distribuisce SKU diversi. Un parametro di ambiente indica al modello Terraform di selezionare gli SKU di sviluppo. Il codice seguente illustra questo parametro di ambiente.

azd env set APP_ENVIRONMENT prod

Contoso Fiber usa modelli IaC (Infrastructure-as-Code) per le distribuzioni di sviluppo e produzione. L'ambiente di sviluppo è ottimizzato per i costi, usando gli SKU meno costosi necessari per lo sviluppo di app. L'ambiente di produzione usa SKU che soddisfano i requisiti dell'obiettivo del livello di servizio di produzione dell'applicazione.

Usare la scalabilità automatica

La scalabilità automatica automatizza la scalabilità orizzontale per gli ambienti di produzione. Scalabilità automatica in base alle metriche delle prestazioni. I trigger di prestazioni di utilizzo della CPU sono un buon punto di partenza se non si conoscono i criteri di ridimensionamento dell'applicazione. È necessario configurare e adattare i trigger di ridimensionamento (CPU, RAM, rete e disco) in modo che corrispondano al comportamento dell'applicazione Web. Non ridimensionare verticalmente per soddisfare le frequenti variazioni della domanda. È meno conveniente. Per altre informazioni, vedere Scalabilità nel servizio app Azure e scalabilità automatica in Microsoft Azure.

Usare le risorse in modo efficiente

L'utilizzo efficiente delle risorse comporta la gestione strategica e l'allocazione delle risorse cloud per soddisfare le esigenze dell'organizzazione senza sprechi. Riduce al minimo le spese necessarie per le risorse e il sovraccarico di gestione. Per migliorare l'efficienza delle risorse, seguire queste raccomandazioni:

  • Usare i servizi condivisi. La centralizzazione e la condivisione di determinate risorse offre l'ottimizzazione dei costi e un sovraccarico di gestione inferiore. Ad esempio, posizionare le risorse di rete condivise nella rete virtuale hub.

  • Eliminare gli ambienti inutilizzati. Eliminare gli ambienti non di produzione dopo ore o durante le festività per ottimizzare i costi. È possibile usare l'infrastruttura come codice per eliminare le risorse di Azure e l'intero ambiente. Rimuovere la dichiarazione della risorsa da eliminare dal modello di infrastruttura come codice. Eseguire il backup dei dati necessari in un secondo momento. Comprendere le dipendenze dalla risorsa che si sta eliminando. Se sono presenti dipendenze, potrebbe essere necessario aggiornare o rimuovere anche tali risorse.

  • Funzionalità di colocazione. Dove è disponibile capacità di riserva, colocare le risorse e le funzionalità dell'applicazione in una singola risorsa di Azure. Ad esempio, più app Web possono usare un singolo server (piano servizio app) o una singola cache può supportare più tipi di dati.

Eccellenza operativa

L'eccellenza operativa copre i processi operativi che distribuiscono un'applicazione e la mantengono in esecuzione nell'ambiente di produzione. Per altre informazioni, vedere l'elenco di controllo per la revisione della progettazione per l'eccellenza operativa. Il modello Reliable Web App implementa l'infrastruttura come codice per le distribuzioni dell'infrastruttura e il monitoraggio per l'osservabilità.

Configurare il monitoraggio

Per la traccia e il debug, è necessario abilitare la registrazione per diagnosticare quando una richiesta ha esito negativo. I dati di telemetria raccolti dall'applicazione devono soddisfare le esigenze operative. È necessario raccogliere almeno i dati di telemetria sulle metriche di base. È consigliabile raccogliere informazioni sul comportamento degli utenti che consentono di applicare miglioramenti mirati.

Monitorare le metriche di base

Il carico di lavoro deve monitorare le metriche di base. Le metriche importanti da misurare includono la velocità effettiva delle richieste, la durata media delle richieste, gli errori e il monitoraggio delle dipendenze. È consigliabile usare Application Insights per raccogliere questi dati di telemetria.

Esempio: l'implementazione di riferimento usa Application Insights. Application Insights viene abilitato tramite Terraform come parte della configurazione app_settings di servizio app.

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

Spring Boot registra diverse metriche di base in Application Insights, ad esempio java virtual machine (JVM), CPU, Tomcat e altri. Application Insights raccoglie automaticamente dai framework di registrazione, ad esempio Log4j e Logback. Per altre informazioni, vedi:

Creare dati di telemetria e metriche personalizzati in base alle esigenze

Oltre alle metriche di base in Application Insights, è necessario creare dati di telemetria personalizzati per comprendere meglio gli utenti e le relative interazioni con l'applicazione. Application Insights consente di raccogliere dati di telemetria personalizzati ed è anche possibile raccogliere metriche personalizzate tramite Micrometer. L'obiettivo è ottenere informazioni più approfondite sulle prestazioni e sul comportamento dell'utente dell'applicazione, in modo da poter prendere decisioni e miglioramenti più informati.

Raccogliere metriche basate su log

Tenere traccia delle metriche basate su log per ottenere maggiore visibilità sull'integrità e sulle metriche essenziali dell'applicazione. È possibile usare query Linguaggio di query Kusto (KQL) in Application Insights per trovare e organizzare i dati. Per altre informazioni, vedere metriche basate su log di app Azure lication Insights e metriche basate su log e metriche preaggregate in Application Insights.

Abilitare la diagnostica della piattaforma

Un'impostazione di diagnostica in Azure consente di specificare i log e le metriche della piattaforma da raccogliere e dove archiviarli. I log della piattaforma sono log predefiniti che forniscono informazioni di diagnostica e controllo. È possibile abilitare la diagnostica della piattaforma per la maggior parte dei servizi di Azure, ma ogni servizio definisce le proprie categorie di log. Diversi servizi di Azure hanno categorie di log da scegliere.

  • Abilitare la diagnostica per tutti i servizi supportati. I servizi di Azure creano automaticamente i log della piattaforma, ma il servizio non li archivia automaticamente. È necessario abilitare l'impostazione di diagnostica per ogni servizio ed è necessario abilitarla per ogni servizio di Azure che supporta la diagnostica.

  • Inviare la diagnostica alla stessa destinazione dei log applicazioni. Quando si abilita la diagnostica, selezionare i log da raccogliere e dove inviarli. È necessario inviare i log della piattaforma alla stessa destinazione dei log dell'applicazione in modo da poter correlare i due set di dati.

Esempio: l'implementazione di riferimento usa Terraform per abilitare la diagnostica di Azure in tutti i servizi supportati. Il codice Terraform seguente configura le impostazioni di diagnostica per il servizio app.

# Configure Diagnostic Settings for App Service
resource "azurerm_monitor_diagnostic_setting" "app_service_diagnostic" {
  name                           = "app-service-diagnostic-settings"
  target_resource_id             = azurerm_linux_web_app.application.id
  log_analytics_workspace_id     = var.log_analytics_workspace_id
  #log_analytics_destination_type = "AzureDiagnostics"

  enabled_log {
    category_group = "allLogs"

  }

  metric {
    category = "AllMetrics"
    enabled  = true
  }
}

Usare una pipeline CI/CD

Per automatizzare le distribuzioni, integrare una pipeline di integrazione continua/distribuzione continua (CI/CD). Questa automazione deve estendersi direttamente dal controllo del codice sorgente ai vari ambienti di servizio app, tra cui test, gestione temporanea e produzione. Usare Azure Pipelines se si usa Azure DevOps o GitHub Actions per i progetti GitHub.

  • Integrare unit test. Classificare in ordine di priorità l'esecuzione e il passaggio di tutti gli unit test (usando JUnit) all'interno della pipeline prima di qualsiasi distribuzione in servizio app. Incorporare strumenti di code quality e coverage come SonarQube e JaCoCo per ottenere una copertura completa dei test.

  • Adottare il framework di simulazione Java. Per i test che coinvolgono endpoint esterni, usare framework di simulazione Java (Mockito, EasyMock). Questi framework consentono di creare endpoint simulati. Eliminano la necessità di configurare endpoint esterni reali e di garantire condizioni di test uniformi in ambienti diversi.

  • Eseguire analisi di sicurezza. Usare test di sicurezza delle applicazioni statici (SAST) per individuare i difetti di sicurezza e gli errori di codifica nel codice sorgente. Inoltre, eseguire l'analisi della composizione software (SCA) per esaminare librerie e componenti di terze parti per individuare i rischi per la sicurezza. Gli strumenti per queste analisi sono facilmente integrati sia in GitHub che in Azure DevOps.

Gestire le distribuzioni di produzione

È necessario definire linee guida per la distribuzione del codice nell'ambiente di produzione e creare un processo di approvazione per tutte le distribuzioni di produzione.

Efficienza prestazionale

L'efficienza delle prestazioni è la capacità di dimensionare il carico di lavoro per soddisfare in modo efficiente le richieste poste dagli utenti. Per altre informazioni, vedere l'elenco di controllo per la revisione della progettazione per l'efficienza delle prestazioni. Il modello Reliable Web App usa il modello Cache-Aside per ridurre al minimo la latenza per i dati altamente richiesti.

Usare il modello Cache-Aside

Il modello Cache-Aside è una strategia di memorizzazione nella cache che migliora la gestione dei dati in memoria. Il modello assegna all'applicazione la responsabilità di gestire le richieste di dati e garantire la coerenza tra la cache e un archivio permanente, ad esempio un database. Quando l'app Web riceve una richiesta di dati, cerca prima la cache. Se i dati sono mancanti, vengono recuperati dal database, risponde alla richiesta e aggiorna la cache di conseguenza. Questo approccio riduce i tempi di risposta e migliora la velocità effettiva e riduce la necessità di aumentare la scalabilità. Inoltre, rafforza la disponibilità del servizio riducendo il carico nell'archivio dati primario e riducendo al minimo i rischi di interruzione.

Abilitazione della memorizzazione nella cache.

Per abilitare la memorizzazione nella cache, aggiungere il spring-boot-starter-cache pacchetto come dipendenza nel pom.xml file. Il spring-boot-starter-cache pacchetto configura la cache Redis con valori predefiniti. È consigliabile aggiornare tali valori nel application.properties file o nelle variabili di ambiente per soddisfare le esigenze dell'app Web. Ad esempio, ( spring.cache.redis.time-to-live rappresentato in millisecondi) determina la quantità di tempo in cui i dati rimangono nella cache prima della rimozione. È necessario fornire un valore che soddisfi le esigenze dell'app Web. Infine, è necessario memorizzare nella cache i dati necessari nel codice usando l'annotazione @Cacheable .

Memorizzare nella cache i dati con esigenze elevate

Classificare in ordine di priorità la memorizzazione nella cache per i dati a cui si accede più di frequente. Identificare i punti dati chiave che determinano il coinvolgimento degli utenti e le prestazioni del sistema. Implementare strategie di memorizzazione nella cache specifiche per queste aree per ottimizzare l'efficacia del modello Cache-Aside, riducendo significativamente la latenza e il carico del database. Usare Monitoraggio di Azure per tenere traccia della CPU, della memoria e dell'archiviazione del database. Queste metriche consentono di determinare se è possibile usare uno SKU di database più piccolo.

Mantenere aggiornati i dati della cache

Pianificare gli aggiornamenti regolari della cache per la sincronizzazione con le modifiche più recenti del database. Determinare la frequenza di aggiornamento ottimale in base alla volatilità dei dati e alle esigenze degli utenti. Questa procedura garantisce che l'applicazione usi il modello Cache-Aside per fornire sia l'accesso rapido che le informazioni correnti.

Garantire la coerenza dei dati

Implementare meccanismi per aggiornare la cache immediatamente dopo qualsiasi operazione di scrittura del database. Usare aggiornamenti basati su eventi o classi di gestione dei dati dedicate per garantire la coerenza della cache. La sincronizzazione coerente della cache con le modifiche del database è fondamentale per il modello Cache-Aside.

Esempio: il codice seguente aggiunge il spring-boot-starter-cache pacchetto come dipendenza al file per abilitare la pom.xml memorizzazione nella cache.

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

L'implementazione di riferimento abilita Redis nel application.properties file.

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

Il codice seguente definisce un metodo denominato getAccountDetail. Il metodo recupera le impostazioni utente associate a un determinato nome utente. L'annota @Cacheable(value="account-details", key="#id") il getAccountDetailmetodo e indica all'app Web di memorizzare nella cache le impostazioni utente in una cache.

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

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

        return accountDetail;
    }

Prestazioni del database

Le prestazioni del database possono influire sulle prestazioni e sulla scalabilità di un'applicazione. È importante testare le prestazioni del database per assicurarsi che sia ottimizzato. Alcune considerazioni chiave includono la scelta dell'area cloud corretta, il pool di connessioni, il modello cache-aside e l'ottimizzazione delle query.

  • Testare gli hop di rete. Lo spostamento di un'applicazione nel cloud può introdurre hop di rete e latenza aggiuntivi per il database. È consigliabile verificare la disponibilità di hop aggiuntivi introdotti dal nuovo ambiente cloud.

  • Stabilire una linea di base per le prestazioni. È consigliabile usare le metriche delle prestazioni locali come baseline iniziale per confrontare le prestazioni dell'applicazione nel cloud.

  • Usare Application Insights. Application Insights fornisce metriche dettagliate sulle query di database e sulle interfacce JDBC. È consigliabile usarlo per assicurarsi che un database convertito soddisfi i contratti di servizio o per trovare le query che è necessario ottimizzare. Non è mai consigliabile usare Dynamic SQL perché crea problemi di sicurezza e prestazioni.

  • Usare i pool di connessioni. È consigliabile usare i pool di connessioni JDBC e ottimizzarli in base alle metriche e ai contratti di servizio (TPS) delle transazioni al secondo. È consigliabile usare gli strumenti di monitoraggio delle prestazioni del database per testare e valutare le prestazioni del database in condizioni di carico.

Passaggi successivi

Distribuire l'implementazione di riferimento seguendo le istruzioni nel repository GitHub. Usare le risorse seguenti per altre informazioni sulle procedure consigliate e sulla migrazione del cloud.

Procedure consigliate per il cloud. Per indicazioni sull'adozione e l'architettura di Azure, vedere:

  • Cloud Adoption Framework. Framework che consente all'organizzazione di preparare ed eseguire una strategia per creare soluzioni in Azure.
  • Framework ben progettato. Set di principi guida che è possibile usare per migliorare la qualità di un carico di lavoro.

Per le applicazioni che richiedono un obiettivo del livello di servizio più elevato, vedere carichi di lavoro cruciali.

Linee guida per la migrazione. Gli strumenti e le risorse seguenti consentono di eseguire la migrazione di risorse locali ad Azure:

  • Azure Migrate offre un servizio di migrazione, modernizzazione e ottimizzazione semplificato per Azure che gestisce la valutazione e la migrazione di app Web, SQL Server e macchine virtuali.
  • Guide alla migrazione del database di Azure offre risorse per vari tipi di database e strumenti progettati per lo scenario di migrazione.
  • app Azure acceleratore di zona di destinazione del servizio fornisce indicazioni per la protezione avanzata e il ridimensionamento delle distribuzioni servizio app.