Scalabilità con sicurezza, monitoraggio e automazione end-to-end

Durante la progettazione di applicazioni, è necessario determinare come adattarsi alle modifiche nel carico di lavoro, ripristinare da errori imprevisti, ridurre al minimo i rischi per la sicurezza e così via. Anche se si potrebbe iniziare con un approccio di prova ed errore, questo richiede tempo ad altri obiettivi dell'organizzazione e potrebbe influire negativamente sulla nostra reputazione. Azure fornisce indicazioni sull'architettura necessarie per iniziare. È anche necessario creare un'applicazione scalabile, dalla sicurezza all'avanguardia e al ridimensionamento automatico ai servizi di supporto per i dati, la messaggistica, la memorizzazione nella cache, il monitoraggio delle prestazioni e l'automazione. Molti di questi servizi di supporto si basano anche sul software open source più diffuso, ad esempio PostgreSQL, Redis, JMS e Kafka, in modo da non essere bloccati in soluzioni proprietarie.

Diagramma con l'intestazione

Si esaminerà ora alcuni servizi e funzionalità principali di Azure e come usarli per creare applicazioni Java scalabili.

Estendere le funzionalità per le applicazioni Java : database e messaggistica

Oltre a offrire diverse opzioni per l'esecuzione del codice Java, Azure offre un'ampia gamma di servizi completamente gestiti per supportare le esigenze del database, tra cui Database di Azure per PostgreSQL, Database di Azure per MySQL, MongoDB Atlas, Azure Cosmos DB, database SQL di Azure e Istanza gestita di SQL di Azure. Lo stesso vale per la messaggistica, con opzioni che includono bus di servizio di Azure, Hub eventi di Azure e Apache Kafka per Confluent Cloud.

bus di servizio di Azure livello Premium supporta JMS, il modello di programmazione del servizio di messaggistica Java. Indipendentemente dal fatto che le applicazioni siano in esecuzione in macchine virtuali, in Kubernetes o nei servizi PaaS completamente gestiti, è possibile effettuare rapidamente il provisioning e usare questi servizi di messaggistica e dati completamente gestiti usando client open source, SDK Java di Azure, Spring Starters e integrazioni server applicazioni. Tutti forniscono la conformità, la disponibilità e l'affidabilità garantiscono che ci si aspetterebbe da Microsoft e Azure. Molti sviluppatori Java e Spring vogliono usare librerie idiotiche per semplificare le connessioni ai servizi cloud preferiti. Microsoft gestisce un elenco completo di librerie, driver e moduli che consentono di interagire facilmente con i servizi di Azure tra dati, messaggistica, cache, archiviazione, eventi, directory e gestione dei segreti. Per altre informazioni, vedere la Guida per sviluppatori di Spring Cloud Azure.

Diagramma che elenca le funzionalità di Spring Cloud Azure e i servizi di Azure associati.

Diagramma che mostra le categorie di funzionalità e i servizi della piattaforma Azure associati supportati da varie librerie Java, driver e moduli Spring.

Zero-Trust - Rete sicura

È possibile proteggere le applicazioni Java distribuendole in un'Rete virtuale di Azure, ovvero il blocco predefinito fondamentale per le proprie reti private in Azure. Le reti virtuali consentono a molti tipi di risorse di Azure di comunicare in modo sicuro tra loro, con Internet e con le reti e i sistemi locali. È possibile usare una rete virtuale per isolare le applicazioni e supportare i servizi back-end da Internet e inserirli nelle reti private. È possibile presupporre il controllo completo dell'ingresso e dell'uscita per le applicazioni e i sistemi back-end.

Diagramma dell'architettura di riferimento di Azure Spring Apps.

Zero-Trust - Comunicazioni sicure end-to-end

L'implementazione di comunicazioni sicure come parte di un'architettura della soluzione può risultare complessa. Molte aziende ruotano manualmente i certificati o creano soluzioni personalizzate per automatizzare il provisioning e la configurazione. Anche in questo caso, esistono ancora rischi di esfiltrazione dei dati, ad esempio la copia non autorizzata o il trasferimento dei dati.

Con Azure è possibile proteggere le comunicazioni end-to-end o terminare la sicurezza a livello di trasporto in qualsiasi punto di comunicazione. È anche possibile automatizzare il provisioning e la configurazione per tutte le risorse di Azure necessarie per proteggere le comunicazioni. Per informazioni sul funzionamento di Azure Spring Apps, vedere Proteggere le comunicazioni end-to-end per le app Spring Boot - nell'ambiente Zero Trust. Il processo è simile per gli altri servizi di calcolo di Azure che è possibile usare per eseguire le applicazioni Java.

