Java Feature Toggles – Comment les utiliser dans le cadre d’un déploiement continu ? 

/ 16.07.2023 Java

Travaillant dans le style du développement “outside-in”, nous voulons présenter la fonctionnalité la plus proche des parties prenantes dès que possible ; le plus souvent, il s’agit d’une sorte de maquette de l’interface utilisateur, montrant à quoi ressemblera la fonctionnalité du point de vue de l’utilisateur final. Bien qu’il n’y ait pas encore de domaine ou de base de données implémentés, nous pouvons présenter ce que l’on appelle un “Walking Skeleton” contenant les composants de base du système. Pour que ce squelette puisse être présenté dans un environnement d’essai plutôt que dans un environnement de production, nous utilisons ce que l’on appelle des “feature toggles/flags” ou des “feature switches” (commutateurs de fonctionnalités).  Comment mettre en œuvre la possibilité de partager des fonctionnalités avec différents groupes d’utilisateurs sans déploiement ? Existe-t-il un moyen de tester efficacement les fonctions dans un environnement de production et de les retirer immédiatement en cas de besoin ? Nous répondrons à ces questions en discutant des drapeaux de fonction, parfois appelés “feature toggles”.

Qu’est-ce qu’un indicateur de fonction ?

Les “feature toggles”, également connus sous le nom de “feature flags”, sont une technique qui permet aux développeurs d’activer ou de désactiver certaines fonctionnalités dans les applications sans avoir à implémenter un nouveau code. Cela peut être illustré par un exemple : lorsque vous allumez une lumière dans votre maison, vous n’avez pas besoin de modifier le câblage chaque fois, il vous suffit d’utiliser l’interrupteur, et vous avez terminé. Il en va de même pour les drapeaux de fonctionnalité : ils vous permettent de lancer une nouvelle fonctionnalité dans votre logiciel ou votre plateforme sans interruption de service, et ce, à tout moment, y compris pendant les heures de bureau. Cela signifie qu’une telle bascule vous permet de choisir un chemin dans votre code de manière dynamique, que ce soit au moment de la construction ou de l’exécution du produit ou dans l’environnement d’exécution. C’est l’utilisation du “i ” dans le code, qui permet de changer le comportement du code, sans le réécrire et sans tout traiter dans le pipeline de déploiement. En même temps, cette technique vous permet d’intégrer votre code beaucoup plus fréquemment parce qu’elle ne vous oblige pas à rester bloqué sur votre branche de fonctionnalité pendant des semaines et à attendre que la fonctionnalité soit terminée avant de l’intégrer au reste de votre code. Vous pouvez fusionner une fonctionnalité inachevée avec le reste du code, la déposer dans la “MAIN” – branche principale du contrôle de version -, et mettre ce code inachevé en production (bien sûr, pour ne pas gâcher cette production?). Java Feature Toggles

Avantages des drapeaux de caractéristiques

Les “feature flags” permettent aux équipes de contrôler les versions des fonctionnalités, d’effectuer des tests A/B, de gérer la dette technique et d’assurer un déploiement plus fluide. Voici les principaux avantages des “feature flags” dans le code : 1. Risque de mise en œuvre réduit   Les drapeaux de fonction donnent un sentiment de sécurité psychologique, car nous savons que nous pouvons désactiver ce drapeau à tout moment et que cette fonctionnalité ne sera pas vue. Nous avons le courage d’intégrer ce code beaucoup plus souvent ainsi que de mettre en œuvre et d’expérimenter progressivement différentes versions de la fonction. 2. Livraison plus rapide des logiciels  Les bascules permettent de tester de nouvelles fonctionnalités dans un environnement de production sans les mettre à la disposition de tous les utilisateurs, quelle que soit la base de code principale. 3. Obtenir un retour d’information plus rapidement  Grâce aux drapeaux de fonctionnalités, il est possible de recueillir les commentaires internes des utilisateurs de mon entreprise et d’apporter des modifications aux fonctionnalités inachevées. 4. Amélioration du processus de développement  Les indicateurs de fonctionnalités permettent de segmenter les utilisateurs en fonction de différents attributs, de créer et de comparer différentes variantes de fonctionnalités et de mesurer leurs performances, ce qui contribue à optimiser l’expérience de l’utilisateur et les objectifs de l’entreprise. 5. Contrôle et suivi  Les drapeaux déterminent qui peut accéder aux fonctionnalités et recueillent des commentaires et des données avant de les mettre à la disposition de tous. Ils peuvent également être utilisés pour mettre progressivement des fonctionnalités à la disposition d’un sous-ensemble d’utilisateurs et surveiller leurs performances et leur impact. 6. Changements de comportement plus rapides sans modification du code source  Les bascules de fonctionnalités vous permettent de modifier le comportement du système à tout moment. Elles peuvent ne nécessiter qu’un redéploiement, et même cette étape peut être sautée si, par exemple, vous utilisez Spring Cloud Config, qui vous permettra de modifier la configuration de l’application sans affecter négativement sa disponibilité.

Types de drapeaux et leur utilité

Selon Martin Fowler, les “feature flags” peuvent être classés comme suit :
  • Les boutons de validation — Ils vous permettent de déployer du code qui n’a pas encore été achevé et de masquer les fonctionnalités incomplètes aux utilisateurs.
  • Bascules d’expérience — Ce type de bascule est utilisé dans les tests A/B. Le plus souvent, ce type d’indicateur reste en place aussi longtemps qu’il est nécessaire de tirer des conclusions à partir des résultats de l’expérience.
  • Toggles Ops – Principalement utilisés pour contrôler les aspects opérationnels du système par les personnes qui gèrent l’application. Ils peuvent être utilisés pour désactiver des bascules spécifiques qui ne sont pas nécessaires au bon fonctionnement de l’application, par exemple en cas de forte charge du serveur.
  • Bascules de permission — Ce type de bascule permet de gérer les fonctionnalités disponibles pour différents groupes d’utilisateurs. Ils sont souvent utilisés pour gérer les fonctionnalités “premium” et “early access”.
Java Feature Toggles_types

Moyens de mettre en œuvre les drapeaux de caractéristiques

En Java, il existe différentes approches pour mettre en œuvre la commutation de fonctions, y compris les commutateurs qui existent dans un fichier de configuration basé sur une base de données ou l’utilisation de services externes pour les gérer. Parfois, il existe une application d’interface utilisateur supplémentaire avec une liste de fonctions et un “interrupteur” à côté d’elles. Si l’interrupteur est en position “on”, la fonction sera disponible dans l’application cible. Nous allons maintenant examiner les avantages et les inconvénients de ces approches et déterminer quand les utiliser.

Drapeaux basés sur la configuration :

Cette approche définit les bascules de fonctions dans des fichiers de configuration, tels que les propriétés, YAML ou JSON. L’application lit ces fichiers de configuration au moment de l’exécution et active ou désactive les fonctions selon des valeurs des commutateurs. Avantages :
  • Les commutateurs qui existent dans le fichier de configuration sont faciles à mettre en œuvre et à comprendre.
  • Vous pouvez changer les drapeaux sans modifier le code ou implémenter l’application de nouveau.
  • Les fichiers de configuration peuvent être gérés à l’aide de systèmes de contrôle des versions, ce qui permet d’en assurer le suivi et l’audit.
Inconvénients :
  • Prise en compte limitée du contexte : Les commutateurs basés sur la configuration ne prennent généralement pas en charge l’activation dynamique des fonctions selon des rôles et des autorisations des utilisateurs ou d’autres facteurs contextuels.
  • Au fur et à mesure que le nombre de fonctions et de commutateurs augmente, la gestion des fichiers de configuration peut devenir un véritable défi.
À utiliser : Les commutateurs basés sur la configuration conviennent lorsque vous avez besoin d’un moyen simple et statique de contrôler la disponibilité des fonctionnalités, qui ne nécessite pas de modifications au moment de l’exécution ou de prise en compte du contexte.

Indicateurs de caractéristiques basés sur une base de données

Dans cette approche, les bascules de fonctionnalités sont stockées et gérées dans une base de données ou dans un système centralisé de gestion de la configuration. L’application interroge la base de données ou lit la configuration au moment de l’exécution pour déterminer quelles fonctionnalités doivent être activées ou désactivées. Avantages :
  • Vous pouvez modifier les bascules au moment de l’exécution sans redémarrer l’application ni modifier le code.
  • Prise en compte du contexte : Les bascules peuvent être associées aux rôles des utilisateurs, aux autorisations ou à d’autres informations contextuelles stockées dans la base de données.
  • Évolutivité : le stockage centralisé permet de gérer les drapeaux des fonctionnalités dans plusieurs instances ou environnements.
Inconvénients :
  • La mise en œuvre des indicateurs de fonctionnalité nécessite une infrastructure supplémentaire, telle qu’une base de données ou un système de gestion de la configuration.
  • Les interrogations fréquentes de la base de données peuvent dégrader les performances, en particulier lors de l’évaluation des bascules pour chaque demande de l’utilisateur.
À utiliser : Les indicateurs basés sur les bases de données sont utiles lorsque vous avez besoin d’un contrôle dynamique sur la disponibilité des fonctionnalités, que vous avez besoin de facteurs contextuels et que vous souhaitez éviter de redémarrer les applications ou de déployer du code pour modifier les commutateurs. Ils sont particulièrement utiles dans les applications à grande échelle ou les systèmes distribués.

Outils externes pour la gestion des indicateurs de caractéristiques

Plusieurs solutions sont disponibles pour gérer les drapeaux de fonctionnalités. Il existe plusieurs bibliothèques SDK disponibles en Java qui peuvent être utilisées pour mettre en œuvre des bascules de fonctionnalités. Ces bibliothèques offrent différentes fonctionnalités, options d’intégration et capacités de gestion. Lorsque vous choisissez une bibliothèque SDK pour votre projet Java, tenez compte de facteurs tels que compatibilité du cadre, exigences en matière de gestion des fonctions, facilité d’utilisation et,, soutien communautaire pour choisir celui qui répond le mieux à vos besoins.  Parmi les outils les plus répandus, on peut citer  Togglz  Avantages :
  • Léger et facile à utiliser.
  • Il s’intègre bien aux cadres Java EE et Spring.
  • Fournit différentes stratégies pour activer les bascules de fonction.
  • Prise en charge des options de configuration personnalisées
  • Il bénéficie d’un soutien actif de la communauté et de mises à jour régulières.
Inconvénients :
  • Par rapport à d’autres bibliothèques, elle ne dispose que de capacités limitées de gestion des fonctionnalités avancées.
  • Prise en charge limitée de la gestion et de la configuration à distance des indicateurs de fonctionnalités.
FF4J (Feature Flipping for Java) Avantages :
  • Fonctions avancées de gestion des fonctionnalités, y compris la commutation basée sur les autorisations.
  • Intégration transparente avec des cadres Java tels que Spring, CDI et JAX-RS.
  • Fournit une console web pour gérer les drapeaux des fonctionnalités.
  • Il offre différentes règles d’activation et de désactivation pour les fonctions de commutation.
  • Logiciel libre avec une communauté active et des mises à jour régulières.
Inconvénients :
  • Documentation assez compliquée
  • Les options de configuration ne sont pas très flexibles par rapport à d’autres bibliothèques.
Unleash Avantages :
  • Les fonctions avancées basculent.
  • Plusieurs stratégies d’activation et options de ciblage.
  • Serveur et tableau de bord centralisés de gestion des fonctionnalités.
  • Prise en charge des mises à jour de la configuration en temps réel.
  • Bonnes options d’intégration et prise en charge du SDK pour Java.
Inconvénients :
  • Il nécessite une infrastructure ou un service externe pour exploiter pleinement ses capacités.
LaunchDarkly  Avantages :
  • Plateforme complète de gestion des fonctions avec de puissantes fonctions de commutation.
  • Il prend en charge le ciblage basé sur l’utilisateur, les tests A/B et les règles d’activation personnalisées.
  • Il dispose d’une interface web pour gérer les drapeaux et les configurations des fonctionnalités.
  • Intégration transparente avec divers cadres et services de développement.
  • Il fournit une documentation et des ressources étendues.
