Accueil Nos publications Blog Feature flags & ASP .NET Core

Feature flags & ASP .NET Core

header-reveal

 

Et si je vous disais qu’il est possible de tester une nouvelle fonctionnalité directement en production sans se soucier des effets de bord et sans passer par un environnement de test… Cela changerait la donne, n’est-ce pas ? ( feature flags asp net core )

Dans cet article, nous allons jeter un coup d’œil aux features flags et voir comment les mettre en place avec ASP.NET Core pour optimiser nos livraisons.

Commençons par une petite définition :

C’est quoi un feature flag ?

Dans son blog, Martin Fowler définit un Feature flag comme ceci :

Feature Toggles (often also referred to as Feature Flags) are a powerful technique, allowing teams to modify system behavior without changing code

Pour résumer, “feature flag” est un mécanisme qui nous permet de pousser du code et l’activer/le désactiver à la demande en définissant des variables true ou false.

if (isFeatureFlagIsActive) { 
    // Execute new code 
} else { 
 // Execute Old code 
} 

Avec cette technique, nous aurons un système flexible que l’on pourra façonner et contrôler à partir de la configuration de notre application.
Finies les branches qui trainent dans le repo en attente du Go d’une release !
Si la date de release est le mois prochain, il est certain que votre branche sera en retard sur master et que vous aurez beaucoup de conflits en essayant de la mettre à jour.

Feature flags and ASP.NET Core

À partir de la version 3.1, ASP.NET intègre un système de gestion de Feature Flags qui expose des méthodes afin de récupérer la valeur de ces drapeaux. Par défaut, les valeurs sont récupérées du fichier appsettings.json et plus précisément de la section FeatureManagement

Installation

Pour utiliser cette fonctionnalité, il faut :

  • Installer le package Microsoft.FeatureManagement.AspNetCore
  • Appeler l’extension AddFeatureManagement pour enregistrer cette fonctionnalité dans le IServiceCollection
using Microsoft.FeatureManagement; 
public class Startup 
{
    public void ConfigureServices(IServiceCollection services) 
    { 
        ... 
        services.AddFeatureManagement(); 
    } 
} 

Déclaration d’un Flag

Créez une section featureManagement dans votre fichier appsettings.json et définissez les valeurs de vos drapeaux :

{ 
"FeatureManagement": { 
    "FeatureOne": true, // Feature flag set to on 
    "FeatureTwo": false, // Feature flag set to off 
    } 
}

Vérification de la valeur du flag

Pour vérifier la valeur d’un drapeau, vous devez injecter le service IFeatureManager dans votre constructeur et utiliser la méthode IsEnabledAsync

IFeatureManager featureManager;
... 
if (await featureManager.IsEnabledAsync(MyFeatureFlags.FeatureA)) 
{ 
    // Run the following code 
} 

Actions sur contrôleurs

Nous pouvons également utiliser des FeatureGate pour limiter conditionnellement l’accès à une action spécifique d’un contrôleur.

1/ Appliqué à tout le contrôleur :

using Microsoft.FeatureManagement.Mvc;

[FeatureGate(MyFeatureFlags.FeatureOne)]
public class HomeController : Controller
{ 
    ...
}

2/ Pour une action spécifique :

using Microsoft.FeatureManagement.Mvc; 

.... 

[FeatureGate(MyFeatureFlags.FeatureTwo)] 
public IActionResult GetNewTariff() 
{ 
    return tariffService.GetNewTariff(); 
} 

Middleware

Il est possible de conditionner l’enregistrement d’un middleware :

app.UseMiddlewareForFeature<ThirdPartyMiddleware>(MyFeatureFlags.FeatureThree); 

Bonnes pratiques

Certes, Feature Flag est un mécanisme qui nous permet d’aller plus vite en production, mais comme tout outil, c’est une arme à double tranchant.

Si l’on ne suit pas certaines directives, nous pouvons construire un kraken

Dans la section suivante, nous allons essayer de lister quelques points à prendre en considération lors de la mise en place d’un tel système.

Classer par catégories les flags :

En Créant un nouveau flag, nous devons nous poser la question : “Pourquoi ?”. Cela va nous permettre de le classer dans une catégorie et définir sa longévité ainsi que son dynamisme.

Par exemple, nous pouvons avoir un flag avec une durée de vie de deux semaines et un deuxième qui sera là pendant quelques mois. Idem pour le dynamisme, un flag pourra changer de valeur à chaque déploiement et un autre à chaque requête.

Source : martinfowler.com

Découplage du point de décision et de la logique de décision :

Pour avoir un système bien découplé, on va mettre en place un service de gestion qui va englober tout ce qui est lié au “feature flag”. Ce service jouera le rôle de point de décision, et va principalement récupérer la valeur du flag pour remonter l’information à l’appelant. Avec cette approche, on applique le principe de “Single Responsability” et la classe appelante ne gérera que la logique métier.

Interface et Implémentations :

Un des piliers de la mise en place d’un tel système est l’utilisation des Interfaces. On peut définir plusieurs implémentations d’une action et laisser notre service de gestion de Feature Flags choisir la bonne implémentation, qui sera injectée par la suite via notre moteur d’injection de dépendance.

Feature flags management :

  • Si vous travaillez avec un système de tickets pour le suivi des tâches, une des bonnes pratiques à suivre est de créer deux tickets à chaque fois que vous comptez introduire un nouveau Feature flag. Le premier pour la création et le deuxième pour la suppression. Généralement, dans le ticket de création, nous allons classer notre nouveau-né dans une catégorie pour définir sa longévité et son dynamisme.
  • Il existe de nombreux outils qui proposent un tableau de bord ou une interface graphique pour créer, modifier et visualiser la valeur des Features flags (Azure App Configuration, Kameleoon…).

The big picture

Comme on vient de le voir, le pattern « Feature flag » est un mécanisme d’optimisation de livraison très puissant, et utilisable facilement. Plus besoin d’avoir des branches qui traînent dans nos repo ni de gérer des conflits de merge.

Par défaut, le service de gestion de Feature Flag qu’ASP.NET Core récupère toutes les valeurs des drapeaux à partir du fichier de configuration (appsettings.json). Nous pouvons également utiliser un service hébergé comme AzureAppConfiguration pour récupérer la configuration à partir du Cloud et basculer les flags plus facilement sans redéployer notre application.

Restez connectés, nous aborderons ce sujet dans un deuxième article 😊

Lien utiles:
https://martinfowler.com/articles/feature-toggles.html
https://learn.microsoft.com/en-us/azure/azure-app-configuration/use-feature-flags-dotnet-core?tabs=core5x