In base al principio di "non considerare mai attendibili, verificare sempre e senza credenziali", Zero Trust consente di proteggere tutte le comunicazioni eliminando certificati sconosciuti e non gestiti e considerando attendibili solo i certificati condivisi verificando l'identità prima di concedere l'accesso a tali certificati. È possibile usare qualsiasi tipo di certificato TLS/SSL, inclusi i certificati rilasciati da un'autorità di certificazione, i certificati di convalida estesi, i certificati con caratteri jolly con supporto per un numero qualsiasi di sottodomini o certificati autofirmato per gli ambienti di sviluppo e test.

Le app Java o Spring Boot possono caricare in modo sicuro i certificati da Azure Key Vault (descritto di seguito). Con Azure Key Vault è possibile controllare l'archiviazione e la distribuzione dei certificati per ridurre la perdita accidentale. Le applicazioni e i servizi possono accedere in modo sicuro ai certificati usando identità gestite, controllo degli accessi in base al ruolo e il principio dei privilegi minimi. Questo caricamento sicuro è basato sul provider JCA (Java Cryptography Architecture) di Azure Key Vault.

Diagramma dell'architettura per comunicazioni end-to-end sicure per le app Spring Boot.

Zero-Trust - Gestire i segreti

Molte applicazioni Java si connettono ai servizi di supporto usando URL e credenziali: informazioni che, se esposte, possono essere usate per ottenere l'accesso non autorizzato ai dati sensibili. L'incorporamento di tali informazioni in un'app stessa rappresenta un rischio enorme per la sicurezza per molti motivi, tra cui l'individuazione tramite un repository di codice. Molti sviluppatori esternalizzano tali credenziali usando variabili di ambiente, in modo che più applicazioni possano caricarle, ma questo sposta solo il rischio dal codice stesso all'ambiente di esecuzione.

Diagramma con l'intestazione

Azure Key Vault offre un modo migliore, più sicuro e sicuro per proteggere i segreti. Offre il controllo completo sull'archiviazione e la distribuzione dei segreti dell'applicazione, usando il controllo degli Controllo di accesso accessi in base al ruolo e il principio dei privilegi minimi per limitare l'accesso. Si mantiene il controllo sui segreti dell'applicazione, ma è sufficiente concedere alle applicazioni l'autorizzazione per usarli in base alle esigenze. All'avvio dell'applicazione, prima di concedere l'accesso ai segreti, l'applicazione esegue l'autenticazione con Microsoft Entra ID e Azure Key Vault autorizza l'uso del controllo degli accessi in base al ruolo di Azure. Azure Key Vault include funzionalità di controllo completo e include due livelli di servizio: Standard, che esegue la crittografia con una chiave software e un livello Premium, che include chiavi protette dal modulo di protezione hardware.

Autenticazione e autorizzazione dell'utente finale

La maggior parte delle applicazioni Java aziendali richiede l'autenticazione e l'autorizzazione degli utenti, che è possibile implementare usando Microsoft Entra ID , una soluzione completa di gestione delle identità e degli accessi con sicurezza integrata. Gli account utente finale possono essere identità dell'organizzazione o identità di social networking da Facebook, Twitter o Gmail usando Microsoft Entra ID e Azure Active Directory B2C. È possibile implementare soluzioni basate su MICROSOFT Entra ID usando Microsoft Authentication Library per Java o Spring Boot Starter per Microsoft Entra. È anche possibile usare qualsiasi provider di identità di propria scelta, ad esempio ForgeRock, Auth0, Ping o Okta.

Monitorare end-to-end

Con Azure è possibile monitorare le applicazioni Java end-to-end usando qualsiasi strumento e piattaforma. In alternativa, è possibile implementare il monitoraggio nativo completamente gestito, incluso il monitoraggio delle prestazioni dell'applicazione (APM), usando Application Insights, una funzionalità di Monitoraggio di Azure. Offre un supporto avanzato per Java, Spring e framework come Micrometer e Spring Boot, consentendo di identificare e risolvere rapidamente i problemi. Le funzionalità includono streaming di metriche live, frequenza delle richieste e rilevamento del tempo di risposta, traccia degli eventi e tassi di dipendenza esterni: tutto ciò che è necessario monitorare la disponibilità, le prestazioni, l'affidabilità e l'utilizzo delle applicazioni Java in esecuzione in Azure o in locale.