Inconvénients :
  • Un abonnement est nécessaire pour accéder aux fonctions avancées et à l’ensemble des fonctionnalités.
  • Le prix peut être important pour les petits projets ou les startups.
  • Dépendance à l’égard d’un service tiers pour la gestion des bascules.
Spring Cloud Config  Avantages :
  • Centraliser les emplacements pour gérer les propriétés de configuration, y compris les commutateurs de fonctionnalités. Cela facilite la mise à jour et la maintenance des indicateurs de fonctionnalités dans plusieurs services ou instances.
  • Mises à jour dynamiques – Elles permettent de modifier en temps réel les valeurs des indicateurs de fonctionnalités sans redémarrer ou redéployer l’application. Cette flexibilité permet d’expérimenter et de déployer rapidement de nouvelles fonctionnalités.
  • Contrôle des versions – Dans le SCC, les modifications peuvent être suivies et les versions précédentes peuvent être restaurées, si nécessaire, ce qui permet de mieux contrôler l’historique de la configuration.
  • Sécurité – Spring Cloud Config propose des options pour sécuriser les propriétés de basculement des fonctionnalités par le biais de mécanismes de cryptage et de contrôle d’accès. Cela garantit une protection contre les accès non autorisés.
Inconvénients :
  • Dépendance vis-à-vis du réseau : Si le serveur de configuration n’est pas disponible, l’application peut être incapable de télécharger les bascules de fonctionnalités mises à jour, ce qui peut affecter le comportement du système.
  • Complexité accrue : L’intégration de Spring Cloud Config pour les drapeaux de fonctionnalités ajoute une couche de complexité à l’architecture du système. Elle nécessite de gérer le serveur de configuration, de gérer la communication entre le serveur et l’application et d’assurer la cohérence entre les services.
En fonction des besoins de l’application, vous pouvez combiner les approches ci-dessus pour mettre en œuvre les indicateurs de fonctionnalité. En fin de compte, le choix de l’implémentation d’un indicateur dans le code dépend de facteurs tels que la complexité de l’application, le niveau de contrôle requis, la nécessité d’apporter des modifications à l’exécution et les compromis que vous souhaitez faire en ce qui concerne les modifications du code, les implémentations et les performances.

Pourquoi séparer le déploiement de la mise en circulation ?

L’option conditionnelle “if” permet de séparer le déploiement de la diffusion, car derrière ce “if” se trouvent des informations sur les personnes qui verront réellement la fonctionnalité et celles à qui nous la cacherons.

Pourquoi est-il important de comprendre la différence entre le déploiement et la mise en production d’un projet ?

Les deux concepts ci-dessus diffèrent. Le déploiement ou la mise en œuvre est un évènement technique au cours duquel nous apportons des modifications au logiciel et transférons le code dans l’environnement de production. La version est excitante lorsque ces nouvelles fonctionnalités sont mises à la disposition des utilisateurs finaux. Ici, les indicateurs de fonctionnalité nous permettent de contrôler la diffusion de cette nouvelle fonctionnalité sur la plateforme de déploiement ; en d’autres termes, nous choisissons qui peut voir les nouvelles versions du logiciel.
En résumé, les commutateurs de fonctionnalités séparent les deux fonctions, nous pouvons déployer de nouveaux logiciels tous les jours, mais nous pouvons maintenant décider à qui et quand nous montrons les nouvelles versions.

Pourquoi les indicateurs de fonctionnalités sont-ils importants dans un mécanisme de livraison et de déploiement continus ?

Le marquage des fonctionnalités permet un processus CI/CD efficace, permettant aux développeurs de fusionner fréquemment leur travail dans un référentiel partagé sans s’inquiéter de casser quoi que ce soit ou de faire en sorte que les utilisateurs finaux accèdent à des fonctionnalités inachevées. Les drapeaux vous permettent de contrôler le comportement de l’application ou de la plateforme, ce qui signifie que tout le code est toujours déployé, mais que certaines branches du code peuvent être testées pour les nouvelles fonctionnalités du comportement modifié, ou que vous pouvez les désactiver jusqu’à ce que le drapeau soit activé. À son tour, chaque fois que vous activez une bascule, ce code est disponible pour les utilisateurs.

Tester le code équipé de drapeaux de fonctionnalité

