Nous allons voir comment déployer rapidement (disons en 20mn) une application Quarkus sur Clever-cloud. L’objectif est de déployer une application native compilée et exécutée avec Graal VM, ce qui permettra ensuite d’utiliser moins de mémoire et de CPU au runtime.

En quelques mots, Clever Cloud est un hébergeur et une plate-forme capable de déployer votre application, à partir d’un simple repository sur Git.

Nous sommes des gros utilisateurs de Clever chez Lunatech. Site Web, application interne pour gérer les vacances, bot en Scala qui surveille les actualités de la RATP et qui va te dire quand passe le prochain RER, site web pour le recrutement de nos candidats (https://factory.lunatech.fr), site pour la gestion du matériel informatique, petit proto pour faire un peu de Haskell, etc.

Que ce soit en phase de développement, ou pour aller en production : nous sommes vraiment fans de la simplicité et des possibilités de Clever.

Alors Quarkus donc… voyons un peu comment nous allons faire.

Tout d’abord prenons un “vrai” projet avec une base de données postgreSQL, sinon cela sera trop simple. Pour cela, nous avons créé un projet maison appelé “TimeKeeper” dont le code source se trouve ici https://github.com/nicmarti/quarkus-timekeeper-demo/tree/clevercloud

Vous pouvez donc forker ce repository, et ensuite suivre le fichier README pour pouvoir tester et compiler.

Sinon nous pouvons aussi directement passer à l’étape “je déploie sur Clever”

Il vous faudra un compte sur Clever-cloud pour la suite.

Etape 1 : créer une application de type Java Maven + une base pgSQL

Nous allons utiliser Maven, et plus particulièrement la possibilité de construire une image native avec GraalVM.

Sélectionnez en haut à gauche “Create…” puis “An application”

Choisir ensuite “A Brand new application” (ou sinon l’URL de votre repository Github, si vous avez forké le repo TimeKeeper).

Choisir ensuite “Java + Maven”, donnez un nom sympa à votre application puis continuez.

A l’écran “Add-on creation”, sélectionnez alors PostgreSQL, puis le plan “DEV”. Ceci nous permettra d’avoir une base gratuitement, parfait pour notre test. A noter que pour de la prod, il faudra basculer sur une instance de base de données dédiées, au risque sinon de saturer le nombre de connexion.

A l’écran “Environment Variables” c’est là que tout se joue… Merci au support de Clever Cloud et en particulier à Laurent Doguin qui nous a aidé… car il faut un peu chercher.

Il faut déclarer les variables d’environnement suivantes :

CC_JAVA_VERSION = graalvm-ce
CC_MAVEN_PROFILES = native
MAVEN_DEPLOY_GOAL = package
maven.test.skip = true
CC_RUN_COMMAND = target/timekeeper-1.2.0-SNAPSHOT-runner -Dquarkus.datasource.url=jdbc:postgresql://${POSTGRESQL_ADDON_HOST}:${POSTGRESQL_ADDON_PORT}/${POSTGRESQL_ADDON_DB} -Dquarkus.datasource.username=${POSTGRESQL_ADDON_USER} -Dquarkus.datasource.password=${POSTGRESQL_ADDON_PASSWORD} 

Tout d’abord, CC_JAVA_VERSION permet d’indiquer que nous utiliserons GraalVM, qui est actuellement supporté en version 19.3.1 sur Clever-cloud.

Ensuite nous utiliserons le profile native afin de construire l’image via Docker.

La cible Maven sera package et il n’est pas nécessaire de faire un clean, car chaque build de Clever est isolé.

Nous avons décidé aussi de ne pas lancer les tests. Sur notre projet, ces tests démarrent un Docker et une base sur le port 5432. Mais lors du build sur Clever-cloud, nous avons décidé de ne pas activer ces tests.

CC_RUN_COMMAND est important, car cela donne l’instruction à exécuter une fois le build terminé. Clever-cloud va donc démarrer notre binaire qui se trouve dans “target” et que nous avons décidé d’appeler timekeeper-1.2.0-SNAPSHOT-runner.

A noter que Quarkus ne permet pas d’utiliser ici une URI jdbc. Il a donc fallut passer chacune des variables d’environnement à la commande. Quarkus accepte certains paramètres à l’exécution comme expliqué dans la documentation. Vous vous demandez peut-être d’où vient la variable POSTGRESQL_ADDON_HOST ? Clever-cloud injecte cette variable automatiquement au démarrage. Idem pour les autres.

Quarkus est assez gourmand en terme de mémoire au moment du build. Sur une machine virtuelle avec 8Gb de mémoire, et 8 CPU type i7, il faut compter 3mn. Un test sur un Mac Pro avec 64Gb de mémoire, 8 CPU Xeon, disque SSD, on tombe à 50 secondes. Mais bon, ce Mac coûte plus de 8000 euros, ça fait cher le build.

Sur Clever-cloud, nous avons de la chance, car il est possible de demander une grosse machine uniquement pour le build. Cela se passe dans l’onglet Information en sélectionnant Enable dedicated build instance. Vous pouvez prendre aussi un monstre type 3XL, c’est pas plus cher.

Par contre, et c’est l’intérêt de Quarkus, nous pouvons utiliser une toute petite machine pour l’exécution de l’application. Nous avons déployé l’application sur l’URL suivante : https://quarkus-timekeeper.cleverapps.io/ Elle tourne sur petite instance de type Nano avec donc un CPU partagé avec d’autres applications, et 512 Mo de mémoire.

Enfin, cerise sur le gâteau, nous avons noté que l’application démarre en quelques secondes. C’est vraiment pratique, on en vient à imaginer des environnements de test, d’intégration, bref à aller beaucoup plus loin que la simple mise en ligne d’une application.

Là où Quarkus devient aussi un sérieux concurrent de Go… c’est ce côté “embarqué” avec un seul binaire, où tout est packagé, qui demande moins de mémoire à l’exécution.

Etape 2 : il n’y a pas d’étape 2

La petite révolution ne fait que commencer…

Leave a Reply