Tutorial: Verwenden von Featureflags in einer Spring Boot-App

Die Spring Boot Core-Featureverwaltungsbibliotheken bieten Unterstützung für die Implementierung von Featureflags in einer Spring Boot-Anwendung. Dank dieser Bibliotheken können Sie Ihrem Code Featureflags auf deklarative Weise hinzufügen.

Die Featureverwaltungsbibliotheken verwalten darüber hinaus Featureflag-Lebenszyklen im Hintergrund. Die Bibliotheken können Flagzustände aktualisieren und zwischenspeichern, garantieren, dass ein Flagzustand während eines Anforderungsaufrufs unveränderlich ist, und Ähnliches. Darüber hinaus bietet die Spring Boot-Bibliothek Integrationen, einschließlich MVC-Controlleraktionen, Routen und Middleware.

Unter Schnellstart: Hinzufügen von Featureflags zu einer Spring Boot-App werden mehrere Methoden gezeigt, mit denen Sie Featureflags in einer Spring Boot-Anwendung hinzufügen können. Diese Methoden werden im vorliegenden Tutorial näher erläutert.

In diesem Tutorial lernen Sie Folgendes:

  • Hinzufügen von Featureflags in wichtigen Teilen Ihrer Anwendung, um die Verfügbarkeit von Features zu steuern
  • Integrieren in App Configuration, wenn Sie damit Featureflags verwalten

Einrichten der Featureverwaltung

Der Spring Boot-Feature-Manager FeatureManager ruft Featureflags aus dem nativen Konfigurationssystem des Frameworks ab. Dadurch können Sie die Featureflags Ihrer Anwendung mit einer beliebigen, von Spring Boot unterstützten Konfigurationsquelle konfigurieren – unter anderem mit der lokalen Datei bootstrap.yml oder mit Umgebungsvariablen. FeatureManager basiert auf der Abhängigkeitsinjektion. Die Featureverwaltungsdienste können unter Verwendung von Standardkonventionen registriert werden:

private FeatureManager featureManager;

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

Featureflags sollten sich außerhalb der Anwendung befinden und separat verwaltet werden. Dadurch können Sie Flagzustände jederzeit ändern, und die Änderungen werden in der Anwendung sofort wirksam. Mit App Configuration können Sie alle Ihre Featureflags über eine dedizierte Portalbenutzeroberfläche an einem zentralen Ort organisieren und steuern. App Configuration übermittelt darüber hinaus die Flags über seine Spring Boot-Clientbibliotheken direkt an Ihre Anwendung.

Die Verbindung zwischen Ihrer Spring Boot-Anwendung und App Configuration lässt sich am einfachsten über den Konfigurationsanbieter herstellen:

<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>

Featureflagdeklaration

Jedes Featureflag besteht aus zwei Teilen: einem Namen und einer Filterliste, anhand der ausgewertet wird, ob ein Feature aktiviert ist (der Wert also True lautet). Ein Filter definiert einen Anwendungsfall für die Aktivierung eines Features.

Verfügt ein Featureflag über mehrere Filter, wird die Filterliste in der angegebenen Reihenfolge durchlaufen, bis einer der Filter angibt, dass das Feature aktiviert werden soll. Daraufhin ist das Featureflag aktiviert, und alle weiteren Filterergebnisse werden übersprungen. Falls durch keinen Filter angegeben wird, dass das Feature aktiviert werden soll, ist das Featureflag deaktiviert.

Der Feature-Manager unterstützt application.yml als Konfigurationsquelle für Featureflags. Das folgende Beispiel zeigt die Einrichtung von Featureflags in einer YAML-Datei:

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

Der Abschnitt feature-management dieses YML-Dokuments wird konventionsgemäß für Featureflageinstellungen verwendet. Das vorherige Beispiel enthält drei Featureflags, deren Filter in der Eigenschaft EnabledFor definiert sind:

  • feature-a ist aktiviert.
  • feature-b ist deaktiviert.
  • feature-c gibt einen Filter namens PercentageFilter mit einer Eigenschaft vom Typ parameters an. PercentageFilter ist ein konfigurierbarer Filter. In diesem Beispiel gibt PercentageFilter an, dass das Flag feature-c mit einer Wahrscheinlichkeit von 50 Prozent aktiviert ist.

Überprüfen von Featureflags

Bei der Featureverwaltung wird grundsätzlich zunächst geprüft, ob ein Featureflag aktiviert ist. Ist dies der Fall, führt der Feature-Manager die im Feature enthaltenen Aktionen aus. Beispiel:

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

Abhängigkeitsinjektion

In Spring Boot kann auf den Feature-Manager FeatureManager mittels Abhängigkeitsinjektion zugegriffen werden:

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

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

Controlleraktionen

In MVC-Controllern steuern Sie mithilfe eines Attributs vom Typ @FeatureGate, ob eine spezifische Aktion aktiviert wird. Für die folgende Aktion Index muss feature-aaktiviert sein, damit sie ausgeführt werden kann:

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

Ist ein MVC-Controller oder eine Aktion blockiert, weil das steuernde Featureflag deaktiviert ist, wird eine registrierte Schnittstelle (DisabledFeaturesHandler) aufgerufen. Die Standardschnittstelle DisabledFeaturesHandler gibt den Statuscode 404 ohne Antworttext an den Client zurück.

MVC-Filter

Sie können MVC-Filter so einrichten, dass sie abhängig vom Zustand eines Featureflags aktiviert werden. Im folgenden Code wird ein MVC-Filter namens FeatureFlagFilter hinzugefügt. Dieser Filter wird innerhalb der MVC-Pipeline nur ausgelöst, wenn feature-a aktiviert ist.

@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);
    }
}

Routen

Sie können Featureflags zum Umleiten von Routen verwenden. Mit dem folgenden Code wird ein Benutzer von feature-a umgeleitet:

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

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

Nächste Schritte

In diesem Tutorial haben Sie gelernt, wie Sie Featureflags in Ihrer Spring Boot-Anwendung unter Verwendung der Bibliotheken vom Typ spring-cloud-azure-feature-management-web implementieren. Weitere Fragen finden Sie in der Referenzdokumentation. Sie enthält alle Details darüber, wie die Spring Cloud Azure App Configuration-Bibliothek funktioniert. Weitere Informationen zur Unterstützung der Featureverwaltung in Spring Boot und App Configuration finden Sie in den folgenden Ressourcen: