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.

  1. Installez le kit de développement de logiciels (SDK). Utilisez le code suivant à partir du registre npm.

    npm install ibm-appconfiguration-node-sdk@latest
    
  2. Dans votre microservice Node.js, incluez le module SDK avec :

    const {
      AppConfiguration
    } = require('ibm-appconfiguration-node-sdk');
    
  3. 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-syd etc.
    • 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 ».
    • environmentId correspond à l'ID de l'environnement créé dans l'instance de service App Configuration sous la section Environnements.

    init() et setContext() sont les méthodes d'initialisation et doivent être démarrées une seule fois à l'aide de appConfigClient. Le appConfigClient, une fois initialisé, peut être obtenu entre les modules à l'aide de AppConfiguration.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 commande ibmcloud ac export de 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é, entityAttributes doit ê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é, entityAttributes doit ê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);

  • propertyID: propertyID est 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: secretsManagerObject est 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
}

  • entityId: entityId est 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: entityAttributes est une mappe de type map[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é, entityAttributes doit ê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.

Exemples de résultats
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 Jones
women:
- Mary Smith
- Susan Williams
STRING YAML java.lang.String

`"men:

  • John Smith
  • Bill Jones\women:
  • Mary Smith
  • Susan Williams"`

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);
});