Feature Flags in Java: Wie Sie Funktionen ohne Neustart der Anwendung aktivieren

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Feature Flags in Java: Wie Sie Funktionen ohne Neustart der Anwendung aktivieren

\n\n

Stellen Sie sich vor: Sie haben eine Woche lang an einer neuen Funktion gearbeitet – einem Kontaktformular mit magischer Autovervollständigung. Sie haben es gemergt und in die Produktion ausgerollt. Und dann – ein Fehler. Benutzer können keine Nachrichten senden. Sie müssen den Commit notfallmäßig zurücksetzen, das JAR neu bauen und den Server neu starten. Jeder hasst diesen Moment.

\n\n

Was aber, wenn Sie einfach einen "Ausschalten"-Knopf im Admin-Panel drücken könnten, ohne den Code zu berühren? Oder die Funktion nur für 10 % der Benutzer aktivieren, um die Auslastung zu testen? Oder einen A/B-Test starten, bei dem die Hälfte das neue Design sieht und die andere Hälfte das alte?

\n\n

All das ist die Magie von Feature Flags (auch Feature Toggles genannt). In diesem Artikel schauen wir uns an, wie man sie in Java implementiert – von einem primitiven Enum bis hin zu industriellen Lösungen wie Togglz und LaunchDarkly. Los geht's!

\n\n

Was ist ein Feature Flag und warum brauchen Sie es?

\n\n

Ein Feature Flag (oder Feature Toggle) ist ein bedingter Schalter im Code, der es ermöglicht, Funktionalitäten ein- oder auszuschalten, ohne den Quellcode zu ändern oder die Anwendung neu bereitzustellen.

\n\n

Klingt nach einem banalen if? Aber die Stärke liegt im Management. Sie speichern den Zustand der Flags in einer Konfiguration, einer Datenbank oder einem externen Dienst. Ändern Sie den Wert – die Funktion wird sofort aktiviert oder deaktiviert.

\n\n

Wofür wird das in Java-Projekten benötigt?

\n\n
    \n
  • Trunk-based Development – Mergen Sie unfertige Funktionen in den main-Branch, indem Sie sie hinter einem Flag verstecken. Kollegen sehen keine Fehler, und Sie arbeiten in Ruhe weiter.
  • \n
  • Canary Releases – Aktivieren Sie die Funktion für 5 % der Benutzer, beobachten Sie die Metriken, dann für 50 %, dann für alle.
  • \n
  • Kill Switch – Wenn eine Funktion in der Produktion ausfällt, schalten Sie sie einfach mit einem Knopf aus.
  • \n
  • A/B-Testing – Vergleichen Sie das Benutzerverhalten mit und ohne die Funktion.
  • \n
  • Personalisierung – Aktivieren Sie Premium-Funktionen nur für zahlende Kunden.
  • \n
\n\n

Das Hauptrisiko sind technische Schulden. Wenn Sie alte Flags nicht entfernen, verwandelt sich der Code in ein Spinnennetz aus if-else. Darüber sprechen wir auch.

\n\n

Der einfachste Weg: Enum + Properties

\n\n

Beginnen wir mit einem grundlegenden Ansatz. Wir erstellen eine Aufzählung von Flags und lesen sie aus der application.properties.

\n\n
public enum FeatureFlag {\n    NEW_CHECKOUT_FLOW,\n    AI_RECOMMENDATIONS,\n    DARK_MODE\n}
\n\n

Laden der Flags in einen Service:

\n\n
@Component\npublic class FeatureFlagService {\n\n    private final Map<FeatureFlag, Boolean> flags = new HashMap<>();\n\n    public FeatureFlagService(@Value("${features.new-checkout-flow:false}") boolean newCheckout,\n                              @Value("${features.ai-recommendations:false}") boolean aiRec,\n                              @Value("${features.dark-mode:false}") boolean darkMode) {\n        flags.put(FeatureFlag.NEW_CHECKOUT_FLOW, newCheckout);\n        flags.put(FeatureFlag.AI_RECOMMENDATIONS, aiRec);\n        flags.put(FeatureFlag.DARK_MODE, darkMode);\n    }\n\n    public boolean isEnabled(FeatureFlag flag) {\n        return flags.getOrDefault(flag, false);\n    }\n}
\n\n

Verwendung im Code:

\n\n
if (featureFlagService.isEnabled(FeatureFlag.NEW_CHECKOUT_FLOW)) {\n    // neuer Bestellablauf\n} else {\n    // alter Bestellablauf\n}
\n\n

Vorteile: Einfachheit, keine zusätzlichen Abhängigkeiten. Nachteile: Um den Wert zu ändern, muss die Anwendung neu gestartet werden. Das ist nicht ganz "ohne Neustart", aber für kleine Projekte in Ordnung.

\n\n

Dynamische Flags: Datenbank oder Redis

\n\n

Wenn Sie Flags im laufenden Betrieb ändern möchten, speichern Sie sie in einer Datenbank oder Redis. Erstellen wir eine Tabelle:

\n\n
CREATE TABLE feature_flags (\n    name VARCHAR(100) PRIMARY KEY,\n    enabled BOOLEAN NOT NULL DEFAULT FALSE,\n    updated_at TIMESTAMP\n);
\n\n

Service mit Caching (damit nicht bei jeder Anfrage die Datenbank abgefragt wird):

\n\n
@Service\npublic class DynamicFeatureFlagService {\n\n    private final JdbcTem                

Blogs

Buchempfehlungen