Feature Management App Configuration

Niveau :

9 minutes de lecture

Azure App Configuration offre un service de gestion centralisée des paramètres d’application et des indicateurs de fonctionnalités. Dans cet article, je vais vous présenter la gestion des fonctionnalités qui permet de modifier des paramètres d’une application cloud sans la redéployer.

En gros, nous allons pouvoir changer rapidement la disponibilité des fonctionnalités à la demande et sans redéploiement.

Création App Configuration

Dans le Marketplace d’azure, dans un ressource group de votre choix (ici coffeecoding pour notre exemple), recherchez app configuration et cliquez sur Create :

Renseignez les champs obligatoires et cliquez sur Review + Create :

Création d’une « Feature flag » :

Une fois la ressource crée, cliquez sur Feature manager -> Create -> Feature flag comme ci dessous :

Renseignez les champs nécessaires. Ici nous appellerons notre fonction : featureEnabled. Vous pouvez renseigner un libellé et une description. Validez en cliquant sur Apply :

Utilisation d’une « Feature flag » dans notre projet Visual Studio :

Créez un projet de type Api dans Visual Studio (ici CoffeeCodingWeatherApi pour notre exemple). Rajoutez les packages suivants : Microsoft.Azure.AppConfiguration.AspNetCore et Microsoft.FeatureManagement.AspNetCore.

Dans le fichier program.cs rajoutez les lignes suivantes :

builder.Configuration.AddAzureAppConfiguration(options =>
    options.Connect("connectionString")
            .UseFeatureFlags());

builder.Services.AddAzureAppConfiguration();
builder.Services.AddFeatureManagement();
...
app.UseAzureAppConfiguration();

Remplacez la chaine de connexion par celle de votre ressource azure que l’on trouve comme ci-dessous :

Enfin, modifiez le code du controller comme ci dessous et exécutez l’application :

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;
    private readonly IFeatureManager _featureManager;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IFeatureManager featureManager)
    {
        _logger = logger;
        _featureManager = featureManager;
    }

    [HttpGet(Name = "GetWeatherForecast")]
    public async Task<IEnumerable<WeatherForecast>> Get()
    {
        
        var result = await _featureManager.IsEnabledAsync("featureEnabled");

        if (result)
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
        .ToArray();
        }
        else
            return Enumerable.Empty<WeatherForecast>().ToArray();
    }
}

L’appel au endpoint permet de récupérer des valeurs :

Si je décoche ma valeur comme ci dessous :

Et que je refais appel à mon endpoint, j’obtiens bien un changement de comportement comme nous le désirons :

options.Connect("connectionString")
        .UseFeatureFlags(options=> options.SetRefreshInterval(TimeSpan.FromMinutes(5))));

Laisser un commentaire