App Configuration-Server-SDK für Node
Der App Configuration-Service bietet SDKs für die Integration mit Ihrem Node.js-Microservice oder Ihrer Node-js-Anwendung an.
In der Version „ v0.4.0 “ wurden Änderungen am Rückgabewert der Methode „ getCurrentValue “ vorgenommen. Wenn Sie also bereits eine Version verwenden, die älter ist als v0.4.0, lesen Sie bitte die Migrationsanleitung, bevor Sie das SDK auf die neueste Version aktualisieren.
Server-SDK für Node integrieren
Der App Configuration-Service bietet SDKs für die Integration mit Ihrem Node.js-Microservice oder Ihrer Node-js-Anwendung an. Sie können die Werte Ihres Feature-Flags und -Merkmals auswerten, indem Sie das App Configuration SDK integrieren.
-
Installieren Sie das SDK. Verwenden Sie den folgenden Code aus dem
npm-Register.npm install ibm-appconfiguration-node-sdk@latest -
Schließen Sie in Ihren Node.js-Microservice das SDK-Modul ein mit:
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk'); -
Initialisieren Sie das SDK, um eine Verbindung zu Ihrer App Configuration-Serviceinstanz herzustellen.
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk'); const appConfigClient = AppConfiguration.getInstance(); const region = '<region>'; const guid = '<guid>'; const apikey = '<apikey>'; const collectionId = 'airlines-webapp'; const environmentId = 'dev'; async function initialiseAppConfig() { appConfigClient.setDebug(true); // optional. (remove if not needed) appConfigClient.init(region, guid, apikey); await appConfigClient.setContext(collectionId, environmentId); } try { await initialiseAppConfig(); console.log("app configuration sdk init successful"); } catch (e) { console.error("failed to initialise app configuration sdk", e); }Dabei gilt:
region: Name der Region, in der die Instanz des Dienstes „ App Configuration “ erstellt wird. Eine Liste der unterstützten Standorte finden Sie hier. Zum Beispiel:us-south,au-sydusw.guid: Instanz-ID des Dienstes „ App Configuration “. Sie finden diese Informationen im Abschnitt „Service-Anmeldedaten“ des „ App Configuration “-Dashboards.apikey: ApiKey des Dienstes „ App Configuration “. Sie finden diese Informationen im Abschnitt „Service-Anmeldedaten“ des „ App Configuration “-Dashboards.collectionId: ID der Sammlung, die in der Instanz des Dienstes „ App Configuration “ im Abschnitt „Sammlungen“ erstellt wurde.environmentId: Die ID der Umgebung, die in der Serviceinstanz für die App-Konfiguration unter dem Abschnitt "Umgebungen" erstellt wurde.
init()undsetContext()sind die Initialisierungsmethoden und müssen nur einmal mitappConfigClientgestartet werden. DieappConfigClientnach der Initialisierung kann mithilfe vonAppConfiguration.getInstance()modulübergreifend abgerufen werden.
Private Endpunkte verwenden
Optional können Sie das SDK so festlegen, dass eine Verbindung zum Service App Configuration hergestellt wird, indem Sie einen privaten Endpunkt verwenden, auf den nur über das private Netz IBM Cloud zugegriffen werden kann.
appConfigClient.usePrivateEndpoint(true);
Dies muss vor dem Aufruf der Funktion init im SDK erfolgen.
Option zur Verwendung eines persistenten Caches für die Konfiguration
Damit Ihre Anwendung und das SDK auch im unwahrscheinlichen Fall einer Nichtverfügbarkeit des „ App Configuration “-Dienstes während eines Neustarts Ihrer Anwendung weiterarbeiten können, können Sie das SDK so konfigurieren, dass es einen persistenten Cache verwendet. Das SDK verwendet den persistenten Cache zum Speichern von App Configuration-Daten, die bei Anwendungsneustarts verfügbar sind.
// 1. default (without persistent cache)
appConfigClient.setContext(collectionId, environmentId)
// 2. optional (with persistent cache)
appConfigClient.setContext(collectionId, environmentId, {
persistentCacheDirectory: '/var/lib/docker/volumes/'
})
Dabei gilt:
-
persistentCacheDirectory: Absoluter Pfad zu einem Verzeichnis, für das der Benutzer Lese- und Schreibrechte besitzt. Das SDK erstellt im angegebenen Verzeichnis eine Datei namens „appconfiguration.json“, die als persistenter Cache zum Speichern der Informationen des Dienstes „ App Configuration “ dient.Wenn der persistente Cache aktiviert ist, behält das SDK die letzte bekannte gültige Konfiguration im persistenten Cache bei. Ist der Server „ App Configuration “ nicht erreichbar, werden die aktuellsten Konfigurationen aus dem persistenten Cache in die Anwendung geladen, damit diese weiterarbeiten kann.
Stellen Sie sicher, dass die Cachedatei in keinem Fall verloren geht oder gelöscht wird. Betrachten wir beispielsweise den Fall, dass ein „ Kubernetes “-Pod neu gestartet wird und die Cache-Datei (appconfiguration.json) im temporären
Volume des Pods gespeichert war. Beim Neustart des Pods löscht „ Kubernetes “ das temporäre Volume im Pod, wodurch die Cache-Datei gelöscht wird. Stellen Sie sicher, dass die vom SDK erstellte Cachedatei immer im persistenten Datenträger
gespeichert wird, indem Sie den richtigen absoluten Pfad des persistenten Verzeichnisses angeben.
Offline-Optionen
Das SDK ist zudem so konzipiert, dass es Konfigurationen bereitstellen sowie Feature-Flag- und Eigenschaftsauswertungen durchführen kann, ohne mit dem „ App Configuration “-Dienst verbunden zu sein.
appConfigClient.setContext(collectionId, environmentId, {
bootstrapFile: 'saflights/flights.json',
liveConfigUpdateEnabled: false
})
Dabei gilt:
bootstrapFile: Absoluter Pfad der JSON-Datei, die die Konfigurationsdetails enthält. Stellen Sie sicher, dass eine korrekte JSON-Datei bereitgestellt wird. Sie können diese Datei mit dem Befehlibmcloud ac exportder Befehlszeilenschnittstelle von IBM Cloud App Configuration generieren.liveConfigUpdateEnabled: Live-Aktualisierung der Konfiguration vom Server. Setzen Sie diesen Wert auf „false“, wenn die neuen Konfigurationswerte nicht vom Server abgerufen werden sollen.
Beispiele für die Verwendung von Funktionen und eigenschaftsbezogenen APIs
Sehen Sie sich die folgenden Beispiele für die Verwendung der funktionsbezogenen APIs an.
Einzelnes Feature abrufen
const feature = appConfigClient.getFeature('feature_id'); // feature can be null incase of an invalid feature id
if (feature !== null) {
console.log(`Feature Name ${feature.getFeatureName()} `);
console.log(`Feature Id ${feature.getFeatureId()} `);
console.log(`Feature Type ${feature.getFeatureDataType()} `);
if (feature.isEnabled()) {
// feature flag is enabled
} else {
// feature flag is disabled
}
}
Alle Features abrufen
const features = appConfigClient.getFeatures();
const feature = features['feature_id'];
if (feature !== null) {
console.log(`Feature Name ${feature.getFeatureName()} `);
console.log(`Feature Id ${feature.getFeatureId()} `);
console.log(`Feature Type ${feature.getFeatureDataType()} `);
console.log(`Is feature enabled? ${feature.isEnabled()} `);
}
Feature-Auswertung
Sie können die Methode feature.getCurrentValue(entityId, entityAttributes) verwenden, um den Wert des Feature-Flags zu bewerten. Diese Methode gibt ein JSON-Objekt mit ausgewerteten Werten, aktiviertem Status des Feature-Flags
und Bewertungsdetails zurück.
const entityId = '<entityId>';
const entityAttributes = {
city: 'Bangalore',
country: 'India',
};
const result = feature.getCurrentValue(entityId, entityAttributes);
console.log(result.value); // Evaluated value of the feature flag. The type of evaluated value will match the type of feature flag (Boolean, String, Numeric).
console.log(result.isEnabled); // enabled status.
console.log(result.details); // a JSON object containing detailed information of the evaluation.
// the `result.details` will have the following
console.log(result.details.valueType); // a string value. Example: DISABLED_VALUE
console.log(result.details.reason); // a string value. Example: Disabled value of the feature flag since the feature flag is disabled.
console.log(result.details.segmentName); // (only if applicable, else it is undefined) a string value containing the segment name for which the feature flag was evaluated.
console.log(result.details.rolloutPercentageApplied); // (only if applicable, else it is undefined) a boolean value. True if the entityId was part of the rollout percentage evaluation, false otherwise.
console.log(result.details.errorType); // (only if applicable, else it is undefined) contains the error.message if any error was occured during the evaluation.
-
entityId: ID der Entität. Dies ist eine Zeichenfolgekennung, die sich auf die Entität bezieht, für die das Feature ausgewertet wird. Eine Entität kann beispielsweise eine Instanz einer App sein, die auf einem mobilen Gerät ausgeführt wird, einen Mikroservice, der in der Cloud ausgeführt wird, oder eine Komponente der Infrastruktur, die diesen Mikroservice ausführt. Damit eine Entität mit App Configuration interagieren kann, muss sie eine eindeutige Entitäts-ID angeben -
entityAttributes: Ein JSON-Objekt, das aus dem Attributnamen und ihren Werten besteht, die die angegebene Entität definieren. Dies ist ein optionaler Parameter, wenn das Feature-Flag nicht mit einer Zieldefinition konfiguriert ist. Wenn das Ziel konfiguriert ist, sollteentityAttributesfür die Regelauswertung angegeben werden. Ein Attribut ist ein Parameter, der zum Definieren eines Segments verwendet wird. Das SDK verwendet die Attributwerte, um festzustellen, ob die angegebene Entität die Zielregeln erfüllt, und gibt den entsprechenden Feature-Flag-Wert zurück.
Einzeleigenschaft abrufen
const property = appConfigClient.getProperty('property_id'); // property can be null incase of an invalid property id
if (property != null) {
console.log(`Property Name ${property.getPropertyName()} `);
console.log(`Property Id ${property.getPropertyId()} `);
console.log(`Property Type ${property.getPropertyDataType()} `);
}
Alle Eigenschaften abrufen
const properties = appConfigClient.getProperties();
const property = properties['property_id'];
if (property != null) {
console.log(`Property Name ${property.getPropertyName()} `);
console.log(`Property Id ${property.getPropertyId()} `);
console.log(`Property Type ${property.getPropertyDataType()} `);
}
Eigenschaft auswerten
Sie können die Methode property.getCurrentValue(entityId, entityAttributes) verwenden, um den Wert der Eigenschaft auszuwerten. Diese Methode gibt ein JSON-Objekt mit ausgewerteten Werten und Auswertungsdetails zurück.
const entityId = '<entityId>';
const entityAttributes = {
city: 'Bangalore',
country: 'India',
};
const result = property.getCurrentValue(entityId, entityAttributes);
console.log(result.value); // Evaluated value of the property. The type of evaluated value will match the type of property (Boolean, String, Numeric).
console.log(result.details); // a JSON object containing detailed information of the evaluation. See below
// the `result.details` will have the following
console.log(result.details.valueType); // a string value. Example: DEFAULT_VALUE
console.log(result.details.reason); // a string value. Example: Default value of the property.
console.log(result.details.segmentName); // (only if applicable, else it is undefined) a string value containing the segment name for which the property was evaluated.
console.log(result.details.errorType); // (only if applicable, else it is undefined) contains the error.message if any error was occured during the evaluation.
-
entityId: ID der Entität. Dies ist eine Zeichenfolgekennung, die sich auf die Entität bezieht, für die die Eigenschaft ausgewertet wird. Eine Entität kann beispielsweise eine Instanz einer App sein, die auf einem mobilen Gerät ausgeführt wird, einen Mikroservice, der in der Cloud ausgeführt wird, oder eine Komponente der Infrastruktur, die diesen Mikroservice ausführt. Damit eine Entität mit App Configuration interagieren kann, muss sie eine eindeutige Entitäts-ID angeben -
entityAttributes: Ein JSON-Objekt, das aus dem Attributnamen und ihren Werten besteht, die die angegebene Entität definieren. Dies ist ein optionaler Parameter, wenn die Eigenschaft nicht mit einer Zieldefinition konfiguriert ist. Wenn das Ziel konfiguriert ist, sollteentityAttributesfür die Regelauswertung angegeben werden. Ein Attribut ist ein Parameter, der zum Definieren eines Segments verwendet wird. Das SDK verwendet die Attributwerte, um zu bestimmen, ob die angegebene Entität die Zielregeln erfüllt, und gibt den entsprechenden Eigenschaftswert zurück.
Eigenschaft für geheimen Schlüssel abrufen
Explizite Methode zum Abrufen der in App Configurationgespeicherten Referenzen auf geheime Schlüssel.
const secretPropertyObject = appConfigClient.getSecret(propertyId, secretsManagerObject);
Dabei gilt Folgendes:
-
propertyID:propertyIDist die eindeutige Zeichenfolge-ID, mit der Sie die Eigenschaft abrufen können, die die erforderlichen Daten zum Abrufen des geheimen Schlüssels bereitstellt. -
secretsManagerObject:secretsManagerObjectist ein Secrets Manager-Clientobjekt, das zum Abrufen der geheimen Schlüssel während der Auswertung der Eigenschaft für geheime Schlüssel verwendet wird. Weitere Informationen zum Erstellen eines Secrets Manager-Clientobjekts finden Sie hier.
Eigenschaft für geheimen Schlüssel auswerten
Verwenden Sie die Methode secretPropertyObject.getCurrentValue(entityId, entityAttributes), um den Wert der Eigenschaft für geheime Schlüssel auszuwerten. Die Ausgabe dieses Methodenaufrufs unterscheidet sich von der Ausgabe
von getCurrentValue, die mithilfe von Feature-und Eigenschaftenobjekten gestartet wurde. Diese Methode gibt ein Promise zurück, das mit der Antwort von Secrets Manager aufgelöst oder mit einem Fehler zurückgewiesen wird. Der
aufgelöste Wert ist der tatsächliche Wert des geheimen Schlüssels der Referenz des ausgewerteten geheimen Schlüssels. Die Antwort enthält den Hauptteil, die Header, den Statuscode und den Statustext. Wenn Sie 'async' oder 'wait' verwenden,
verwenden Sie 'try' oder 'catch' zur Behandlung von Fehlern.
const entityId = 'john_doe';
const entityAttributes = {
city: 'Bangalore',
country: 'India',
};
try {
const res = await secretPropertyObject.getCurrentValue(entityId, entityAttributes);
console.log(JSON.stringify(res, null, 2)); // view entire response.
console.log('Resulting secret:\n', res.result.resources[0].secret_data.payload); // the actual secret value.
} catch (err) {
// handle the error
}
Dabei gilt Folgendes:
-
entityId:entityIdist eine Zeichenfolgekennung, die sich auf die Entität bezieht, für die die Eigenschaft ausgewertet wird. Eine Entität kann beispielsweise eine Instanz einer Anwendung sein, die auf einem mobilen Gerät ausgeführt wird, ein Microservice, der in der Cloud ausgeführt wird, oder eine Infrastrukturkomponente, auf der dieser Microservice ausgeführt wird. Damit eine Entität mit App Configuration interagieren kann, muss sie eine eindeutige Entitäts-ID angeben -
entityAttributes:entityAttributesist eine Zuordnung des Typsmap[string]interface{}, die aus dem Attributnamen und ihren Werten besteht, die die angegebene Entität definieren. Dies ist ein optionaler Parameter, wenn die Eigenschaft nicht mit einer Zieldefinition konfiguriert ist. Wenn das Ziel konfiguriert ist, sollteentityAttributesfür die Regelauswertung angegeben werden. Ein Attribut ist ein Parameter, der zum Definieren eines Segments verwendet wird. Das SDK verwendet die Attributwerte, um festzustellen, ob die angegebene Entität die Zielregeln erfüllt, und gibt den entsprechenden Wert zurück.
Abrufen der „ appConfigClient “ in anderen Modulen
Sobald das SDK initialisiert ist, kann die appConfigClient wie unten gezeigt in anderen Modulen abgerufen werden:
// **other modules**
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk');
const appConfigClient = AppConfiguration.getInstance();
feature = appConfigClient.getFeature('online-check-in');
const enabled = feature.isEnabled();
const featureValue = feature.getCurrentValue(entityId, entityAttributes)
Unterstützte Datentypen
Sie können Feature-Flags und Eigenschaften über App Configuration konfigurieren. Dabei werden die folgenden Datentypen unterstützt: „Boolean“, „Numeric“, „ SecretRef, “ und „String“. Der Zeichenfolgedatentyp kann das Format einer Textzeichenfolge, JSON oder YAML haben. Das SDK verarbeitet jedes Format wie in der Tabelle dargestellt.
| Feature oder Eigenschaftswert | Datentyp | Datenformat | Typ der von getCurrentValue().value zurückgegebenen Daten |
Beispielausgabe |
|---|---|---|---|---|
true |
BOOLEAN | nicht zutreffend | boolean |
true |
25 |
NUMERIC | nicht zutreffend | number |
25 |
| "ein Zeichenfolgetext" | STRING | TEXT | string |
a string text |
{"firefox": {"name": "Firefox","pref_url": "about:config"}} |
STRING | JSON | JSONObject | {"firefox":{"name":"Firefox","pref_url":"about:config"}} |
men:- John Smith- Bill Joneswomen:- Mary Smith- Susan Williams |
STRING | YAML | java.lang.String |
`"men:
|
Informationen zu Eigenschaften des Typs 'secret reference' finden Sie im Readme-Abschnitt evaluate a secret property.
Feature-Flag
const feature = appConfigClient.getFeature('json-feature');
feature.getFeatureDataType(); // STRING
feature.getFeatureDataFormat(); // JSON
// Example (traversing the returned JSON)
let result = feature.getCurrentValue(entityId, entityAttributes);
console.log(result.value.key) // prints the value of the key
const feature = appConfigClient.getFeature('yaml-feature');
feature.getFeatureDataType(); // STRING
feature.getFeatureDataFormat(); // YAML
feature.getCurrentValue(entityId, entityAttributes);
Eigenschaft
const property = appConfigClient.getProperty('json-property');
property.getPropertyDataType(); // STRING
property.getPropertyDataFormat(); // JSON
// Example (traversing the returned JSON)
let result = property.getCurrentValue(entityId, entityAttributes);
console.log(result.value.key) // prints the value of the key
const property = appConfigClient.getProperty('yaml-property');
property.getPropertyDataType(); // STRING
property.getPropertyDataFormat(); // YAML
property.getCurrentValue(entityId, entityAttributes);
Hören Sie sich die Änderungen des Merkmals oder der Eigenschaft an
Das SDK bietet einen ereignisbasierten Mechanismus, der Sie in Echtzeit benachrichtigt, wenn sich die Konfiguration von Feature-Flags oder Eigenschaften ändert. Sie können configurationUpdate-Ereignisse überwachen, indem Sie dasselbe
appConfigClient verwenden.
appConfigClient.emitter.on('configurationUpdate', () => {
// **add your code**
// To find the effect of any configuration changes, you can call the feature or property related methods
// feature = appConfigClient.getFeature('online-check-in');
// newResult = feature.getCurrentValue(entityId, entityAttributes);
});