Leistungsstarke Feature Flags in Node Express Server
Feature Flags ermöglichen es Ihnen, ein Feature nach und nach auszurollen, anstatt einen riskanten Big-Bang-Launch durchzuführen. Sie sind äußerst hilfreich, wenn Sie sie in einer kontinuierlichen Integration und Continuous Delivery Umgebung einsetzen.


Bei Optimizely verwenden wir häufig Feature Flags, um das Risiko komplizierter Implementierungen wie der Einführung neuer APIs zu verringern.
Der Aufbau eines Feature Flags-Systems gehört jedoch in der Regel nicht zu den Kernkompetenzen Ihres Unternehmens und kann von anderen Entwicklungsaufgaben ablenken.
Ich bin Asa, Optimizelys Advokat für Entwickler. In diesem Blogbeitrag zeige ich Ihnen in 8 Schritten, wie Sie den Wert leistungsstarker Feature Flags nutzen können, indem Sie mit Optimizely Rollouts, einem völlig kostenlosen Produkt, ein Feature kundenindividuell in Express ausrollen.
Hinweis: Wenn Sie noch keine Express-Anwendung haben, empfehlen wir Ihnen, eine solche mit express-generator zu erstellen.
Schritte zum Rollout eines Features
1. Einrichten der Feature Flag-Schnittstelle
Erstellen Sie hier ein kostenloses Optimizely Rollouts Konto.
Navigieren Sie in der Rollouts-Oberfläche zu 'Features > Neues Feature erstellen' und erstellen Sie ein Feature Flag mit dem Namen 'hello_world'.
Um Ihr 'hello_world' Feature mit Ihrer Anwendung zu verbinden, suchen Sie Ihren SDK Key. Navigieren Sie zu 'Einstellungen > Datendatei' und kopieren Sie den Wert des SDK-Schlüssels.
2. Installieren Sie die Optimizely Rollouts Express Middleware
Mit der Node Express-Middleware können Sie Feature Toggles von Ihrer Codebasis aus mit JavaScript einrichten.
Verwenden Sie npm:
npm install --save @optimizely/express
oder mit yarn:
yarn add @optimizely/express
Verwenden Sie die Express-Middleware, indem Sie zunächst das SDK beim Start Ihres Express-Servers konfigurieren. Wir empfehlen, es in der Nähe anderer Importe am Anfang Ihrer app.js oder index.js Datei zu platzieren. Denken Sie auch daran, <Ihr_SDK_Key> durch den SDK-Schlüssel zu ersetzen, den Sie oben gefunden haben.
express-feature-flags__sdk-initialize.js
- autoUpdate: gibt an, dass Ihre Feature Flags bei Änderungen in der Optimizely Benutzeroberfläche automatisch aktualisiert werden.
- updateInterval: gibt an, wie oft die Optimizely Express Middleware nach Änderungen fragt. Wir empfehlen, das Abfrageintervall zu erhöhen, wenn Sie diesen Code in der Produktion einsetzen.
Verwenden Sie die Middleware, indem Sie Folgendes vor Ihren Express-Routen hinzufügen:
app.use(optimizely.middleware);
Ein vollständiger Beispielcode für Ihre Installation sollte nun etwa so aussehen:
const express = require('express'); const app = express(); const HOST = process.env.HOST || '0.0.0.0'; const PORT = process.env.PORT || 8080; const optimizelyExpress = require('@optimizely/express'); const optimizely = optimizelyExpress.initialize({ sdkKey: '<Ihr_SDK_Key>', datafileOptions: { autoUpdate: true, // Zeigt an, dass Feature Flags automatisch aktualisiert werden, wenn sich die Benutzeroberfläche ändert updateInterval: 1*1000 // 1 Sekunde in Millisekunden }, logLevel: 'info', // Steuert die Konsolenprotokollierung. Kann 'debug', 'info', 'warn', oder 'error' sein }); app.use(optimizely.middleware); app.get('/', function(req, res, next) { res.send('Optimizely Express Example') }); app.listen(PORT, HOST); console.log(`Beispiel-App läuft auf http://${HOST}:${PORT}`); module.exports = app;
express-feature-flags__installation.js
3. Implementieren Sie das Feature
Die obige Installation hält nicht nur Ihre Feature Flag-Konfiguration mit den Änderungen in der Benutzeroberfläche auf dem neuesten Stand, sondern fügt auch das folgende Objekt zu jedem Express-Request-Objekt hinzu:
req.optimizely = { datafile: Eine Darstellung aller Ihrer Feature Flags und Experimente, wie sie im Optimizely Client definiert sind: Die Optimizely SDK Client-Instanz, die über Methoden wie isFeatureEnabled, activate, track, etc. verfügt }
Um Ihr 'hello_world'-Feature zu implementieren, verwenden wir die isFeatureEnabled-Methode im Client-Feld dieses Objekts:
- Suchen Sie eine Route, die Sie mit einem Feature Toggle versehen möchten.
- Verwenden Sie die API isFeatureEnabled, indem Sie Ihren Funktionsschlüssel 'hello_world' an den ersten Parameter von isFeatureEnabled übergeben:
app.get('/', function(req, res, next) { const isEnabled = req.optimizely.client.isFeatureEnabled( 'hello_world', // Feature-Schlüssel, der das Feature mit der Benutzeroberfläche verbindet 'user123', // String-ID für zufällige prozentuale Rollouts { customerId: 123, // Attribute für Targeting-basierten Rollout isVip: true, } ); res.send('Optimizely Express Example: ' + (isEnabled ? 'Sie haben das Hallo-Welt-Feature!' : 'Feature aus.')) });
express-feature-flags__route-example.js
Die Parameter für isFeatureEnabled(featureKey, userId, userAttributes) sind die folgenden:
- featureKey: Name des Features, um diese Methode mit der Optimizely-Benutzeroberfläche zu verbinden.
- userId: wird für den Rollout auf einen zufälligen Prozentsatz von Benutzern verwendet. Wir werden diesen Parameter in diesem Beitrag nicht verwenden, lassen Sie ihn vorerst als nicht leeren String stehen.
- userAttributes: wird für ein gezieltes Rollout für Ihre Benutzer verwendet. Sie werden diese Attribute ab Schritt 5 verwenden, um Ihre Funktion auf bestimmte Benutzergruppen auszurichten.
Der Rückgabewert, isEnabled, ist ein boolescher Wert, der angibt, ob die Funktion für diese Eingaben aktiviert oder nicht aktiviert wurde.
Ihr vollständiges Codebeispiel sieht nun wie folgt aus:
const express = require('express'); const app = express(); const HOST = process.env.HOST || '0.0.0.0'; const PORT = process.env.PORT || 8080; const optimizelyExpress = require('@optimizely/express'); const optimizely = optimizelyExpress.initialize({ sdkKey: '<Ihr_SDK_Key>', datafileOptions: { autoUpdate: true, // Zeigt an, dass Feature Flags automatisch aktualisiert werden, wenn sich die Benutzeroberfläche ändert updateInterval: 1*1000 // 1 Sekunde in Millisekunden }, logLevel: 'info', // Steuert die Konsolenprotokollierung. Kann 'debug', 'info', 'warn' oder 'error' sein }); app.use(optimizely.middleware); app.get('/', function(req, res, next) { const isEnabled = req.optimizely.client.isFeatureEnabled( 'hello_world', // Feature-Schlüssel, der das Feature mit der UI verbindet 'user123', // String-ID, die für den zufälligen prozentualen Rollout verwendet wird { customerId: 123, // Attribute für Targeting-basiertes Rollout isVip: true, } ); res.send('Optimizely Express Example: ' + (isEnabled ? 'Sie haben das Hallo-Welt-Feature!' : 'Feature aus.') }); app.listen(PORT, HOST); console.log(`Beispiel-App läuft auf http://${HOST}:${PORT}`); module.exports = app;
express-feature-flags__full-sample.js
4. Schalten Sie den Feature Toggle ein!
Wenn Sie Ihren Server jetzt starten und die Route in einem Browser öffnen, werden Sie feststellen, dass Sie das Feature nicht erhalten haben. Das liegt daran, dass die Funktion nicht aktiviert ist, d.h. sie ist für alle Besucher Ihrer Anwendung ausgeschaltet.
So schalten Sie die Funktion ein:
- Navigieren Sie zu Funktionen
- Klicken Sie auf die Funktion 'hello_world'.
- Schalten Sie die Funktion ein und stellen Sie sicher, dass sie auf 100% eingestellt ist (siehe Screenshot unten)
- Klicken Sie auf Speichern, um Ihre Änderungen zu speichern.
Revolutionize your digital strategy
In weniger als einer Minute, ohne Ihren laufenden Server neu zu starten, können Sie eine neue Anfrage an Ihren Server stellen, damit Ihre Optimizely Änderungen wirksam werden. In Ihrer Anwendung sollte nun das Feature Toggle aktiviert sein und Sie sollten die Meldung "You got the hello_world feature!!!" sehen.
Sie haben Ihr Feature nun erfolgreich hinter einem Feature Flag gestartet, aber es ist für jeden verfügbar. Der nächste Schritt besteht darin, Targeting zu aktivieren, um Ihre Funktion nur einer bestimmten Untergruppe von Nutzern zu zeigen, damit Sie den wahren Wert einer Funktion für jeden einzelnen Kunden nutzen können.
5. Erstellen Sie ein Attribut für customerId
Um Ihr Feature auf der Grundlage der userAttributes, die Sie der isFeatureEnabled-API in Schritt 3 mitgeteilt haben, zu targetieren, müssen Sie diese userAttributes in der Rollouts-Benutzeroberfläche erstellen. Beginnen Sie damit mit dem Attribut 'customerId':
- Navigieren Sie zu Zielgruppen -> Attribute
- Klicken Sie auf 'Neues Attribut erstellen...'.
- Nennen Sie den Schlüssel des Attributs 'customerId'.
- Klicken Sie auf 'Attribut speichern', um Ihre Änderungen zu speichern
6. Eine Beta-Zielgruppe erstellen und hinzufügen
Lassen Sie uns nun eine Zielgruppe erstellen, um festzulegen, welche Kunden-IDs Zugang zu Ihrer Funktion erhalten sollen.
- Navigieren Sie zu Features
- Klicken Sie auf Ihre Funktion 'hello_world'.
- Scrollen Sie nach unten zu Zielgruppen
- Klicken Sie auf 'Neue Audience erstellen...'.
- Nennen Sie die Zielgruppe '[hello_world] Beta Users'.
- Ziehen Sie Ihr Attribut customerId per Drag & Drop in die Bedingungen der Zielgruppe
- Ändern Sie das Dropdown-Menü 'has any value' in 'Number equals' mit dem Wert 123
- Klicken Sie auf 'Audience speichern'.
Fügen Sie die Audience zu Ihrer Funktion hinzu, indem Sie auf die Schaltfläche + neben Ihrer neu erstellten Audience klicken. Scrollen Sie dann nach unten und klicken Sie auf 'Speichern'.
Nun, da Sie die Zielgruppe zu Ihrer Funktion hinzugefügt haben, ist die Beta-Version einsatzbereit. Zu diesem Zeitpunkt wird Ihre Funktion nur für Kunden mit der customerId 123 angezeigt, die Sie der isFeatureEnabled API im Parameter userAttributes übergeben haben.
Als Test können Sie Ihre customerId auf 456 ändern, speichern und beobachten, wie die Funktion deaktiviert wird, weil Sie die Targeting-Bedingungen nicht erfüllen.
7. Benutzer zur Beta-Version hinzufügen
Um weitere Kunden zu Ihrer Beta-Zielgruppe hinzuzufügen, bearbeiten Sie die Zielgruppendefinition, um Benutzer zur Beta hinzuzufügen oder zu entfernen:
- Klicken Sie auf das "+"-Zeichen und speichern Sie, um Beta-Nutzer hinzuzufügen.
- Klicken Sie auf das "x"-Zeichen und speichern Sie, um Beta-Nutzer zu entfernen.
Im folgenden Screenshot-Beispiel wurden drei Kunden zur Beta hinzugefügt. Die Kunden mit den IDs 123, 456 und 789 haben nun Zugriff auf die Funktion 'hello_world'.
8. Starten Sie die Funktion
Nachdem Sie Ihre Funktion für genügend Kunden aktiviert haben, um das neue Erlebnis zu genießen, können Sie entscheiden, dass es sicher ist, Ihre Funktion für alle Kunden zu starten.
Sobald Sie bereit sind, Ihre Funktion aus der Beta-Phase heraus zu starten, folgen Sie diesen Schritten:
- Entfernen Sie die Zielgruppe aus Ihrer Funktion
- Stellen Sie sicher, dass der Rollout auf 100% konfiguriert ist.
- Speichern Sie die Funktion
Die Funktion ist nun für alle verfügbar und Sie haben die Funktion 'hello_world' mit Hilfe der kostenlosen Feature Flags von Optimizely Rollouts in Node Express erfolgreich für alle Kunden ausgerollt!
Nächste Schritte
In diesem Blog haben wir uns zwar mit kundenbezogenen Rollouts beschäftigt, aber Feature Flags ermöglichen auch andere Anwendungsfälle, wie z.B. den Verzicht auf langlebige Feature Branches, die Schaffung eines Berechtigungssystems oder die Durchführung produktbezogener A/B-Tests im Backend.
Bei Optimizely verwenden wir Feature Flags für all diese Anwendungsfälle und mehr.
Ich hoffe, dies war hilfreich! Geben Sie uns Feedback, wenn Sie welche haben. Ich hoffe, ich konnte Ihrem Team einige Entwicklungsressourcen ersparen, indem ich Sie in die Lage versetzt habe, die Leistungsfähigkeit von Feature Flags mit unserem kostenlosen Feature Flag-Produkt zu nutzen: Optimizely Rollouts.