Les premières briques de mon micro-service

Après quelque temps sans écrire me revoilà avec un article assurément technique (il faut bien assumer le dev de Devotics ). Je vous propose de découvrir avec moi le monde des micro-services au travers d’une nouvelle . Nous y côtoierons SpringBoot, Kotlin, MongoDb et bien d’autre encore afin d’être en mesure de concevoir et de construire un micro service de A à Z.

Pour que ce projet ne soit pas un simple cas théorique sans trop de challenge, nous nous appuierons sur un cas pratique, un fil rouge. Celui-ci j’espère perdurera à côté de ce dossier. L’idée est simple mais elle couvre un besoin assez répandu, je vous propose donc de construire un micro-service qui aura pour but de gérer des langue et des traductions. Le but étant d’avoir la possibilité à terme d’administrer les traductions d’une application sans avoir de connaissance techniques.

Dans cette première partie nous nous contenterons de voir les bases. Nous verrons comment mettre en place votre environnement de travail, et comment initialiser les premiers éléments de votre micro-service. Les but étant, à la fin de cet article, d’être familiarisé et opérationnel pour la suite du dossier.

Généralités

Dans cet article nous allons être amené à travailler avec plusieurs technologies. Ceci peut-être déstabilisant pour les novices et il est intéressant de bien comprendre la place de chacun avant d’entrer dans le vif du sujet.

Les micro-services

C’est un type d’architecture logiciel qui consiste à découper vos applications en « morceaux » dans le but d’isoler des fonctionnalités. Ces fragments d’application communiquent ensuite via des Apis. Les avantages d’un tel système sont nombreux. Scalabilités, maintenances, partage du travail au sein d’une équipe, mutualisation de code, etc. sont autant de choses pouvant vous pousser à passer le pas.

Spring Boot

Spring Boot est ce que l’on peut appeler un micro-framework. Il permet de mettre en route rapidement un projet Spring en simplifiant considérablement les phases de configurations. Spring quant à lui est un framework Java qui apporte des solutions simples à mettre en places pour toutes les problématiques que vous pourriez rencontrer dans du développement web (sécurité, api, etc.)

Gradle

C’est votre meilleur ami. Cette outil permet de construire vos applications, de gérer vos dépendances et de d’automatiser tout un tas de tâches comme les tests et même les déploiements.

 

L’environnement de travail

Voici les quelques outils indispensables pour la première partie de cette série.

Un Éditeur de code (IDE), mais lequel ?

IntelliJ

IntelliJ

 

Nous allons développer notre micro-service en Kotlin. Ce langage est en grande partie natif de chez JetBrain qui n’est autre que l’éditeur du célèbre IDE d’IntelliJ.

En plus d’être un très bon outil, il semble donc assez logique de se tourner vers celui-ci.

Je vous invite à le télécharger ici. Il existe deux versions dont une payante cependant dans le cadre de cette série, la version community (gratuite) est amplement suffisante.

 

Initialisation du projet Spring Boot

Spring a eu la bonne idée de créer un générateur de projet en ligne afin de nous simplifier la vie. Rendez-vous ici pour le découvrir et pour initialiser votre projet vierge. Pour ma part j’ai choisi de partir sur un projet Gradle avec Kotlin et Spring Boot 2.0.1. Il vous suffit ensuite d’indiquer quelques informations inhérentes à votre projet.

 

Générateur de projet Spring Boot

Avant d’appuyer sur Generate Projet, je vous conseille de faire un tour du côté  du lien Switch to the full version. Il vous permettra, entre autre, de choisir les bibliothèques de base que vous embarquerez. Pour ma part, j’ai coché DevTools, Validation et MongoDB.

Une fois terminé, cliquez sur generate project, dézippez le fichier généré et importez le contenu dans IntelliJ comme étant un projet.

Mise en place de la base de donnée

Téléchargez et installez MongoDb. Si vous avez des problèmes pour cette étape je vous conseille cet article qui détaille bien le processus.

Sur certains PC, il arrive que l’installation tourne en boucle. Cela provient d’un problème d’installation de Mongo Compass. Arrêter l’installation et recommencer en mode custom en prenant soin de ne pas activer l’installation de compass.

Quelques outils supplémentaires

Les outils suivants ne sont pas obligatoires (mais presque), ils faciliteront vos tests et votre navigation au sein de mongoDb

  • Nosqlclient : C’est un client qui prend en charge mongoDb et qui facilitera grandement l’exploration de vos bases. Vous pouvez le télécharger ici.
  • Postman : Ce n’est pas la première fois que j’en parle dans Devotics. Ce client Rest est l’un de mes préféré, vous pouvez le trouver ici, mais tout autre client Rest sera tout aussi adapté.

Hello World

A ce stade, vous devriez avoir installé tous les outils nécessaires et vous disposez d’un projet vierge prêt à être utilisé. Nous allons commencer par un simple Hello world afin de nous acclimater à nos nouveaux outils.

Créez un nouveau package (clic droit, new, package) nommé hello dans src/main/kotlin/com.nomdevotregroupe

Exemple de package Hello

Exemple de package Hello

Créez une classe Kotlin que vous nommerez HelloController

Création d’une class kotlin

Création d’une class kotlin

Créez-y une méthode de classe qui s’appelle bonjour et qui retourne un message basique. Vous devriez avoir quelque chose comme ceci :

