Déployer une application Spring Boot sur Azure

Déployer une application de démarrage Spring sur Azure

1. introduction

Microsoft Azure offre maintenant un support Java assez solide.

Dans ce didacticiel, nous allons montrer comment faire fonctionner notre application Spring Boot sur la plate-forme Azure, étape par étape.

2. Dépendance et configuration Maven

Premièrement,we do need an Azure subscription to make use of the cloud services there; actuellement, nous pouvons créer un compte gratuithere.

Ensuite, connectez-vous à la plateforme et créez un principal de service à l'aide desAzure CLI:

> az login
To sign in, use a web browser to open the page \
https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.
> az ad sp create-for-rbac --name "app-name" --password "password"
{
    "appId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
    "displayName": "app-name",
    "name": "http://app-name",
    "password": "password",
    "tenant": "tttttttt-tttt-tttt-tttt-tttttttttttt"
}

Maintenantwe configure Azure service principal authentication settings in our Maven settings.xml, à l'aide de la section suivante, sous<servers>:


    azure-auth
    
        aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
        tttttttt-tttt-tttt-tttt-tttttttttttt
        password
        AZURE
    

Nous nous fierons à la configuration d'authentification ci-dessus lors du téléchargement de notre application Spring Boot sur la plate-forme Microsoft, en utilisantazure-webapp-maven-plugin.

Ajoutons le plugin Maven suivant auxpom.xml:


    com.microsoft.azure
    azure-webapp-maven-plugin
    1.1.0
    
        
    

Nous pouvons vérifier la dernière versionhere.

Un certain nombre de propriétés configurables pour ce plugin seront abordées dans l'introduction suivante.

3. Déployer une application de démarrage Spring sur Azure

Maintenant que nous avons configuré l'environnement, essayons de déployer notre application Spring Boot sur Azure.

Notre application répond par «hello azure!» lorsque nous accédons à «/hello»:

@GetMapping("/hello")
public String hello() {
    return "hello azure!";
}

La plate-forme permet désormais le déploiement d'applications Web Java pour Tomcat et Jetty. Avecazure-webapp-maven-plugin, nous pouvons déployer notre application directement sur des conteneurs Web pris en charge en tant qu'application par défaut (ROOT), ou déployer via FTP.

Notez que lorsque nous allons déployer l'application sur des conteneurs Web, nous devons la conditionner en tant qu'archive WAR. Pour rappel, nous avons un article présentanthow to deploy a Spring Boot WAR into Tomcat.

3.1. Déploiement de conteneur Web

Nous utiliserons la configuration suivante pourazure-webapp-maven-plugin si nous avons l'intention de déployer sur Tomcat sur une instance Windows:


    1.8
    tomcat 8.5
    

Pour une instance Linux, essayez la configuration suivante:


    tomcat 8.5-jre8
    

N'oublions pas l'authentification Azure:


    
        azure-auth
    
    spring-azure
    example
    

Lorsque nous déploierons notre application sur Azure, nous la verrons apparaître en tant qu'App Service. Nous avons donc spécifié ici la propriété<appName> pour nommer l'App Service. En outre, l'App Service, en tant que ressource, doit être détenu par unresource group container, donc<resourceGroup> est également requis.

Now we’re ready to pull the trigger using the azure-webapp:deploy Maven target, et nous verrons le résultat:

> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-example...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanssssssss-bbbb-0000'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
[INFO] Starting to deploy the war file...
[INFO] Successfully deployed Web App at \
https://spring-example.azurewebsites.net
...

Now we can access https://spring-example.azurewebsites.net/hello et voyez la réponse: "bonjour azur!".

Au cours du processus de déploiement, Azure a automatiquement créé un plan de service d'application pour nous. Consultez lesofficial document pour plus de détails sur les plans Azure App Service. Si nous avons déjà un plan App Service, nous pouvons définir la propriété<appServicePlanName> pour éviter d'en créer un nouveau:


    
    ServicePlanssssssss-bbbb-0000

3.2. Déploiement FTP

Pour déployer via FTP, nous pouvons utiliser la configuration:


    
        azure-auth
    
    spring-example
    example
    1.8

    ftp
    
        
            ${project.basedir}/target
            webapps
            
                *.war
            
        
    