È possibile monitorare end-to-end aggregando log e metriche in Log Analytics, uno strumento nella portale di Azure, che può essere usato per modificare ed eseguire query sui log e i dati delle metriche in Monitoraggio di Azure. È possibile scrivere una query che restituisce un set di record e quindi usare Log Analytics per ordinarli, filtrarli e analizzarli. In alternativa, è possibile scrivere una query più avanzata per eseguire un'analisi statistica e visualizzare i risultati in un grafico, come potrebbe essere necessario per identificare una determinata tendenza. Indipendentemente dal fatto che si usino i risultati delle query in modo interattivo o con altre funzionalità di Monitoraggio di Azure, ad esempio avvisi di query di log o cartelle di lavoro, Log Analytics è uno strumento utile per scrivere e testare le query.

Ciò premesso, ci rendiamo conto che i clienti che stanno portando le applicazioni Java in Azure potrebbero voler continuare a usare gli stessi strumenti APM che usano per monitorare le applicazioni locali. Per supportare questo utilizzo, abbiamo collaborato con New Relic, AppDynamics, Dynatrace ed Elastic per integrare le soluzioni di monitoraggio con app Azure Service e Azure Spring Apps. Gli agenti di monitoraggio vengono eseguiti side-by-side con il codice e gli agenti vengono installati e aggiornati automaticamente. Quando si esegue la distribuzione in App Azure Container, servizio Azure Kubernetes o Macchine virtuali, è possibile eseguire uno qualsiasi di questi agenti (tra cui New Relic, AppDynamics, Dynatrace, Elastic e Datadog) insieme alle applicazioni, ma è necessario installarli e gestirli autonomamente. Analogamente, è possibile monitorare end-to-end aggregando log e metriche in Elastic e Splunk.

Diagramma con l'intestazione

Ci rendiamo anche conto che molti clienti vogliono continuare a usare Grafana per eseguire query, visualizzare, inviare avvisi e comprendere le metriche. Per questo motivo, abbiamo collaborato con Grafana Labs per distribuire Grafana gestita di Azure, un servizio completamente gestito che consente ai clienti di eseguire Grafana in modo nativo in Azure. Il servizio semplifica la distribuzione di istanze Grafana sicure e scalabili e la connessione a origini dati open source, cloud e di terze parti per la visualizzazione e l'analisi. Il servizio è ottimizzato per origini dati native di Azure come Monitoraggio di Azure e Azure Esplora dati e include integrazioni di monitoraggio delle prestazioni delle applicazioni con servizi di calcolo di Azure come app Azure Service, Azure Spring Apps, servizio Azure Kubernetes, Splunk, Datadog e Azure Macchine virtuali.

Accelerare le applicazioni Java usando la memorizzazione nella cache

Man mano che i carichi di lavoro per le applicazioni Java aumentano, è possibile migliorare le prestazioni usando cache di Azure per Redis per implementare un livello di memorizzazione nella cache in memoria per i risultati delle query, gli stati della sessione e il contenuto statico. È un ottimo modo per migliorare la velocità effettiva dell'applicazione e ridurre la latenza senza dover riprogettare il database sottostante. cache di Azure per Redis livelli Enterprise, sviluppati in collaborazione con Redis e completamente gestiti da Microsoft, è l'opzione di distribuzione più a disponibilità elevata e scalabile per l'esecuzione di Redis in Azure, incluse funzionalità come la replica geografica attiva, la gestione delle sessioni esterne e la ricerca e l'indicizzazione ad alta velocità.

Diagramma con l'intestazione

Scalabilità automatica

Tutti i servizi di calcolo di Azure per l'esecuzione di applicazioni Java supportano il ridimensionamento automatico (scalabilità automatica), che consente di ottimizzare l'efficienza dei costi e adattarsi ai carichi di lavoro in evoluzione senza pagare più capacità di quanto necessario. Dopo l'abilitazione, è possibile assicurarsi che la scalabilità automatica si occupi dell'infrastruttura sottostante e dei carichi di lavoro dell'applicazione.

Diagramma con l'intestazione

È possibile aumentare o ridurre automaticamente le istanze in base al carico o alla pianificazione. In modalità basata sul carico (o basato su metriche), le applicazioni vengono ridimensionate orizzontalmente alle risorse necessarie per gestire il carico, fino ai limiti impostati. Analogamente, quando il carico diminuisce, le risorse vengono ridimensionate orizzontalmente, senza mai scendere al di sotto dei minimi impostati.

In modalità basata su pianificazione, le applicazioni vengono ridimensionate e con scalabilità orizzontale in base a una pianificazione e limiti definiti. La modalità basata su pianificazione è utile per i carichi di lavoro che seguono un modello prevedibile e possono essere usati per stabilire una linea di base per un ridimensionamento più basato sul carico.

Automazione dall'idea alla produzione