Exemple fonction 1

Exemple fonction 1

Maintenant, nous allons créer notre premier point de terminaison http (endpoint). Il va nous permettre d’exécuter le code de notre contrôleur suite à une requête http. Pour ce faire, tout passe par quelques annotations. Plutôt qu’un long discours, voici le code agrémenté de quelques commentaires:

Exemple endpoint

Exemple endpoint – voir en détail sur Gist

Les annotations comme @GetMapping peuvent prendre des paramètres. Dans le cas précis, il est notamment possible de définir un chemin particulier afin d’accéder aux méthodes et/ou de définir s’il y a des paramètres dans l’url de la requête.

Par exemple, si dans le même contrôleur je souhaite avoir la fonction bonjour en espagnole je peux très bien définir cette nouvelle méthode précédée de @GetMapping(« es »). Cela  permettra d’avoir un nouvel endpoint qui aura la même adresse que la précédente suffixée de  « /es ».

Nouveau endpoint es

Nouveau endpoint es

Paramétrage d’une configuration de build

Il est temps de tester ! Avant toutes choses, il nous faut paramètrer IntelliJ. En haut à droite vous devriez voir ceci


Cliquez sur la petite flèche blanche comme pour ouvrir la liste, sélectionnez ensuite edit configurations et cliquez sur + en haut de la fenêtre et choisissez Gradle. Donnez un nom à votre configuration, dans le champ Gradle Project, sélectionnez votre projet et dans tasks entrez bootRun.


Validez et vous devriez voir dans la barre de tout à l’heure votre config et une flèche verte. Cliquez sur cette dernière et votre api devrait être disponible!

Si vous entrez localhost:8080/api/v1/hello dans votre navigateur, vous devriez atteindre la première méthode


Tandis que si vous entrez localhost:8080/api/v1/hello/es, vous devriez atteindre la seconde

Les tests

Au cours de ce dossier, nous verrons à chaque étape comment pousser et robustifier nos tests. Aujourd’hui, nous n’allons donc pas nous étendre et voir les basiques. Vous pouvez très simplement et rapidement mettre en place des tests unitaires. Pour ce faire il suffit de créer un fichier dans le dossier test et d’écrire vos tests en vous inspirant de mon exemple ci-dessous.

Il ne vous reste ensuite plus qu’à vous créer une nouvelle configuration de build (comme dans le paragraphe précédent) en remplaçant bootrun par test.

 

La documentation

Si vous avez déjà travaillé avec des Apis qui ne vous appartenaient pas, vous connaissez l’importance de la documentation. Si vous respectez bien les normes Restfull, vos Apis peuvent vous sembler parlantes d’elles-mêmes mais un minimum d’explication est indispensable si vous voulez diffuser vos Apis. Pour vous simplifier la vie, il existe des solutions comme Swagger pour réaliser des documentations d’Apis en réduisant au maximum l’effort nécessaire. Voyons comment le mettre en place sur notre exemple.

Configuration de gradle

Dans un premier temps, rendez-vous dans le fichier build.gradle et mettez à jour la section repositories en ajoutant jcenter() et la partie dependencies en ajoutant compile(« io.springfox:springfox-swagger2:2.8.0 ») et compile(« io.springfox:springfox-swagger-ui:2.8.0 »). Ce qui donne dans mon cas

Mes dépendances

Une fois sauvegardé, votre gradle devrait se synchroniser et télécharger les dépendances manquantes

Configuration du projet

Créez un nouveau package nommé conf et ajoutez-y un fichier nommé SwaggerConfiguration.kt qui doit contenir le code suivant

Configuration de swagger

Configuration de swagger – Voir en détail sur Gist

Ensuite, relancez le projet et rendez-vous sur http://localhost:8080/swagger-ui.html. Comme par magie, vous retrouvez une documentation de vos Apis hello. Elles sont bien entendues un peu basique mais aucun n’effort n’a été nécessaire pour les mettre en place et cela permet d’ores et déjà d’avoir une bonne vision d’ensemble sur les Apis existantes.

swagger

swagger

Vous avez tout un tas d’annotations disponible pour enrichir le résultat. Nous en verrons certainement quelques unes au cours de ce dossier mais si vous êtes impatient, vous pouvez vous référer à la documentation officielle de Swagger ici.

N’hésitez pas à agrémenter votre code avec les nouvelles annotations que vous pourriez apprendre, cela pourra vous faire gagner un temps énorme.

Conclusion

Il est temps de nous quitter. Grâce à cette première partie, vous devriez avoir un environnement propre, efficace et être capable de mettre en place rapidement de simples Apis GET en Spring Boot et Kotlin. Dans le prochain article, nous verrons comment jouer avec MongoDb et comment construire des apis plus intéressantes.

A la fin de cet article, vous pouvez peut-être vous sentir frustré car nous ne sommes pas allés très loin. Cependant, il est important de bien fixer les bases afin d’avancer plus vite et mieux par la suite. Promis la deuxième partie arrive vite 😉

Vous pouvez retrouver le code de cet article ici. En attendant, n’hésitez pas à me faire part de vos impressions, remarques ou problèmes via les commentaires, A bientôt !

Je tiens à remercier @dramloc qui m’a mis le pied à l’étrier et m’a beaucoup appris sur le sujet 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.