Tutoriel : Générer une application web Spring Boot Java avec Azure App Service sur Linux et Azure Cosmos DB

Remarque

Pour les applications Spring, nous vous recommandons d’utiliser Azure Spring Apps. Toutefois, vous pouvez toujours utiliser Azure App Service comme destination. Pour obtenir des conseils, consultez l’Aide de destination de la charge de travail Java.

Ce didacticiel vous guide au travers du processus de création, de configuration, de déploiement et de mise à l’échelle des applications web Java sur Azure. Lorsque vous avez terminé, une application Spring Boot stocke des données dans Azure Cosmos DB s’exécutant sous Azure App Service sur Linux.

Application Spring Boot stockant les données dans Azure Cosmos DB

Dans ce tutoriel, vous allez apprendre à :

  • Crée une base de données Azure Cosmos DB.
  • Connecter un exemple d’application à la base de données et la tester localement
  • Déployer un exemple d’application dans Azure
  • Diffuser des journaux de diagnostic à partir d’App Service
  • Ajouter des instances supplémentaires pour effectuer un scale-out de l’exemple d’application

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Prérequis

Cloner l’exemple d’application de liste de tâches et préparer le référentiel

Ce didacticiel utilise un exemple d’application de liste de tâches avec une interface utilisateur web qui appelle une API REST Spring reposant sur Spring Data pour Azure Cosmos DB. Le code pour l’application est disponible sur GitHub. Pour en savoir plus sur l’écriture d’applications Java à l’aide de Spring et Azure Cosmos DB, consultez les articles Didacticiel Spring Boot Starter avec Azure Cosmos DB for NoSQL et Démarrage rapide de Spring Data pour Azure Cosmos DB.

Exécutez les commandes suivantes dans votre terminal pour cloner l’exemple de dépôt et configurer l’exemple d’environnement d’application.

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/* .

Créer une base de données Azure Cosmos DB

Suivez ces étapes pour créer une base de données Azure Cosmos DB dans votre abonnement. L’application de liste de tâches se connecte à cette base de données et stocke ses données lors de l’exécution, entraînant la persistance de l’application, quel que soit l’endroit d’où vous l’exécutez.

  1. Connectez-vous à votre interface Azure CLI et définissez votre abonnement si vous en avez plusieurs connectés à vos informations d’identification.

    az login
    az account set -s <your-subscription-id>
    
  2. Créez un groupe de ressources Azure, en notant son nom.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Créez une base de données Azure Cosmos du type GlobalDocumentDB. Le nom de l’instance Azure Cosmos DB doit être uniquement composé de lettres minuscules. Notez le champ documentEndpoint de la réponse à la commande.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Obtenez votre clé d’Azure Cosmos DB pour vous connecter à l’application. Conservez primaryMasterKey et documentEndpoint à proximité, car vous en aurez besoin à l’étape suivante.

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

Configurer les propriétés de l’application de liste de tâches

Ouvrez un terminal sur votre ordinateur. Copiez l’exemple de fichier de script dans le référentiel cloné afin que vous puissiez le personnaliser pour la base de données Azure Cosmos DB que vous venez de créer.

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

Modifiez .scripts/set-env-variables.sh dans votre éditeur favori et fournissez les informations de connexion Azure Cosmos DB. Pour la configuration d’App Service Linux, utilisez la même région qu’avant (your-resource-group-region) ainsi que le groupe de ressources (your-azure-group-name) utilisé lors de la création de la base de données Azure Cosmos DB. Choisissez un WEBAPP_NAME unique, dans la mesure où il ne peut pas être identique à un nom d’application web au sein d’un déploiement 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>

Ensuite, exécutez le script :

source .scripts/set-env-variables.sh

Ces variables d’environnement sont utilisées dans application.properties au sein de l’application de liste de tâches. Les champs dans le fichier de propriétés définissent une configuration de référentiel par défaut pour 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’exemple d’application utilise ensuite l’annotation @Document importée depuis com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document pour configurer un type d’entité à stocker et gérer par Azure Cosmos DB :

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

Exécution de l'exemple d'application

Utilisez Maven pour exécuter l’exemple.

mvn package spring-boot:run

La sortie doit se présenter comme suit.

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)

Vous pouvez accéder à l’application Spring TODO localement en utilisant ce lien une fois l’application lancée : http://localhost:8080/.

Accéder à l’application Spring TODO localement

Si vous voyez des exceptions à la place du message « Started TodoApplication », vérifiez que le script bash de l’étape précédente a correctement exporté les variables d’environnement et que les valeurs sont correctes pour la base de données Azure Cosmos DB créée.

Configurer un déploiement Azure

Ouvrez le fichier pom.xmldans le répertoireinitial/spring-boot-todo et ajoutez la configuration suivante du plugin Azure Web App pour 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>

Déployer vers App Service sous Linux

Utilisez l’objectif Maven mvn azure-webapp:deploy pour déployer l’application de liste de tâches dans Azure App Service sous 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] ------------------------------------------------------------------------

La sortie contient l’URL vers votre application déployée (dans cet exemple, https://spring-todo-app.azurewebsites.net). Vous pouvez copier cette URL dans votre navigateur web ou exécuter la commande suivante dans la fenêtre de votre terminal pour charger votre application.

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

Vous devez voir l’application exécutée avec l’URL distante dans la barre d’adresses :

Application Spring Boot s’exécutant avec une URL distante

Diffuser les journaux de diagnostic

Pour accéder aux journaux de la console générés à l’intérieur du code de votre application dans App Service, activez la journalisation des diagnostics en exécutant la commande suivante dans Cloud Shell :

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

Les valeurs possibles pour --level sont : Error, Warning, Info et Verbose. Chaque niveau suivant comprend le niveau précédent. Par exemple : Error comprend uniquement les messages d’erreur et Verbose comprend tous les messages.

Une fois la journalisation des diagnostics activée, exécutez la commande suivante pour voir le flux de journal :

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

Si vous ne voyez pas les journaux d’activité de la console, attendez 30 secondes et vérifiez à nouveau.

Notes

Vous pouvez également inspecter les fichiers journaux à partir du navigateur sur https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Pour arrêter le streaming des journaux à tout moment, appuyez sur Ctrl+C.

Scale-out de l’application de liste de tâches

Effectuez un scale-out de l’application en ajoutant un autre worker :

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

Nettoyer les ressources

Si vous n’avez pas besoin de ces ressources pour un autre didacticiel (voir Étapes suivantes), vous pouvez les supprimer en exécutant la commande suivante dans Cloud Shell :

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

Étapes suivantes

Azure pour les développeurs JavaSpring Boot, Spring Data pour Azure Cosmos DB, Azure Cosmos DB et App Service Linux.

Découvrez-en plus sur l’exécution des applications Java sur App Service sur Linux dans le guide du développeur.

Découvrez comment sécuriser votre application avec un domaine personnalisé et un certificat.