Quando si spostano le applicazioni nel cloud, si vuole automatizzare tutto, in base alle esigenze per lo sviluppo Java su scala aziendale. È necessario prendere in considerazione il ridimensionamento automatico per gestire i carichi di lavoro dell'applicazione, come descritto in precedenza. È anche necessario ridimensionare e automatizzare l'ambiente cloud nel suo complesso, idealmente dall'idea alla produzione, tra cui come effettuare rapidamente il provisioning di nuovi ambienti per test, qa, produzione, distribuzioni blu/verde, espansione geografica e così via.

Diagramma che mostra le caselle provisioning, compilazione e distribuzione delle categorie con logo associati per gli strumenti descritti in questa sezione.

Azure consente di automatizzare dall'idea all'ambiente di produzione usando un'ampia gamma di strumenti e piattaforme. A livello generale, tali pipeline di automazione possono essere suddivise in tre categorie:

  • Pipeline di provisioning: è possibile effettuare il provisioning delle risorse di Azure usando Terraform, modelli di Azure Resource Manager (ARM), modelli Bicep o l'interfaccia della riga di comando di Azure, in base alle esigenze per creare script ripetibili per ambienti di rotazione e rotazione coerenti.

  • Creare pipeline: basate su strumenti come Maven o Gradle, come descritto in precedenza in questa documentazione.

  • Pipeline di distribuzione: è possibile usare GitHub Actions, Azure Pipelines, Jenkins Pipelines, GitLab Pipelines o l'interfaccia della riga di comando di Azure per automatizzare le distribuzioni di codice, incluse distribuzioni blu/verde che mantengono i sistemi critici nell'ambiente di produzione durante la distribuzione degli aggiornamenti del codice.

Continuare a usare procedure e sistemi esistenti

Durante la migrazione o la compilazione e la scalabilità delle applicazioni Java in Azure, è possibile usare gli investimenti esistenti in rete, monitoraggio, automazione, provider di identità, sistemi locali, strumenti di sviluppo e compilazione e librerie di app. La tabella seguente fornisce alcuni esempi:

Categoria Prodotti e servizi dell'ecosistema Java
Rete F5, Palo Alto, Cloudflare, Checkpoint, Infoblox
Monitoraggio New Relic, Dynatrace, AppDynamics, Elastic, Splunk
Automazione GitHub Actions, Azure Pipelines, Jenkins, GitLab
Provider di identità Microsoft Entra ID, ForgeRock, Auth0, Ping, Okta
Sistema locale Database (ad esempio Oracle DB o IBM DB2), messaggistica (ad esempio IBM MQ o TIBCO EMS), eventi (ad esempio Kafka), directory (ad esempio Microsoft Entra ID, OpenLDAP o IBM ID)
Strumenti di sviluppo IntelliJ, Visual Studio Code, Eclipse, Spring Tool Suite, Maven, Gradle

Architetture di riferimento

Il Centro architetture di Azure fornisce indicazioni per la creazione di soluzioni in Azure usando modelli e procedure stabiliti, tra cui come usare queste funzionalità. Queste architetture di riferimento si basano su quanto appreso dagli engagement dei clienti, prendendo in considerazione l'ottimizzazione dei costi, l'eccellenza operativa, l'efficienza delle prestazioni, l'affidabilità, la scalabilità, la sicurezza, il monitoraggio, i test di fumo e altro ancora. Indirizzano anche i componenti di progettazione della soluzione, ad esempio le zone di destinazione di Azure, gli ambienti per l'hosting dei carichi di lavoro di cui è stato effettuato il pre-provisioning tramite infrastruttura come codice, in base alle esigenze per abilitare le migrazioni di applicazioni Java e lo sviluppo di greenfield su scala aziendale.

Ecco ad esempio un acceleratore di zona di destinazione per Azure Spring Apps, che illustra come implementare una progettazione hub-spoke in cui App Spring di Azure viene distribuita in un singolo spoke dipendente dai servizi condivisi ospitati nell'hub. Questo progetto viene compilato con i componenti per ottenere i set di dati in Microsoft Azure Well-Architected Framework. Per esplorare un'implementazione di questa architettura, vedere il repository dell'acceleratore di zona di destinazione di Azure Spring Apps in GitHub. È possibile applicare lo stesso approccio a qualsiasi applicazione Java distribuita in qualsiasi destinazione di calcolo di Azure, ad esempio servizio app Azure, app di Azure Container o servizio Azure Kubernetes. Inoltre, se si sta esaminando la migrazione di applicazioni Java esistenti ad Azure, sono disponibili un set completo di guide alla migrazione e strategie consigliate.

Diagramma con l'intestazione

Passaggio successivo

Scegliere i servizi di Azure corretti per le applicazioni Java