Kafka et JHipster ? C'est possible !

Si vous tombez sur cet article c’est sûrement que vous connaissez JHipster, Kafka ou les deux. Si ce n’est pas le cas, penchons-nous ensemble sur ces technos en guise d’introduction.

C’est quoi JHipster ?

JHipster est un générateur d’applications open-source basé sur Yeoman. Il s’agit du générateur Yeoman le plus téléchargé. Julien Dubois l’a créé en 2014 à l’origine pour générer des applications utilisant Spring Boot pour le back-end et Angular pour le front-end. Depuis, il est possible de créer des micro-services, des applications sans front ou sans back, d’utiliser des frameworks différents (Quarkus, Micronaut, Node, React, Vue…) voire des langages différents (Kotlin, .NET).

Il est possible de venir y greffer des blueprints (par exemple pour utiliser Kotlin) ou des modules (par exemple pour utiliser Kafka) au générateur principal de base que constitue JHipster. La différence fondamentale entre un blueprint et un module est que dans le cas d’un blueprint le générateur principal va être étendu en grande partie par exemple pour la partie serveur alors qu’un module va venir simplement ajouter une fonctionnalité sans toucher au fonctionnement interne du générateur principal.

La version majeure v7 de JHipster est en cours de développement (la bêta est sortie juste avant Noël et apportera beaucoup de nouveautés.

C’est quoi Kafka ?

Apache Kafka est un système de distribution de messages de type pub/sub (“publisher / subscribers”) entre un producteur et des consommateurs. Écrit en Scala, il a été initialement développé par LinkedIn pour ses propres besoins de messaging et de forte volumétrie. Depuis il a été rendu open-source et donné à la fondation Apache. Sa première version remonte déjà à 2014 (comme JHipster). Ses principaux intérêts sont sa capacité à gérer de grandes volumétries en temps réel, la gestion du “rejeu” des messages, l’envoi d’un point vers plusieurs points, la possibilité de faire de l’asynchrone, l’exactly-once delivery…

Pourquoi utiliser les deux ensemble ?

JHipster peut répondre à vos besoins notamment au lancement de votre projet (volumétrie, besoin de faire communiquer des APIs, nécessité de rejeu, etc). Un cas d’école est par exemple l’utilisation de Kafka comme colonne vertébrale d’échanges entre APIs dans une architecture micro-services.

Par exemple, si votre domaine concerne des chantiers de construction vous pourriez avoir une API de gestion de chantiers, une API de gestion de la facturation des chantiers et une API de recherche des chantiers permettant leur indexation avec ElasticSearch. Ici vous pourriez, à la création d’un chantier : la gérer dans l’API et produire un message via un producteur Kafka pour indiquer la création du chantier. Les API de facturation et de recherche pourraient contenir des consommateurs Kafka pour générer une facture et indexer le nouveau chantier.

Que peut-on faire avec le module Kafka ?

À l’heure de la rédaction de cet article (janvier 2021) il est possible de réaliser les choses suivantes avec le module Kafka pour JHipster :

  • Choisir la valeur de son bootstrap.servers (brokers)
  • Générer un producer ou un consumer ou les deux pour une entité précédemment générée ou sans entité
  • Choisir un nom de topic : par défaut ou personnalisé
  • Choisir des options pour le producer : envoi ou non de messages ordonnés
  • Choisir des options pour le consumer : polling timeout, auto offset reset policy, ...

Comment utiliser les deux ensemble ?

Depuis fin 2019, le module Kafka pour JHipster est en développement. Dans un premier temps son développement était réalisé au sein de la practice JHipster d’Ippon par plusieurs membres mais surtout en grande partie sur notre temps libre. Il s’agit, comme le générateur principal JHipster, d’un package npm.

Dans un premier temps, pour utiliser le module Kafka vous avez besoin d’une application créée avec JHipster. Il suffit pour cela d’installer JHipster globalement avec npm install -g generator-jhipster puis de créer un dossier et lancer JHipster avec mkdir app && jhipster.

Vous pouvez faire autrement et récupérer la branche main de JHipster et lier le package dans le dossier de votre application, afin d’utiliser la version la plus à jour du générateur (attention cependant à la stabilité, il est préférable d’utiliser une version stable/fixe) :

git clone https://github.com/jhipster/generator-jhipster.git
cd generator-jhipster
npm link
cd ..
mkdir app
cd app
npm link generator-jhipster

Note : La version 7 majeure de JHipster arrive bientôt et nous orientons le développement du module pour être compatible principalement avec celle-ci (le tag jhipster-7 dans le package.json du module permet de rendre visible le module comme étant compatible v7). Une branche de rétrocompatibilité avec la version 6 majeure actuelle existe mais ne devrait pas avoir vocation à être maintenue sur le long terme.

Vous pouvez ensuite répondre aux questions du générateur comme vous le souhaitez (monolithe ou microservices, avec ou sans client front, n’importe quel framework front, etc). L’important est de choisir “Apache Kafka as asynchronous messages broker” à la question “Which other technologies would you like to use?”. Ceci est important afin que le module détecte que vous avez choisi Kafka en tant que broker (le générateur principal gère la partie la plus basique concernant l’intégration de Kafka notamment au niveau des fichiers docker-compose.yml).

Une fois l’application générée, vous pouvez créer si vous le souhaitez une entité du domaine en fonction de vos besoins métier. Ici créons une entité ‘Foo’ avec la commande jhipster entity foo et répondons aux questions en choisissant d’ajouter un champ simple “bar” de type String.

Pour utiliser le générateur du module Kafka, il faut s’assurer d’avoir Yeoman installé (npm install -g yo) puis il suffit ensuite de lancer la commande yo jhipster-kafka et de répondre aux questions. Un arbre des options possibles du prompt est disponible sur le README du projet.

Une fois les éléments générés (notamment les consommateurs et producteurs) vous pouvez simplement :

L’ensemble de ces étapes sont décrites sur la page du projet.

Les améliorations à venir

Plusieurs améliorations sont en cours de développement ou à venir dans un futur plus ou moins proche :

  • Support de Schema Registry et des schémas Avro (objectif v1.1.0)
  • Amélioration de Producer API (high throughput)
  • Sécurité (support du SSL, safe mode...)
  • Hook pour le sous générateur d’entités JHipster (jhipster entity foo)
  • Support des applications microservices JHipster
  • Support Kafka Connect
  • Support Kafka Streams

Je proposerai dans un prochain article un retour d’expérience sur mon utilisation de JHipster en tant que développeur et comment j’ai pu, notamment dans le cadre de la practice Ippon dédiée à JHipster, créer un module de A à Z et contribuer à l’open-source et en quoi cela m’a été bénéfique et ce que j’ai pu ainsi apporter à la communauté.

Author image
Développeur Full/Stack - Tech Lead - Architecte Solutions - Formateur - Contributeur JHipster - Passionné par le violoncelle, la lecture, le cinéma, l'astronomie, la botanique et le sport
Lille LinkedIn