Cela dépend de votre stratégie de test, qu’il s’agisse de tests unitaires, de tests manuels, etc. Il est important de ne pas tester toutes les combinaisons possibles de drapeaux de fonction, mais d’exécuter des tests lorsqu’il y a une probabilité que quelque chose se produise. Le test échouera également si la fonction est actuellement désactivée. Par conséquent, il est préférable de retirer les tests du processus principal jusqu’à ce que la fonction soit officiellement libérée. En attendant, il est préférable d’exécuter les tests uniquement lorsque cela est nécessaire et si la fonction a été activée. Une fois que la fonction est définitivement validée, les tests peuvent être ajoutés à l’exécution du test principal.

Quels sont les problèmes qui se posent lorsque nous ne retirons pas les drapeaux ?

La façon dont les commutateurs de fonction sont gérés témoigne de la qualité de l’organisation. Le fait de ne pas retirer les drapeaux de fonction après leur utilisation prévue peut entrainer plusieurs problèmes :
  • Dette technique – Les caractéristiques laissées dans la base de code peuvent s’accumuler au fil du temps, rendant la base de code plus complexe et difficile à maintenir, à comprendre et à déboguer.
  • Augmentation des efforts de test et de maintenance – Lorsque les indicateurs de fonctionnalité ne sont pas supprimés, ils font toujours partie du processus de test, ce qui signifie que les testeurs doivent tester les chemins de code associés même s’ils ne sont plus pertinents.
  • Risques pour la sécurité – Si des indicateurs de fonctionnalités inutilisés et oubliés contrôlent l’accès à des fonctions sensibles ou révèlent des fonctionnalités non sécurisées, ils peuvent être pris pour cibles s’ils ne sont pas correctement sécurisés.
  • Dégradation des performances – Les bascules de fonctionnalités impliquent souvent des contrôles conditionnels supplémentaires dans le code. Si ces contrôles ne sont pas supprimés une fois que la fonction n’est plus nécessaire, ils peuvent ralentir l’application.
  • Problèmes de compatibilité – Les indicateurs de fonctionnalité peuvent interagir avec d’autres parties de la base de code, des dépendances ou des intégrations. La présence d’indicateurs de fonction inutilisés peut entrainer des conflits avec d’autres codes ou introduire des comportements non souhaités.
Pour éviter ces problèmes, il est nécessaire de faire preuve de rigueur et de s’en tenir à un ensemble de pratiques établies pour supprimer les indicateurs de fonctionnalité lorsqu’ils ont rempli leur fonction. Ce processus doit inclure des révisions régulières du code, des initiatives de nettoyage des drapeaux et de la documentation afin de garantir que les drapeaux sont correctement gérés tout au long du cycle de développement. Que peut-il se passer si nous utilisons mal la fonction “drapeau” ? L’entreprise peut perdre des millions de dollars de revenus. Comme la société Knights Capital, qui a perdu 460 millions de dollars en 28 minutes ?. Pour en savoir plus sur cette affaire, cliquez ici.

Résumé

Pour maximiser les avantages de la permutation des fonctionnalités tout en minimisant les défis et les risques, il convient de définir son cycle de vie et de gérer un système documenté de drapeaux de fonctionnalités en conséquence. Il est certain que les drapeaux de fonctionnalités peuvent apporter de nombreux avantages, tels que le développement axé sur l’utilisateur et la réduction des risques associés aux versions majeures. Cependant, la chose la plus importante à retenir est qu’une fonctionnalité bien conçue doit être simple à maintenir en tant que code simple et valeurs de configuration. Par conséquent, il est toujours utile de se demander quelle complexité nous introduisons dans le code et s’il est possible d’obtenir le même résultat d’une manière plus simple.
Catégorie: Java


Mariola Nowak Content Writer
Tomasz Kluza Senior Full-Stack Developer

Conception, développement, DevOps ou Cloud - de quelle équipe avez-vous besoin pour accélérer le travail sur vos projets ?

Discutez avec vos partenaires de consultation pour voir si nous sommes compatibles.

Jakub Orczyk

Membre du Conseil d’administration/Directeur des ventes VM.PL

Réservez une consultation gratuite
kuba (2)