Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa guida descrive gli elementi da tenere presenti quando si vuole eseguire la migrazione di un'applicazione Spring Boot esistente a Azure App Service.
Prima della migrazione
Per garantire una corretta migrazione, prima di iniziare completare i passaggi di valutazione e inventario descritti nelle sezioni seguenti.
Passare a una piattaforma supportata
Il servizio app offre versioni specifiche di Java SE. Per garantire la compatibilità, eseguire la migrazione dell'applicazione a una delle versioni supportate dell'ambiente corrente prima di continuare con uno dei passaggi rimanenti. Assicurarsi di testare completamente la configurazione risultante. Usare la versione stabile più recente della distribuzione Linux in questi test.
Annotazioni
Questa convalida è particolarmente importante se il server corrente è in esecuzione in un JDK non supportato, ad esempio Oracle JDK o IBM OpenJ9.
Per ottenere la versione corrente Java, accedere al server di produzione ed eseguire il comando seguente:
java -version
In Azure App Service, i file binari per Java 8 vengono forniti da EclipseTemo. Per Java 11, 17 e tutte le future versioni LTS di Java, il servizio app fornisce il Microsoft Build of OpenJDK. Questi file binari sono disponibili gratuitamente per il download nei siti seguenti:
Inventario delle risorse esterne
Identificare le risorse esterne, ad esempio le origini dati, i broker dei messaggi JMS e gli URL di altri servizi. Nelle applicazioni Spring Boot è in genere possibile trovare la configurazione per tali risorse nella cartella src/main/directory , in un file denominato in genere application.properties o application.yml. Controllare inoltre le variabili di ambiente della distribuzione di produzione per eventuali impostazioni di configurazione pertinenti.
Banche dati
Per un'applicazione Spring Boot, le stringhe di connessione sono generalmente presenti nei file di configurazione quando dipende da un database esterno. Di seguito è riportato un esempio di file application.properties :
spring.datasource.url=jdbc:mysql://localhost:3306/mysql_db
spring.datasource.username=dbuser
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Di seguito è riportato un esempio di file application.yaml :
spring:
data:
mongodb:
uri: mongodb://mongouser:deepsecret@mongoserver.contoso.com:27017
Vedere la documentazione di Spring Data per altri scenari possibili di configurazione:
Broker di messaggi JMS
Identificare il broker o i broker in uso cercando nel file di configurazione del build (in genere, un pom.xml o build.gradle) che elenca le dipendenze pertinenti.
Ad esempio, un'applicazione Spring Boot che usa ActiveMQ in genere conterrà questa dipendenza nel relativo file pom.xml :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
Le applicazioni Spring Boot che usano broker commerciali in genere contengono dipendenze direttamente dalle librerie di driver JMS dei broker. Ecco un esempio di un file build.gradle :
dependencies {
...
compile("com.ibm.mq:com.ibm.mq.allclient:9.4.0.5")
...
}
Dopo aver identificato i broker in uso, trova le impostazioni corrispondenti. Nelle applicazioni Spring Boot è in genere possibile trovarli nei file application.properties e application.yml nella directory dell'applicazione.
Annotazioni
Microsoft consiglia di usare il flusso di autenticazione più sicuro disponibile. Il flusso di autenticazione descritto in questa procedura, ad esempio per database, cache, messaggistica o servizi di intelligenza artificiale, richiede un livello di attendibilità molto elevato nell'applicazione e comporta rischi non presenti in altri flussi. Usare questo flusso solo quando le opzioni più sicure, ad esempio le identità gestite per le connessioni senza password o senza chiave, non sono valide. Per le operazioni del computer locale, preferire le identità utente per le connessioni senza password o senza chiave.
Ecco un esempio di ActiveMQ da un file application.properties :
spring.activemq.brokerurl=broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true
spring.activemq.user=admin
spring.activemq.password=<password>
Per altre informazioni sulla configurazione di ActiveMQ, vedere la documentazione relativa alla messaggistica spring boot.
Ecco un esempio IBM MQ da un file application.yaml :
ibm:
mq:
queueManager: qm1
channel: dev.ORDERS
connName: localhost(14)
user: admin
password: <password>
Per altre informazioni sulla configurazione di IBM MQ, vedere la documentazione relativa ai componenti IBM MQ Spring.
Identificare le cache esterne
Identificare eventuali cache esterne in uso. Spesso, Redis viene usato tramite Spring Data Redis. Per informazioni sulla configurazione, vedere la documentazione di Spring Data Redis .
Determinare se i dati della sessione vengono memorizzati nella cache tramite Spring Session cercando la rispettiva configurazione (in Java o XML).
Fornitori di identità
Identificare tutti i provider di identità usati dall'applicazione. Per informazioni su come configurare i provider di identità, consultare gli argomenti seguenti:
- Per la configurazione di OAuth2, vedere le informazioni di riferimento su Spring Security.
- Per la configurazione di Spring Security di Auth0, vedere la documentazione di Auth0 Spring Security.
- Per la configurazione di PingFederate Spring Security, vedere le istruzioni Auth0 PingFederate.
Tutte le altre risorse esterne
Non è possibile documentare tutte le possibili dipendenze esterne in questa guida. È responsabilità del team verificare che ogni dipendenza esterna dell'applicazione possa essere soddisfatta dopo una migrazione del servizio app.
Segreti di inventario
Password e stringhe sicure
Controllare tutte le proprietà e i file di configurazione e tutte le variabili di ambiente nei server di produzione per verificare la presenza di stringhe segrete e password. In un'applicazione Spring Boot è probabile che tali stringhe si trovino in application.properties o application.yml.
Certificati di inventario
Documentare tutti i certificati usati per gli endpoint SSL pubblici o per la comunicazione con i database back-end e altri sistemi. È possibile visualizzare tutti i certificati nei server di produzione eseguendo il comando seguente:
keytool -list -v -keystore <path to keystore>
Determinare se e come viene usato il file system
Qualsiasi utilizzo del file system nel server applicazioni richiede modifiche della configurazione o, in casi rari, dell'architettura. È possibile identificare alcuni o tutti gli scenari seguenti.
Contenuto statico di sola lettura
Se l'applicazione attualmente serve contenuto statico, è necessario un percorso alternativo. È consigliabile spostare contenuto statico in Azure Blob Storage e aggiungere Azure Front Door per i download rapidi a livello globale. Per altre informazioni, vedere Static website hosting in Azure Storage e Integrate un account Azure Storage con Azure Front Door.
Casi speciali
Alcuni scenari di produzione possono richiedere ulteriori modifiche o imporre limitazioni aggiuntive. Sebbene tali scenari siano poco frequenti, è importante assicurarsi che siano inapplicabili all'applicazione o risolti correttamente.
Determinare se l'applicazione si basa su attività programmate
I processi pianificati, ad esempio le attività dell'utilità di Quartz Scheduler o i processi Cron, non possono essere usati con App Service. Il servizio app non impedisce la distribuzione interna di un'applicazione contenente attività pianificate. Tuttavia, se l'applicazione viene ampliata, lo stesso processo pianificato può essere eseguito più di una volta per ogni periodo pianificato. Questa situazione può provocare conseguenze indesiderate.
Fare l'inventario di tutte le attività programmate, sia all'interno che all'esterno del processo dell'applicazione.
Determinare se l'applicazione contiene codice specifico del sistema operativo
Se l'applicazione contiene codice con dipendenze dal sistema operativo host, è necessario effettuare il refactoring per rimuovere tali dipendenze. Ad esempio, potrebbe essere necessario sostituire qualsiasi uso di / o \ nei percorsi del file system con File.Separator o Paths.get se l'applicazione è in esecuzione in Windows.
Identificare tutti i processi/daemon esterni in esecuzione nei server di produzione
I processi in esecuzione all'esterno del server applicazioni, ad esempio i daemon di monitoraggio, dovranno essere migrati altrove o eliminati.
Identificare la gestione delle richieste non-HTTP o porte multiple
Il servizio app supporta solo un singolo endpoint HTTP su una singola porta. Se l'applicazione è in ascolto su più porte o accetta richieste che usano protocolli diversi da HTTP, non usare Azure App Service.
Migrazione
Parametrizzare la configurazione
Assicurarsi che tutte le coordinate delle risorse esterne(ad esempio le stringhe di connessione del database) e altre impostazioni personalizzabili possano essere lette dalle variabili di ambiente. Se si esegue la migrazione di un'applicazione Spring Boot, tutte le impostazioni di configurazione devono essere già esterne. Per altre informazioni, vedere Externalized Configuration (Configurazione esterna) nella documentazione di Spring Boot.
Ecco un esempio che fa riferimento a una SERVICEBUS_CONNECTION_STRING variabile di ambiente da un file application.properties :
spring.jms.servicebus.connection-string=${SERVICEBUS_CONNECTION_STRING}
spring.jms.servicebus.topic-client-id=contoso1
spring.jms.servicebus.idle-timeout=10000
Configurare un piano di servizio app
Nell'elenco dei piani di servizio disponibili selezionare il piano le cui specifiche soddisfano o superano quelle dell'hardware di produzione corrente.
Annotazioni
Se si prevede di eseguire distribuzioni di staging/canary o di usare gli slot di distribuzione, il piano App Service deve includere la capacità aggiuntiva necessaria. È consigliabile usare piani Premium o superiori per le applicazioni Java.
Creare e distribuire app Web
È necessario creare un'app Web nel piano di servizio app (scegliendo "Java SE" come stack di runtime) per ogni file JAR eseguibile che si intende eseguire.
Applicazioni Maven
Se l'applicazione viene compilata da un file POM Maven, usare il plug-in Webapp per Maven per creare l'app Web e distribuire l'applicazione. Per altre informazioni, vedere Quickstart: Creare un'app Java in Azure App Service.
Applicazioni non Maven
Se non è possibile usare il plug-in Maven, sarà necessario effettuare il provisioning dell'app Web tramite altri meccanismi, ad esempio:
- Portale Azure
- Azure CLI
- Azure PowerShell
Dopo aver creato l'app Web, usare uno dei meccanismi di distribuzione disponibili per distribuire l'applicazione. Se possibile, l'applicazione deve essere caricata in /home/site/wwwroot/app.jar. Se non si vuole rinominare il file JAR in app.jar, è possibile caricare uno script della shell con il comando per eseguire il file JAR. Incollare quindi il percorso completo di questo script nella casella di testo File di avvio nella sezione Configurazione del portale. Lo script di avvio non viene eseguito dalla directory in cui si trova. Pertanto, usare sempre percorsi assoluti per fare riferimento ai file nello script di avvio , ad esempio . java -jar /home/myapp/myapp.jar
Eseguire la migrazione delle opzioni di runtime JVM
Se l'applicazione richiede opzioni di runtime specifiche, usare il meccanismo più appropriato per specificarli.
Configurare un dominio personalizzato e SSL
Se l'applicazione Web sarà visibile in un dominio personalizzato, sarà necessario eseguirne il mapping a tale dominio. Per altre informazioni, vedere Tutorial: Eseguire il mapping di un nome DNS personalizzato esistente a Azure App Service.
Sarà quindi necessario associare il certificato SSL per quel dominio alla Web App del servizio App Service. Per ulteriori informazioni, consultare Proteggere un nome DNS personalizzato con un binding SSL in Azure App Service.
Importare certificati backend
Tutti i certificati per la comunicazione con i sistemi back-end, ad esempio i database, devono essere resi disponibili al servizio app. Per altre informazioni, vedere Aggiungere un certificato SSL nel servizio app.
Eseguire la migrazione di coordinate di risorse esterne e altre impostazioni
Seguire questa procedura per eseguire la migrazione delle stringhe di connessione e di altre impostazioni.
Annotazioni
Per tutte le impostazioni dell'applicazione Spring Boot con parametri con variabili nella sezione Parametrizza la configurazione , tali variabili di ambiente devono essere definite nella configurazione dell'applicazione. Tutte le impostazioni dell'applicazione Spring Boot non parametrizzate in modo esplicito con le variabili di ambiente possono comunque essere sottoposte a override tramite Configurazione applicazione. Per esempio:
spring.jms.servicebus.connection-string=${CUSTOMCONNSTR_SERVICE_BUS}
spring.jms.servicebus.topic-client-id=contoso1
spring.jms.servicebus.idle-timeout=1800000
Eseguire la migrazione dei processi pianificati
Per eseguire processi pianificati in Azure, è consigliabile usare un trigger Timer per Azure Functions. Non è necessario eseguire la migrazione del codice del lavoro in una funzione. La funzione può semplicemente richiamare un URL nell'applicazione per attivare il processo. Se tali esecuzioni di processo devono essere richiamate dinamicamente e/o rilevate centralmente, è consigliabile usare Spring Batch.
In alternativa, è possibile creare un'app per la logica con un trigger Ricorrenza per richiamare l'URL senza scrivere codice all'esterno dell'applicazione. Per altre informazioni, vedere Overview - Che cos'è Azure Logic Apps? e Creare, pianificare ed eseguire attività e flussi di lavoro ricorrenti con il trigger Ricorrenza in Azure Logic Apps.
Annotazioni
Per evitare un uso improprio, potrebbe essere necessario assicurarsi che l'endpoint di chiamata del processo richieda le credenziali. In questo caso, la funzione di trigger dovrà fornire le credenziali.
Eseguire la migrazione e abilitare il provider di identità
Se l'applicazione richiede l'autenticazione o l'autorizzazione, assicurarsi che siano configurate per accedere al provider di identità usando le indicazioni seguenti:
- Se il provider di identità è Microsoft Entra ID, non è necessario apportare modifiche.
- Se il provider di identità è una foresta Active Directory on-premises, considerare l'implementazione di una soluzione di identità ibrida con Microsoft Entra ID. Per altre informazioni, vedere la documentazione delle identità ibride.
- Se il provider di identità è un'altra soluzione locale, ad esempio PingFederate, consultare l'argomento Installazione personalizzata di Microsoft Entra Connect per configurare la federazione con Microsoft Entra ID. In alternativa, è consigliabile usare Spring Security per usare il provider di identità tramite OAuth2/OpenID Connect o SAML.
Riavvio e test di fumo
Infine, sarà necessario riavviare l'app Web per applicare tutte le modifiche alla configurazione. Al termine del riavvio, verificare che l'applicazione venga eseguita correttamente.
Dopo la migrazione
Ora che è stata eseguita la migrazione dell'applicazione a Azure App Service verificare che funzioni come previsto. Dopo aver completato questa operazione, sono disponibili alcune raccomandazioni che consentono di rendere l'applicazione più nativa del cloud.
Consigli
Se si è scelto di usare la directory /home per l'archiviazione file, prendere in considerazione di sostituirla con Azure Storage.
Se si dispone della configurazione nella directory /home che contiene stringhe di connessione, chiavi SSL e altre informazioni segrete, è consigliabile usare Azure Key Vault e/o parameter injection con le impostazioni dell'applicazione laddove possibile.
Prendere in considerazione l'uso degli slot di distribuzione per distribuzioni affidabili senza tempi di inattività.
Progettare e implementare una strategia DevOps. Per mantenere l'affidabilità aumentando la velocità di sviluppo, considerare l'automatizzazione delle distribuzioni e dei test con Azure Pipelines. Quando si usano gli slot di distribuzione, è possibile automatizzare la distribuzione in uno slot seguito dallo scambio di slot.
Progettare e implementare una strategia di continuità aziendale e ripristino di emergenza. Per le applicazioni cruciali, prendere in considerazione un'architettura di distribuzione in più aree.