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:
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:
Nous sommes maintenant prêts à exécuter une instance de l'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.