Dans la configuration ci-dessus, nous faisons en sorte que le plugin localise le fichier WAR dans le répertoire$\{project.basedir}/target, et le déploie dans le répertoirewebapps du conteneur Tomcat.

Supposons que notre artefact final soit nomméazure-0.1.war,, nous verrons le résultat comme suit une fois que nous aurons commencé le déploiement:

> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-example...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanxxxxxxxx-xxxx-xxxx'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
...
[INFO] Finished uploading directory: \
/xxx/.../target/azure-webapps/spring-example --> /site/wwwroot
[INFO] Successfully uploaded files to FTP server: \
xxxx-xxxx-xxx-xxx.ftp.azurewebsites.windows.net
[INFO] Successfully deployed Web App at \
https://spring-example.azurewebsites.net

Notez qu'ici, nous n'avons pas déployé notre application en tant qu'application Web par défaut pour Tomcat, nous ne pouvons donc y accéder que via «https://spring-example.azurewebsites.net/azure-0.1/hello». Le serveur vous répondra «bonjour d’azur! comme prévu.

4. Déployer avec les paramètres d'application personnalisés

La plupart du temps, notre application Spring Boot nécessite un accès aux données pour fournir des services. Azure prend désormais en charge des bases de données telles que SQL Server, MySQL et PostgreSQL.

Par souci de simplicité, nous utiliserons son MySQL intégré à l'application comme source de données, car sa configuration est assez similaire à celle des autres services de base de données Azure.

4.1. Activer MySQL In-App sur Azure

Puisqu'il n'y a pas de ligne unique pour créer une application Web avec MySQL intégré à l'application activé, nous devons d'abord créer l'application Web à l'aide de la CLI:

az group create --location japanwest --name bealdung-group
az appservice plan create --name example-plan --resource-group bealdung-group --sku B1
az webapp create --name example-webapp --resource-group example-group \
  --plan example-plan --runtime java|1.8|Tomcat|8.5

Alorsenable MySQL in App inthe portal:

image

Une fois MySQL In-App activé, nous pouvons trouver la base de données par défaut, l'URL de la source de données et les informations de compte par défaut dans un fichier nomméMYSQLCONNSTR_xxx.txt sous le répertoire/home/data/mysql du système de fichiers.

4.2. Application d'amorçage printanier utilisant Azure In-App MySQL

Ici, pour les besoins de démonstration, nous créons une entitéUser et deux endpoints utilisés pourregister etlistUsers:

@PostMapping("/user")
public String register(@RequestParam String name) {
    userRepository.save(userNamed(name));
    return "registered";
}

@GetMapping("/user")
public Iterable userlist() {
    return userRepository.findAll();
}

Nous allons utiliser une base de données H2 dans notre environnement local et la basculer vers MySQL sur Azure. En général, nous configurons les propriétés de la source de données dans le fichierapplication.properties:

spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.username=sa
spring.datasource.password=

Alors que pour le déploiement Azure,we need to configure azure-webapp-maven-plugin in *<appSettings>*:


    
        azure-auth
    
    1.8
    example-group
    example-webapp
    bealdung-plan
    
        
            spring.datasource.url
            jdbc:mysql://127.0.0.1:55738/localdb
        
        
            spring.datasource.username
            uuuuuu
        
        
            spring.datasource.password
            pppppp
        
    

Nous pouvons maintenant commencer à déployer:

> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App custom-webapp...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Updating target Web App...
[INFO] Successfully updated Web App.
[INFO] Starting to deploy the war file...
[INFO] Successfully deployed Web App at \
https://example-webapp.azurewebsites.net

Le journal indique que le déploiement est terminé.

Testons nos nouveaux points de terminaison:

> curl -d "" -X POST https://example-webapp.azurewebsites.net/user\?name\=example
registered

> curl https://example-webapp.azurewebsites.net/user
[{"id":1,"name":"example"}]

La réponse du serveur dit tout. Ça marche!

5. Déployer une application de démarrage Spring conteneur dans Azure

Dans les sections précédentes, nous avons montré comment déployer des applications sur des conteneurs de servlets (Tomcat dans ce cas). Que diriez-vous de le déployer en tant que jarre autonome exécutable?

Pour le moment, il se peut que nous devions conteneuriser notre application Spring Boot. Plus précisément, nous pouvons la dockériser et télécharger l'image sur Azure.

Nous avons déjà un article surhow to dockerize a Spring Boot App, mais iciwe’re about to make use of another maven plugin: docker-maven-plugin, to automate dockerization for us:


    com.spotify
    docker-maven-plugin
    1.1.0
    
        
    

La dernière version peut être trouvéehere.

5.1. Registre de conteneurs Azure

Premièrement,we need a Container Registry on Azure to upload our docker image.

Alors créons-en un:

az acr create --admin-enabled --resource-group example-group \
  --location japanwest --name exampleadr --sku Basic

Nous aurons également besoin des informations d'authentification de Container Registry, qui peuvent être interrogées en utilisant:

> az acr credential show --name exampleadr --query passwords[0]
{
  "additionalProperties": {},
  "name": "password",
  "value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

Ajoutez ensuite la configuration d'authentification serveur suivante dans lessettings.xml de Maven:


    exampleadr
    exampleadr
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

5.2. Configuration du plugin Maven

Ajoutons la configuration du plugin Maven suivante auxpom.xml:


    
    exampleadr
    ${azure.containerRegistry}.azurecr.io



    
        
            com.spotify
            docker-maven-plugin
            1.0.0
            
                ${docker.image.prefix}/${project.artifactId}
                https://${docker.image.prefix}
                ${azure.containerRegistry}
                docker
                
                    
                        /
                        ${project.build.directory}
                        ${project.build.finalName}.jar
                    
                
            
        
        
    

Dans la configuration ci-dessus, nous avons spécifié le nom de l'image du menu fixe, l'URL du registre et certaines propriétés similaires à celles du déploiement FTP.

Notez que le plugin utilisera les valeurs de<dockerDirectory> pour localiser lesDockerfile. Nous mettons lesDockerfile dans le répertoiredocker, et son contenu est:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD azure-0.1.jar app.jar
RUN sh -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

5.3. Exécuter Spring Boot App dans une instance de Docker

Nous pouvons maintenant créer une image Docker et la transmettre au registre Azure:

> mvn docker:build -DpushImage
...
[INFO] Building image exampleadr.azurecr.io/azure-0.1
...
Successfully built aaaaaaaaaaaa
Successfully tagged exampleadr.azurecr.io/azure-0.1:latest
[INFO] Built exampleadr.azurecr.io/azure-0.1
[INFO] Pushing exampleadr.azurecr.io/azure-0.1
The push refers to repository [exampleadr.azurecr.io/azure-0.1]
...
latest: digest: sha256:0f0f... size: 1375

Une fois le téléchargement terminé, vérifions le registre deexampleadr. Nous verrons l'image dans la liste des référentiels:

image

Nous sommes maintenant prêts à exécuter une instance de l'image:

image

Une fois l'instance démarrée, nous pouvons accéder aux services fournis par notre application via son adresse IP publique:

> curl http://a.x.y.z:8080/hello
hello azure!

5.4. Déploiement de conteneurs Docker

Supposons que nous ayons un registre de conteneurs, qu'il provienne d'Azure, de Docker Hub ou de notre registre privé.

À l'aide de la configuration suivante deazure-webapp-maven-plugin, nous pouvons également déployer notre application Web Spring Boot sur les conteneurs:


    
        ${docker.image.prefix}/${project.artifactId}
        https://${docker.image.prefix}
        ${azure.containerRegistry}
    
    

Une fois que nous avons exécutémvn azure-webapp:deploy, le plugin aidera à déployer notre archive d'application Web sur une instance de l'image spécifiée.

Ensuite, nous pouvons accéder aux services Web via l'adresse IP de l'instance ou l'URL d'Azure App Service.

6. Conclusion

Dans cet article, nous avons expliqué comment déployer une application Spring Boot sur Azure en tant que fichier WAR déployable ou fichier JAR exécutable dans un conteneur. Bien que nous ayons couvert la plupart des fonctionnalités deazure-webapp-maven-plugin, il reste encore quelques fonctionnalités riches à explorer. Veuillez consulterhere pour plus de détails.

Comme toujours, l'implémentation complète des exemples de code peut être trouvée suron Github.