Esercitazione: Creare un'app Web Java Spring Boot con il Servizio app di Azure in Linux e Azure Cosmos DB

Questa esercitazione illustra il processo di creazione, configurazione, distribuzione e ridimensionamento di app Web Java in Azure. Al termine, si avrà un'applicazione Spring Boot che memorizza i dati in Azure Cosmos DB in esecuzione nel servizio app di Azure in Linux.

Spring Boot application storing data in Azure Cosmos DB

In questa esercitazione verranno illustrate le procedure per:

  • Creare un database Cosmos DB.
  • Connettere un'app di esempio al database e testarla nell'ambiente locale
  • Distribuire l'app di esempio in Azure
  • Eseguire lo streaming dei log di diagnostica dal servizio app
  • Aggiungere altre istanze per aumentare il numero di istanze per l'app di esempio

Se non si dispone di una sottoscrizione di Azure, creare un account gratuito di Azure prima di iniziare.

Prerequisiti

Clonare l'app TODO di esempio e preparare il repository

Questa esercitazione usa un'app di elenco TODO di esempio con un'interfaccia utente Web che chiama un'API REST Spring supportata da Spring Data Azure Cosmos DB. Il codice per l'app è disponibile in GitHub. Per altre informazioni sulla scrittura di app Java con Spring e Cosmos DB, vedere l'esercitazione Come usare Spring Boot Starter con l'API SQL di Azure Cosmos DB e la Guida di avvio rapido di Spring Data Azure Cosmos DB.

Eseguire i comandi seguenti nel terminale per clonare il repository di esempio e configurare l'ambiente dell'app di esempio.

git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
cd e2e-java-experience-in-app-service-linux-part-2
yes | cp -rf .prep/* .

Creare un'istanza di Azure Cosmos DB

Seguire questi passaggi per creare un database Azure Cosmos DB nella propria sottoscrizione. L'app di elenco TODO si connetterà a questo database e archivierà i propri dati durante l'esecuzione, rendendo persistente lo stato dell'applicazione indipendentemente dalla posizione in cui viene eseguita.

  1. Accedere all'interfaccia della riga di comando di Azure e facoltativamente impostare la sottoscrizione se sono presenti più sottoscrizioni collegate alle proprie credenziali di accesso.

    az login
    az account set -s <your-subscription-id>
    
  2. Creare un gruppo di risorse di Azure prendendo nota del nome.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Creare un'istanza di Azure Cosmos DB di tipo GlobalDocumentDB. Il nome dell'istanza di Cosmos DB deve contenere solo lettere minuscole. Prendere nota del campo documentEndpoint nella risposta del comando.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Ottenere la chiave di Azure Cosmos DB per la connessione all'app. Tenere a portata di mano primaryMasterKey, documentEndpoint perché saranno necessari nel passaggio successivo.

    az cosmosdb keys list -g <your-azure-group-name> -n <your-azure-COSMOSDB-name>
    

Configurare le proprietà dell'app TODO

Aprire un terminale nel computer. Copia il file di script di esempio nel repository clonato per poterlo personalizzare per il database Cosmos DB appena creato.

cd initial/spring-todo-app
cp set-env-variables-template.sh .scripts/set-env-variables.sh

Modificare .scripts/set-env-variables.sh in un editor qualsiasi e specificare le informazioni di connessione di Azure Cosmos DB. Per la configurazione del servizio app in Linux usare la stessa area di prima (your-resource-group-region) e il gruppo di risorse (your-azure-group-name) usato durante la creazione del database di Cosmos DB. Per WEBAPP_NAME scegliere un nome univoco, dato che non è possibile duplicare un nome di app Web in una distribuzione di Azure.

export COSMOSDB_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
export COSMOSDB_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
export COSMOSDB_DBNAME=<put-your-COSMOS-DB-name-here>

# App Service Linux Configuration
export RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
export WEBAPP_NAME=<put-your-Webapp-name-here>
export REGION=<put-your-REGION-here>

Eseguire quindi lo script:

source .scripts/set-env-variables.sh

Queste variabili di ambiente vengono usate in application.properties nell'app di elenco TODO. I campi nel file delle proprietà definiscono una configurazione di repository predefinita per Spring Data:

azure.cosmosdb.uri=${COSMOSDB_URI}
azure.cosmosdb.key=${COSMOSDB_KEY}
azure.cosmosdb.database=${COSMOSDB_DBNAME}
@Repository
public interface TodoItemRepository extends DocumentDbRepository<TodoItem, String> {
}

L'app di esempio usa quindi l'annotazione @Document importata da com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document per impostare un tipo di entità da archiviare e gestire con Cosmos DB:

@Document
public class TodoItem {
    private String id;
    private String description;
    private String owner;
    private boolean finished;

Eseguire l'app di esempio

Usare Maven per eseguire l'esempio.

mvn package spring-boot:run

L'output sarà simile al seguente.

bash-3.2$ mvn package spring-boot:run
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 


[INFO] SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html]
2018-10-28 15:04:32.101  INFO 7673 --- [           main] c.m.azure.documentdb.DocumentClient      : Initializing DocumentClient with serviceEndpoint [https://sample-cosmos-db-westus.documents.azure.com:443/], ConnectionPolicy [ConnectionPolicy [requestTimeout=60, mediaRequestTimeout=300, connectionMode=Gateway, mediaReadMode=Buffered, maxPoolSize=800, idleConnectionTimeout=60, userAgentSuffix=;spring-data/2.0.6;098063be661ab767976bd5a2ec350e978faba99348207e8627375e8033277cb2, retryOptions=com.microsoft.azure.documentdb.RetryOptions@6b9fb84d, enableEndpointDiscovery=true, preferredLocations=null]], ConsistencyLevel [null]
[INFO] AnnotationMBeanExporter - Registering beans for JMX exposure on startup
[INFO] TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
[INFO] TodoApplication - Started TodoApplication in 45.573 seconds (JVM running for 76.534)

È possibile accedere all'app TODO di Spring nell'ambiente locale usando questo collegamento dopo aver avviato l'app: http://localhost:8080/.

Access Spring TODO app locally

Se vengono visualizzate eccezioni al posto del messaggio "Started TodoApplication", verificare che lo script bash nel passaggio precedente abbia esportato correttamente le variabili di ambiente e che i valori siano corretti per il database di Azure Cosmos DB creato.

Configurare la distribuzione di Azure

Aprire il pom.xml file nella directory e aggiungere il plug-in dell'appinitial/spring-boot-todo Web di Azure seguente per la configurazione di Maven.

<plugins> 

    <!--*************************************************-->
    <!-- Deploy to Java SE in App Service Linux           -->
    <!--*************************************************-->
       
    <plugin>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-webapp-maven-plugin</artifactId>
        <version>2.5.0</version>
        <configuration>
            <schemaVersion>v2</schemaVersion>

            <!-- Web App information -->
            <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
            <appName>${WEBAPP_NAME}</appName>
            <region>${REGION}</region>
            <pricingTier>P1v2</pricingTier>
            <!-- Java Runtime Stack for Web App on Linux-->
            <runtime>
                 <os>linux</os>
                 <javaVersion>Java 8</javaVersion>
                 <webContainer>Java SE</webContainer>
             </runtime>
             <deployment>
                 <resources>
                 <resource>
                     <directory>${project.basedir}/target</directory>
                     <includes>
                     <include>*.jar</include>
                     </includes>
                 </resource>
                 </resources>
             </deployment>

            <appSettings>
                <property>
                    <name>COSMOSDB_URI</name>
                    <value>${COSMOSDB_URI}</value>
                </property> 
                <property>
                    <name>COSMOSDB_KEY</name>
                    <value>${COSMOSDB_KEY}</value>
                </property>
                <property>
                    <name>COSMOSDB_DBNAME</name>
                    <value>${COSMOSDB_DBNAME}</value>
                </property>
                <property>
                    <name>JAVA_OPTS</name>
                    <value>-Dserver.port=80</value>
                </property>
            </appSettings>

        </configuration>
    </plugin>           
    ...
</plugins>

Eseguire la distribuzione nel servizio app in Linux

Usare l'obiettivo Maven mvn azure-webapp:deploy per distribuire l'app TODO nel servizio app di Azure in Linux.


# Deploy
bash-3.2$ mvn azure-webapp:deploy
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-webapp-maven-plugin:2.5.0:deploy (default-cli) @ spring-todo-app ---
Auth Type: AZURE_CLI
Default subscription: xxxxxxxxx
Username: xxxxxxxxx
[INFO] Subscription: xxxxxxxxx
[INFO] Creating App Service Plan 'ServicePlanb6ba8178-5bbb-49e7'...
[INFO] Successfully created App Service Plan.
[INFO] Creating web App spring-todo-app...
[INFO] Successfully created Web App spring-todo-app.
[INFO] Trying to deploy artifact to spring-todo-app...
[INFO] Successfully deployed the artifact to https://spring-todo-app.azurewebsites.net
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:19 min
[INFO] Finished at: 2019-11-06T15:32:03-07:00
[INFO] Final Memory: 50M/574M
[INFO] ------------------------------------------------------------------------

L'output contiene l'URL per l'applicazione distribuita, in questo esempio https://spring-todo-app.azurewebsites.net. È possibile copiare l'URL nel Web browser o eseguire questo comando nella finestra del terminale per caricare l'app.

explorer https://spring-todo-app.azurewebsites.net

Verrà visualizzata l'app in esecuzione con l'URL remoto nella barra degli indirizzi:

Spring Boot application running with a remote URL

Eseguire lo streaming dei log di diagnostica

Per accedere ai log della console generati dall'interno del codice dell'applicazione nel servizio app, attivare la registrazione diagnostica eseguendo il comando seguente in Cloud Shell:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

I valori possibili per --level sono: Error, Warning, Info e Verbose. Ogni livello successivo include il livello precedente. Ad esempio, Error include solo i messaggi di errore, mentre Verbose include tutti i messaggi.

Dopo aver attivato la registrazione diagnostica, eseguire il comando seguente per visualizzare il flusso di registrazione:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

Se i log di console non sono immediatamente visibili, controllare nuovamente dopo 30 secondi.

Nota

È anche possibile esaminare i file di log nel browser all'indirizzo https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Per interrompere lo streaming dei log in qualsiasi momento, digitare Ctrl+C.

Aumentare le istanze dell'app TODO

Aumentare le istanze dell'applicazione aggiungendo un altro ruolo di lavoro:

az appservice plan update --number-of-workers 2 \
   --name ${WEBAPP_PLAN_NAME} \
   --resource-group <your-azure-group-name>

Pulire le risorse

Se queste risorse non sono necessarie per un'altra esercitazione (vedere Passaggi successivi), è possibile eliminarle eseguendo questo comando in Cloud Shell:

az group delete --name <your-azure-group-name> --yes

Passaggi successivi

Azure per sviluppatori JavaSpring Boot, Spring Data per Cosmos DB, Azure Cosmos DB e Servizio app in Linux.

Altre informazioni sull'esecuzione di app Java nel Servizio app in Linux sono disponibili nella Guida per gli sviluppatori.