Panoramica di Java in App contenitore di Azure
Le app contenitore di Azure possono eseguire qualsiasi applicazione Java in contenitori nel cloud offrendo opzioni flessibili per la distribuzione delle applicazioni.
Quando si usano App contenitore per le applicazioni Java in contenitori, si ottiene:
Ridimensionamento conveniente: quando si usa il piano a consumo, le app Java possono essere ridimensionate a zero. Il ridimensionamento in caso di scarsa domanda per l'app comporta automaticamente un calo dei costi per i progetti.
Opzioni di distribuzione: App contenitore di Azure si integra con Buildpacks, che consente di eseguire la distribuzione direttamente da una compilazione Maven, tramite file di artefatti o con il proprio Dockerfile.
Adattamento automatico della memoria (anteprima): App contenitore ottimizza il modo in cui Java Virtual Machine (JVM) gestisce la memoria, rendendo disponibile la maggior quantità di memoria possibile per le applicazioni Java.
Compilare variabili di ambiente (anteprima): è possibile configurare coppie chiave-valore personalizzate per controllare la compilazione dell'immagine Java dal codice sorgente.
Questo articolo illustra in dettaglio le informazioni necessarie durante la compilazione di applicazioni Java in App contenitore di Azure.
Tipi distribuzione
L'esecuzione di applicazioni in contenitori implica in genere la necessità di creare un Dockerfile per l'applicazione, ma l'esecuzione di applicazioni Java in App contenitore offre alcune opzioni.
Tipo | Descrizione | Usa Buildpacks | Usa un Dockerfile |
---|---|---|---|
Compilazione del codice sorgente | È possibile eseguire la distribuzione direttamente in App contenitore dal codice sorgente. | Sì | No |
Compilazione di artefatti | È possibile creare una compilazione Maven da distribuire in App contenitore | Sì | No |
Dockerfile | È possibile creare manualmente il Dockerfile e assumere il controllo completo sulla distribuzione. | No | Sì |
Nota
Le distribuzioni Buildpacks supportano JDK versioni 8, 11, 17 e 21.
Tipi di applicazione
Differenti tipi di applicazioni vengono implementati come singola app contenitore o come processo di App contenitore. Usare la tabella seguente per decidere il tipo di applicazione più adatto allo scenario.
Gli esempi elencati in questa tabella non sono concepiti per essere esaustivi, ma per comprendere meglio l'intento dei differenti tipi di applicazione.
Type | Esempi | Implementare come... |
---|---|---|
Applicazioni Web ed endpoint API | Spring Boot, Quarkus, Apache Tomcat e Jetty | Una singola app contenitore |
Applicazioni console, attività pianificate, strumenti di esecuzione attività, processi batch | SparkJobs, attività ETL, processo Spring Batch, processo della pipeline Jenkins | Un processo di App contenitore |
Debug
Durante il debug dell'applicazione Java in App contenitore, assicurarsi di esaminare l'agente In-Process Java per i messaggi di debug del flusso di log e della console.
Risoluzione dei problemi
Tenere presenti gli elementi seguenti durante lo sviluppo di applicazioni Java:
Risorse predefinite: per impostazione predefinita, un'app ha una metà CPU e 1 GB disponibili.
Processi senza stato: man mano che l'app contenitore viene ridimensionata e ridotta, vengono creati e arrestati nuovi processi. Assicurarsi di pianificare in anticipo in modo da scrivere i dati nell'archiviazione condivisa, ad esempio database e condivisioni file system. Non aspettatevi che i file scritti direttamente nel file system del contenitore siano disponibili per qualsiasi altro contenitore.
La scalabilità a zero è l'impostazione predefinita: se è necessario assicurarsi che una o più istanze dell'applicazione siano in esecuzione continuamente, assicurarsi di definire una regola di scalabilità per soddisfare al meglio le esigenze.
Comportamento imprevisto: se l'app contenitore non riesce a compilare, avviare o eseguire, verificare che il percorso dell'artefatto sia impostato correttamente nel contenitore.
Problemi di supporto di Buildpack: se Buildpack non supporta le dipendenze o la versione di Java necessaria, creare un Dockerfile personalizzato per distribuire l'app. Per informazioni di riferimento, è possibile visualizzare un Dockerfile di esempio.
Segnali SIGTERM e SIGINT: per impostazione predefinita, la JVM gestisce segnali
SIGTERM
eSIGINT
e non li passa all'applicazione, a meno che non intercetti questi segnali e li gestisca di conseguenza nell'applicazione. App contenitore usa siaSIGTERM
cheSIGINT
per il controllo del processo. Se non si acquisiscono questi segnali e l'applicazione termina in modo imprevisto, è possibile che questi segnali non vengano persi a meno che non vengano mantenuti nella risorsa di archiviazione.Accesso alle immagini del contenitore: se si usa la distribuzione dell'artefatto o del codice sorgente in combinazione con il registro predefinito, non si ha accesso diretto alle immagini del contenitore.
Monitoraggio
Tutti gli strumenti di osservabilità standard funzionano con l'applicazione Java. Quando si compilano le applicazioni Java da eseguire in App contenitore, tenere presenti gli elementi seguenti:
Metriche: le metriche di Java Virtual Machine (JVM) sono fondamentali per monitorare l'integrità e le prestazioni delle applicazioni Java. I dati raccolti includono informazioni dettagliate sull'utilizzo della memoria, la Garbage Collection, il numero di thread della JVM. È possibile controllare le metriche per garantire l'integrità e la stabilità delle applicazioni.
Registrazione: inviare messaggi di errore e applicazione a
stdout
ostderror
in modo che possano essere visualizzati nel flusso di log. Evitare di accedere direttamente al file system del contenitore, come è comune quando si usano i servizi di registrazione più diffusi.Configurazione di monitoraggio delle prestazioni: distribuire i servizi di monitoraggio delle prestazioni come contenitore separato nell'ambiente App contenitore in modo che possa accedere direttamente all'applicazione.
Diagnostica
App contenitore di Azure offre strumenti di diagnostica predefiniti esclusivamente per sviluppatori Java. Questo supporto semplifica il debug e la risoluzione dei problemi delle applicazioni Java in esecuzione in App contenitore di Azure per migliorare l'efficienza e la facilità.
- Livello di logger dinamico: consente di accedere e controllare livelli differenti di dettagli del log senza modifiche al codice o forzare il riavvio dell'app. Per informazioni di riferimento, è possibile visualizzare Impostare livello di logger dinamico.
Scalabilità
Se è necessario assicurarsi che le richieste provenienti dalle applicazioni front-end raggiungano lo stesso server o che l'app front-end sia suddivisa tra più contenitori, assicurarsi di abilitare sessioni permanenti.
Sicurezza
Il runtime di App contenitore termina SSL all'interno dell'ambiente App contenitore.
Gestione della memoria
Per ottimizzare la gestione della memoria nell'applicazione Java, è possibile assicurarsi che Adattamento della memoria JVM sia abilitato nell'app.
La memoria viene misurata in gibibyte (Gi) e coppie di core CPU. La tabella seguente illustra l'intervallo di risorse disponibili per l'app contenitore.
Threshold | Core CPU | Memoria in Gibibytes (Gi) |
---|---|---|
Minimo | 0.25 | 0.5 |
Massimo | 4 | 8 |
I core sono disponibili in incrementi di 0,25 core, con memoria disponibile a un rapporto 2:1. Ad esempio, se sono necessari 1.25 core, è disponibile 2.5 Gi di memoria per l'app contenitore.
Nota
Per le app che usano JDK versioni 9 e precedenti, assicurarsi di definire impostazioni di memoria JVM personalizzate in modo che corrispondano all'allocazione di memoria in App contenitore di Azure.
Supporto dei componenti Spring
App contenitore di Azure offre supporto per i componenti Spring seguenti come servizi gestiti:
Eureka Server per Spring: la registrazione e l'individuazione dei servizi sono requisiti chiave per la gestione di un elenco di istanze dell'applicazione in tempo reale. L'applicazione usa questo elenco per il routing e il bilanciamento del carico delle richieste in ingresso. La configurazione manuale di ogni client richiede tempo e introduce la possibilità di errori umani. Eureka Server semplifica la gestione dell'individuazione dei servizi funzionando come registro dei servizi in cui i microservizi possono registrarsi e individuare altri servizi all'interno del sistema.
Config Server per Spring: Config Server fornisce una gestione centralizzata della configurazione esterna per i sistemi distribuiti. Questo componente progettato per affrontare le sfide della gestione delle impostazioni di configurazione in più microservizi in un ambiente nativo del cloud.
Amministratore per Spring: il componente Amministratore per Spring gestito fornisce un'interfaccia amministrativa progettata per le applicazioni Web Spring Boot con endpoint di attuatore. Un componente gestito fornisce l'integrazione e la gestione all'app contenitore consentendo di associare l'app contenitore al componente Amministratore per Spring.