Esercitazione: Usare i flag di funzionalità in un'app Spring Boot

Le librerie di gestione delle funzionalità di base di Spring Boot offrono supporto per l'implementazione dei flag di funzionalità in un'applicazione Spring Boot. Queste librerie consentono di aggiungere flag di funzionalità al codice in modo dichiarativo.

Le librerie di gestione delle funzionalità gestiscono anche i cicli di vita dei flag di funzionalità in background. Ad esempio, le librerie aggiornano e memorizzano nella cache gli stati del flag o garantiscono lo stato immutabile di un flag durante una chiamata di richiesta. La libreria Spring Boot offre anche integrazioni, tra cui azioni del controller MVC, route e middleware.

La guida di avvio rapido Aggiungere flag di funzionalità a un'app Spring Boot illustra diversi modi per aggiungere flag di funzionalità in un'applicazione Spring Boot. Questa esercitazione illustra questi metodi più dettagliatamente.

In questa esercitazione verranno illustrate le procedure per:

  • Aggiungere i flag di funzionalità nelle parti chiave dell'applicazione per controllare la disponibilità delle funzionalità.
  • Eseguire l'integrazione con Configurazione app quando viene usato per gestire i flag di funzionalità.

Configurare la gestione delle funzionalità

Lo strumento di gestione delle funzionalità di Spring Boot FeatureManager ottiene i flag di funzionalità dal sistema di configurazione nativo del framework. Di conseguenza, è possibile definire i flag di funzionalità dell'applicazione usando qualsiasi origine di configurazione supportata da Spring Boot, ad esempio il file locale bootstrap.yml o le variabili di ambiente. FeatureManager si basa sull'inserimento delle dipendenze. È possibile registrare i servizi di gestione di funzionalità usando le convenzioni standard:

private FeatureManager featureManager;

public HelloController(FeatureManager featureManager) {
    this.featureManager = featureManager;
}

È consigliabile mantenere i flag di funzionalità all'esterno dell'applicazione e gestirli separatamente. In questo modo è possibile modificare gli stati dei flag in qualsiasi momento e applicare immediatamente tali modifiche nell'applicazione. Configurazione app offre una posizione centralizzata per organizzare e controllare tutti i flag di funzionalità tramite un'interfaccia utente del portale dedicata. Configurazione app fornisce anche i flag direttamente all'applicazione tramite le relative librerie client Spring Boot.

Il modo più semplice per connettere l'applicazione Spring Boot a Configurazione app consiste nell'usare il provider di configurazione:

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-feature-management-web</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-dependencies</artifactId>
        <version>5.8.0</version>
        <type>pom</type>
        <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Dichiarazione dei flag di funzionalità

Ogni flag di funzionalità è costituito da due parti: un nome e un elenco di uno o più filtri che consentono di valutare se lo stato di una funzionalità è attivo (ovvero, quando il relativo valore è True). Un filtro definisce un caso d'uso per il quale deve essere attivata una funzionalità.

Se un flag di funzionalità ha più filtri, l'elenco dei filtri viene attraversato fino a quando uno dei filtri non determina che la funzionalità deve essere abilitata. A questo punto, il flag di funzionalità è attivo e i risultati del filtro rimanenti vengono ignorati. Se nessun filtro indica che deve essere abilitata la funzionalità, il flag di funzionalità viene disattivato.

Lo strumento di gestione delle funzionalità supporta application.yml come origine di configurazione per i flag di funzionalità. L'esempio seguente illustra come configurare i flag di funzionalità in un file YAML:

feature-management:
  feature-a: true
  feature-b: false
  feature-c:
    enabled-for:
      -
        name: PercentageFilter
        parameters:
          Value: 50

Per convenzione, la sezione feature-management di questo documento YML viene usata per le impostazioni dei flag di funzionalità. L'esempio precedente mostra tre flag di funzionalità con i relativi filtri definiti nella proprietà EnabledFor:

  • feature-a è attivo.
  • feature-b è disattivato.
  • feature-c specifica un filtro denominato PercentageFilter con una proprietà parameters. PercentageFilter è un filtro configurabile. In questo esempio PercentageFilter specifica una probabilità del 50% che il flag feature-c sia attivo.

Controlli dei flag di funzionalità

Il modello di base di gestione delle funzionalità consiste prima di tutto nel controllare se un flag di funzionalità è impostato su attivo. In tal caso, la gestione delle funzionalità esegue le azioni contenute nella funzionalità. Ad esempio:

private FeatureManager featureManager;
...
if (featureManager.isEnabledAsync("feature-a").block()) {
    // Run the following code
}

Inserimento delle dipendenze

In Spring Boot è possibile accedere allo strumento di gestione delle funzionalità FeatureManager tramite l'inserimento delle dipendenze:

@Controller
@ConfigurationProperties("controller")
public class HomeController {
    private FeatureManager featureManager;

    public HomeController(FeatureManager featureManager) {
        this.featureManager = featureManager;
    }
}

Azioni del controller

Nei controller MVC è possibile usare l'attributo @FeatureGate per controllare se un'azione specifica è abilitata. Per poter eseguire l'azione Index seguente, il flagfeature-a deve essere attivo:

@GetMapping("/")
@FeatureGate(feature = "feature-a")
public String index(Model model) {
    ...
}

Quando un controller o un'azione MVC viene bloccato perché il flag di funzionalità di controllo è disattivato, viene chiamata un'interfaccia DisabledFeaturesHandler registrata. L'interfaccia DisabledFeaturesHandler predefinita restituisce un codice di stato 404 al client senza alcun corpo della risposta.

Filtri MVC

È possibile configurare i filtri MVC in modo da attivarli in base allo stato di un flag di funzionalità. Il codice seguente aggiunge un filtro MVC denominato FeatureFlagFilter. Questo filtro viene attivato all'interno della pipeline MVC solo se il flag feature-a è attivato.

@Component
public class FeatureFlagFilter implements Filter {

    @Autowired
    private FeatureManager featureManager;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if(!featureManager.isEnabled("feature-a")) {
            chain.doFilter(request, response);
            return;
        }
        ...
        chain.doFilter(request, response);
    }
}

Route

È possibile usare i flag di funzionalità per reindirizzare le route. Il codice seguente abiliterà il reindirizzamento di un utente da feature-a:

@GetMapping("/redirect")
@FeatureGate(feature = "feature-a", fallback = "/getOldFeature")
public String getNewFeature() {
    // Some New Code
}

@GetMapping("/getOldFeature")
public String getOldFeature() {
    // Some New Code
}

Passaggi successivi

In questa esercitazione si è appreso come implementare i flag di funzionalità in un'applicazione Spring Boot usando le librerie spring-cloud-azure-feature-management-web. Per altre domande, vedere la documentazione di riferimento, contiene tutti i dettagli su come funziona la libreria di Configurazione app di Azure Spring Cloud. Per altre informazioni sul supporto della gestione delle funzionalità in Spring Boot e Configurazione app, vedere le risorse seguenti: