SDK du serveur App Configuration pour Node
Le service App Configuration fournit un SDK à intégrer à votre application ou microservice Node.js.
La version v0.4.0 apporte des modifications à la valeur de retour de la méthode getCurrentValue. Par conséquent, si vous utilisez déjà une version antérieure à v0.4.0, veuillez consulter le guide de migration avant de mettre à jour le SDK vers la dernière version.
Intégration du SDK du serveur pour Node
Le service App Configuration fournit un SDK à intégrer à votre application ou microservice Node.js. Vous pouvez évaluer les valeurs de votre indicateur de fonctionnalité et de votre propriété en intégrant le SDK App Configuration.
-
Installez le kit de développement de logiciels (SDK). Utilisez le code suivant à partir du registre
npm.npm install ibm-appconfiguration-node-sdk@latest -
Dans votre microservice Node.js, incluez le module SDK avec :
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk'); -
Initialisez le sdk pour vous connecter à votre instance de service App Configuration.
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); }Où :
region: Nom de la région dans laquelle l'instance du service « App Configuration » est créée. Voir la liste des lieux pris en charge ici. Par exemple :us-south,au-sydetc.guid: ID d'instance du service « App Configuration ». Vous pouvez les retrouver dans la section « Identifiants du service » du tableau de bord d' App Configuration.apikey: ApiKey du service « App Configuration ». Vous pouvez les retrouver dans la section « Identifiants du service » du tableau de bord d' App Configuration.collectionId: Identifiant de la collection créée dans l'instance du service App Configuration, dans la section « Collections ».environmentIdcorrespond à l'ID de l'environnement créé dans l'instance de service App Configuration sous la section Environnements.
init()etsetContext()sont les méthodes d'initialisation et doivent être démarrées une seule fois à l'aide deappConfigClient. LeappConfigClient, une fois initialisé, peut être obtenu entre les modules à l'aide deAppConfiguration.getInstance().
Utilisation de noeuds finaux privés
Vous pouvez éventuellement définir le SDK pour qu'il se connecte au service App Configuration en utilisant un noeud final privé accessible uniquement via le réseau privé IBM Cloud.
appConfigClient.usePrivateEndpoint(true);
Cette opération doit être effectuée avant d'appeler la fonction init sur le SDK.
Option permettant d'utiliser une mémoire cache persistante pour la configuration
Afin que votre application et le SDK puissent continuer à fonctionner dans le cas improbable où le service App Configuration serait indisponible lors du redémarrage de votre application, vous pouvez configurer le SDK pour qu’il utilise un cache persistant. Le kit de développement de logiciels utilise le cache persistant pour stocker les données App Configuration disponibles lors du redémarrage de votre application.
// 1. default (without persistent cache)
appConfigClient.setContext(collectionId, environmentId)
// 2. optional (with persistent cache)
appConfigClient.setContext(collectionId, environmentId, {
persistentCacheDirectory: '/var/lib/docker/volumes/'
})
Où :
-
persistentCacheDirectory: Chemin d'accès absolu vers un répertoire pour lequel l'utilisateur dispose des droits de lecture et d'écriture. Le SDK crée un fichier (appconfiguration.json) dans le répertoire indiqué; celui-ci sert de cache persistant pour stocker les informations relatives au service « App Configuration ».Lorsque le cache permanent est activé, le kit de développement de logiciels conserve la dernière bonne configuration connue dans le cache persistant. Si le serveur App Configuration est inaccessible, les configurations les plus récentes présentes dans le cache persistant sont chargées dans l'application afin que celle-ci puisse continuer à fonctionner.
Assurez-vous que le fichier cache n'est pas perdu ou supprimé dans tous les cas. Prenons par exemple le cas où un pod « Kubernetes » est redémarré et où le fichier de cache (appconfiguration.json) était stocké dans le volume éphémère
du pod. Lors du redémarrage du pod, la commande « Kubernetes » détruit le volume éphémère du pod, ce qui entraîne la suppression du fichier de cache. Par conséquent, assurez-vous que le fichier cache créé par le SDK est toujours stocké dans
le volume persistant en fournissant le chemin absolu correct du répertoire persistant.
Options hors ligne
Le SDK est également conçu pour fournir des configurations et effectuer des évaluations de drapeaux de fonctionnalité et de propriétés sans être connecté au service d' App Configuration.
appConfigClient.setContext(collectionId, environmentId, {
bootstrapFile: 'saflights/flights.json',
liveConfigUpdateEnabled: false
})
Où :
bootstrapFile: Chemin d'accès absolu du fichier JSON contenant les détails de configuration. Veillez à fournir un fichier JSON approprié. Vous pouvez générer ce fichier à l'aide de la commandeibmcloud ac exportde l'interface de ligne de commande IBM Cloud App Configuration.liveConfigUpdateEnabled: Mise à jour en temps réel de la configuration depuis le serveur. Définissez cette valeur sur «false» si vous ne souhaitez pas récupérer les nouvelles valeurs de configuration depuis le serveur.
Exemples d'utilisation des API liées aux fonctions et aux propriétés
Consultez les exemples suivants pour utiliser les API liées aux fonctions.
Extraction d'une fonctionnalité
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
}
}
Extraction de toutes les fonctionnalités
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()} `);
}
Evaluation des fonctionnalités
Vous pouvez utiliser la méthode feature.getCurrentValue(entityId, entityAttributes) pour évaluer la valeur de l'indicateur de fonctionnalité. Cette méthode renvoie un objet JSON contenant la valeur évaluée, le statut activé
de l'indicateur de fonction et les détails de l'évaluation.
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 de l'entité. Il s'agit d'un identificateur de chaîne lié à l'entité par rapport à laquelle la fonction est évaluée. Par exemple, une entité peut être une instance d'une application qui s'exécute sur un appareil mobile, un microservice qui s'exécute sur le cloud ou un composant d'infrastructure qui exécute ce microservice. Pour qu'une entité interagisse avec App Configuration, elle doit fournir un ID d'entité unique. -
entityAttributes: objet JSON composé du nom d'attribut et de ses valeurs qui définissent l'entité spécifiée. Il s'agit d'un paramètre facultatif si l'indicateur de fonction n'est pas configuré avec une définition de ciblage. Si le ciblage est configuré,entityAttributesdoit être fourni pour l'évaluation de la règle. Un attribut est un paramètre utilisé pour définir un segment. Le SDK utilise les valeurs d'attribut pour déterminer si l'entité spécifiée satisfait aux règles de ciblage et renvoie la valeur d'indicateur de fonction appropriée.
Extraction d'une propriété
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()} `);
}
Extraction de toutes les propriétés
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()} `);
}
Evaluer une propriété
Vous pouvez utiliser la méthode property.getCurrentValue(entityId, entityAttributes) pour évaluer la valeur de la propriété. Cette méthode renvoie un objet JSON contenant la valeur évaluée et les détails de l'évaluation.
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 de l'entité. Il s'agit d'un identificateur de chaîne lié à l'entité par rapport à laquelle la propriété est évaluée. Par exemple, une entité peut être une instance d'une application qui s'exécute sur un appareil mobile, un microservice qui s'exécute sur le cloud ou un composant d'infrastructure qui exécute ce microservice. Pour qu'une entité interagisse avec App Configuration, elle doit fournir un ID d'entité unique. -
entityAttributes: objet JSON composé du nom d'attribut et de ses valeurs qui définissent l'entité spécifiée. Il s'agit d'un paramètre facultatif si la propriété n'est configurée avec aucune définition de ciblage. Si le ciblage est configuré,entityAttributesdoit être fourni pour l'évaluation de la règle. Un attribut est un paramètre utilisé pour définir un segment. Le SDK utilise les valeurs d'attribut pour déterminer si l'entité spécifiée satisfait aux règles de ciblage et renvoie la valeur de propriété appropriée.
Obtenir la propriété de secret
Méthode explicite d'obtention des références de secret stockées dans App Configuration.
const secretPropertyObject = appConfigClient.getSecret(propertyId, secretsManagerObject);
Où
-
propertyID:propertyIDest l'identificateur de chaîne unique qui vous permet d'extraire la propriété qui fournira les données nécessaires pour extraire le secret. -
secretsManagerObject:secretsManagerObjectest un objet client Secrets Manager qui est utilisé pour obtenir les secrets lors de l'évaluation de la propriété de secret. Pour plus d'informations sur la création d'un objet client Secrets Manager, voir ici.
Evaluer une propriété de secret
Utilisez la méthode secretPropertyObject.getCurrentValue(entityId, entityAttributes) pour évaluer la valeur de la propriété de secret. La sortie de cet appel de méthode est différente de celle de getCurrentValue démarré à l'aide d'objets de fonction et de propriété. Cette méthode renvoie une promesse qui est résolue avec la réponse de Secrets Manager ou rejetée avec une erreur. La valeur résolue est la valeur de secret réelle de la référence de
secret évaluée. La réponse contient le corps, les en-têtes, le code de statut et le texte de statut. Si vous utilisez async ou en attente, utilisez try ou catch pour le traitement des erreurs.
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
}
Où
-
entityId:entityIdest un identificateur de chaîne lié à l'entité par rapport à laquelle la propriété est évaluée. Par exemple, une entité peut être une instance d'une application fonctionnant sur un appareil mobile, un microservice fonctionnant dans le cloud ou un composant de l'infrastructure sur lequel s'exécute ce microservice. Pour qu'une entité interagisse avec App Configuration, elle doit fournir un ID d'entité unique. -
entityAttributes:entityAttributesest une mappe de typemap[string]interface{}composée du nom de l'attribut et de ses valeurs qui définissent l'entité spécifiée. Il s'agit d'un paramètre facultatif si la propriété n'est configurée avec aucune définition de ciblage. Si le ciblage est configuré,entityAttributesdoit être fourni pour l'évaluation de la règle. Un attribut est un paramètre utilisé pour définir un segment. Le SDK utilise les valeurs d'attribut pour déterminer si l'entité spécifiée satisfait aux règles de ciblage et renvoie la valeur appropriée.
Récupération de l' appConfigClient e dans d'autres modules
Une fois le SDK initialisé, l' appConfigClient e peut être récupérée depuis d'autres modules, comme indiqué ci-dessous :
// **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)
Types de données pris en charge
Vous pouvez configurer les indicateurs de fonctionnalité et les propriétés à l'aide de App Configuration, qui prend en charge les types de données suivants : booléen, numérique, SecretRef, et chaîne de caractères. Le type de données Chaîne peut être au format d'une chaîne de texte, JSON ou YAML. Le kit de développement de logiciels traite chaque format comme indiqué dans le tableau.
| Valeur de la fonction ou de la propriété | Type de données | Format de données | Type de données renvoyées par getCurrentValue().value |
Exemple de sortie |
|---|---|---|---|---|
true |
BOOLEAN | non applicable | boolean |
true |
25 |
NUMERIC | non applicable | number |
25 |
| "a string text" | CHAINE | TEXT | string |
a string text |
{"firefox": {"name": "Firefox","pref_url": "about:config"} } |
CHAINE | JSON | JSONObject | {"firefox":{"name":"Firefox","pref_url":"about:config"}} |
men:- John Smith- Bill Joneswomen:- Mary Smith- Susan Williams |
STRING | YAML | java.lang.String |
`"men:
|
Pour la propriété de type secret reference, voir la section readme evaluate a secret property.
Indicateur de fonction
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);
Propriété
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);
Ecoute des modifications apportées aux fonctionnalités et aux propriétés
Le SDK propose un mécanisme basé sur les événements qui vous avertit en temps réel lorsque la configuration d'un indicateur de fonctionnalité ou d'une propriété change. Vous pouvez écouter l'événement configurationUpdate en utilisant
le même appConfigClient.
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);
});