Ein Leitfaden für Flips für den Frühling

Eine Anleitung zu Flips für den Frühling

1. Überblick

In diesem Tutorial sehen wir unsFlips, Bibliothek an, die Feature-Flags in Form leistungsfähiger Anmerkungen für Spring Core-, Spring MVC- und Spring Boot-Anwendungen implementiert.

Feature Flags (oder Toggles) sind ein Muster für die schnelle und sichere Bereitstellung neuer Features. Mit diesen Umschaltern können wir das Anwendungsverhalten vonwithout changing or deploying new code.ändern. Martin Fowlers Blog enthält einen sehr informativen Artikel über Feature-Flagshere.

2. Maven-Abhängigkeit

Bevor wir beginnen, müssen wir die Flips-Bibliothek zu unserenpom.xml: hinzufügen


    com.github.feature-flip
    flips-core
    1.0.1

Maven Central hatlatest version of the library und das Github-Projekt isthere.

Natürlich müssen wir auch eine Feder einbinden:


    org.springframework.boot
    spring-boot-starter-web
    1.5.10.RELEASE

Da Flips noch nicht mit Spring Version 5.x kompatibel ist, werden wirlatest version of Spring Boot in the 4.x branchverwenden.

3. Ein einfacher REST-Service für Flips

Stellen wir ein einfaches Spring Boot-Projekt zusammen, um neue Funktionen und Flags hinzuzufügen und umzuschalten.

Unsere REST-Anwendung bietet Zugriff auf die Ressourcen vonFoo:

public class Foo {
    private String name;
    private int id;
}

Wir erstellen einfach einService, das eine Liste vonFoos enthält:

@Service
public class FlipService {

    private List foos;

    public List getAllFoos() {
        return foos;
    }

    public Foo getNewFoo() {
        return new Foo("New Foo!", 99);
    }
}

Wir werden im weiteren Verlauf auf zusätzliche Servicemethoden verweisen, aber dieses Snippet sollte ausreichen, um zu veranschaulichen, wasFlipService im System tut.

Und natürlich müssen wir einen Controller erstellen:

@RestController
public class FlipController {

    private FlipService flipService;

    // constructors

    @GetMapping("/foos")
    public List getAllFoos() {
        return flipService.getAllFoos();
    }
}

4. Steuerungsfunktionen basierend auf der Konfiguration

Die grundlegendste Verwendung von Flip ist das Aktivieren oder Deaktivieren einer Funktion basierend auf der Konfiguration. Flips hat dafür mehrere Anmerkungen.

4.1. Umgebungseigenschaft

Stellen wir uns vor, wir habenFlipService um eine neue Funktion erweitert. Abrufen vonFoos anhand ihrer ID.

Fügen wir dem Controller die neue Anforderung hinzu:

@GetMapping("/foos/{id}")
@FlipOnEnvironmentProperty(
  property = "feature.foo.by.id",
  expectedValue = "Y")
public Foo getFooById(@PathVariable int id) {
    return flipService.getFooById(id)
      .orElse(new Foo("Not Found", -1));
}

Das@FlipOnEnvironmentProperty steuert, ob diese API verfügbar ist oder nicht.

Einfach ausgedrückt, wennfeature.foo.by.idY ist, können wir Anfragen nach ID stellen. Wenn dies nicht (oder überhaupt nicht definiert) ist, deaktiviert Flips die API-Methode.

Wenn eine Funktion nicht aktiviert ist, wirft FlipsFeatureNotEnabledException und Spring gibt "Nicht implementiert" an den REST-Client zurück.

Wenn wir die API mit der EigenschaftN aufrufen, sehen wir Folgendes:

Status = 501
Headers = {Content-Type=[application/json;charset=UTF-8]}
Content type = application/json;charset=UTF-8
Body = {
    "errorMessage": "Feature not enabled, identified by method
      public com.example.flips.model.Foo
      com.example.flips.controller.FlipController.getFooById(int)",
    "className":"com.example.flips.controller.FlipController",
    "featureName":"getFooById"
}

Wie erwartet fängt Spring dieFeatureNotEnabledException ab und gibt den Status 501 an den Client zurück.

4.2. Aktives Profil

Der Frühling hat uns lange Zeit die Möglichkeit gegeben, Bohnen verschiedenenprofiles zuzuordnen, wie z. B.dev,test oderprod. Die Erweiterung dieser Funktion auf das Zuordnen von Feature-Flags zum aktiven Profil ist intuitiv sinnvoll.

Lassen Sie uns sehen, wie Funktionen basierend auf den aktivenSpring Profile aktiviert oder deaktiviert werden:

@RequestMapping(value = "/foos", method = RequestMethod.GET)
@FlipOnProfiles(activeProfiles = "dev")
public List getAllFoos() {
    return flipService.getAllFoos();
}

Die Annotation@FlipOnProfilesakzeptiert eine Liste von Profilnamen. Befindet sich das aktive Profil in der Liste, kann auf die API zugegriffen werden.

4.3. Frühlingsausdrücke

Spring’s Expression Language (SpEL) ist der leistungsstarke Mechanismus zum Bearbeiten der Laufzeitumgebung. Mit Flips können wir auch Funktionen damit umschalten.

@FlipOnSpringExpression schaltet eine Methode um, die auf einem SpEL-Ausdruck basiert, der einen Booleschen Wert zurückgibt.

Verwenden wir einen einfachen Ausdruck, um eine neue Funktion zu steuern:

@FlipOnSpringExpression(expression = "(2 + 2) == 4")
@GetMapping("/foo/new")
public Foo getNewFoo() {
    return flipService.getNewFoo();
}

4.4. Deaktivieren

Verwenden Sie@FlipOff, um eine Funktion vollständig zu deaktivieren:

@GetMapping("/foo/first")
@FlipOff
public Foo getFirstFoo() {
    return flipService.getLastFoo();
}

In diesem Beispiel istgetFirstFoo() vollständig unzugänglich.

Wie wir unten sehen werden, können wir Flips-Anmerkungen kombinieren, sodass@FlipOff verwendet werden können, um eine Funktion basierend auf der Umgebung oder anderen Kriterien zu deaktivieren.

5. Steuerfunktionen mit Datum / Uhrzeit

Durch Umblättern kann eine Funktion basierend auf Datum / Uhrzeit oder Wochentag umgeschaltet werden. Die Verfügbarkeit einer neuen Funktion an den Tag oder das Datum zu binden, hat offensichtliche Vorteile.

5.1. Datum und Uhrzeit

@FlipOnDateTime akzeptiert den Namen einer Eigenschaft, die im FormatISO 8601 formatiert ist.

Legen Sie also eine Eigenschaft fest, die auf eine neue Funktion hinweist, die am 1. März aktiv sein wird:

first.active.after=2018-03-01T00:00:00Z

Dann schreiben wir eine API zum Abrufen des ersten Foo:

@GetMapping("/foo/first")
@FlipOnDateTime(cutoffDateTimeProperty = "first.active.after")
public Foo getFirstFoo() {
    return flipService.getLastFoo();
}

Flip überprüft die benannte Eigenschaft. Wenn die Eigenschaft vorhanden ist und das angegebene Datum / die angegebene Uhrzeit verstrichen ist, wird die Funktion aktiviert.

5.2. Wochentag

Die Bibliothek bietet@FlipOnDaysOfWeek, was für Vorgänge wie A / B-Tests nützlich ist:

@GetMapping("/foo/{id}")
@FlipOnDaysOfWeek(daysOfWeek={DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY})
public Foo getFooByNewId(@PathVariable int id) {
    return flipService.getFooById(id).orElse(new Foo("Not Found", -1));
}

getFooByNewId() ist nur montags und mittwochs verfügbar.

6. Ersetzen Sie eine Bohne

Das Ein- und Ausschalten von Methoden ist nützlich, aber wir möchten möglicherweise neues Verhalten über neue Objekte einführen. @FlipBean weist Flips an, eine Methode in einer neuen Bean aufzurufen.

Eine Flips-Annotation kann für alle Spring@Component. verwendet werden. Bisher haben wir nur unsere@RestController geändert. Versuchen wir, unsereService. zu ändern

Wir erstellen einen neuen Service mit einem anderen Verhalten alsFlipService:

@Service
public class NewFlipService {
    public Foo getNewFoo() {
        return new Foo("Shiny New Foo!", 100);
    }
}

Wir werden diegetNewFoo()des alten Dienstes durch die neue Version ersetzen:

@FlipBean(with = NewFlipService.class)
public Foo getNewFoo() {
    return new Foo("New Foo!", 99);
}

Flips leiten Anrufe angetNewThing() anNewFlipService. @FlipBean weiter. Dies ist ein weiterer Schalter, der in Kombination mit anderen am nützlichsten ist. Schauen wir uns das jetzt an.

7. Kombinieren von Toggles

Wir kombinieren Umschaltungen, indem wir mehr als eine angeben. Flips wertet diese nacheinander mit impliziter UND-Logik aus. Daher müssen alle true sein, um die Funktion zu aktivieren.

Kombinieren wir zwei unserer vorherigen Beispiele:

@FlipBean(
  with = NewFlipService.class)
@FlipOnEnvironmentProperty(
  property = "feature.foo.by.id",
  expectedValue = "Y")
public Foo getNewFoo() {
    return new Foo("New Foo!", 99);
}

Wir haben den neuen Dienst konfigurierbar genutzt.

8. Fazit

In dieser Kurzanleitung haben wir einen einfachen Spring Boot-Dienst erstellt und APIs mithilfe von Flips-Annotationen ein- und ausgeschaltet. Wir haben gesehen, wie Features mithilfe von Konfigurationsinformationen und Datum / Uhrzeit umgeschaltet werden und wie Features zur Laufzeit durch Austauschen von Beans umgeschaltet werden können.

Codebeispiele finden sich wie immer inover on GitHub.