SDK de servidor de Configuración de apps para Node
El servicio App Configuration proporciona el SDK para integrarse con la aplicación o el microservicio Node.js.
La versión v0.4.0 incluye cambios en el valor de retorno del método « getCurrentValue ». Por lo tanto, si ya estás utilizando una versión anterior a v0.4.0, lee la guía de migración antes de actualizar el SDK a la última versión.
Integración del SDK de servidor para Node
El servicio App Configuration proporciona el SDK para integrarse con la aplicación o el microservicio Node.js. Puede evaluar los valores del distintivo de característica y propiedad integrando el SDK de App Configuration.
-
Instale el SDK. Utilice el código siguiente del registro de
npm.npm install ibm-appconfiguration-node-sdk@latest -
En el microservicio Node.js, incluya el módulo de SDK con:
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk'); -
Inicialice el sdk para conectarse con la instancia de servicio de 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); }Donde:
region: Nombre de la región en la que se crea la instancia del servicio « App Configuration ». Consulte aquí la lista de lugares compatibles. Por ejemplo:us-south,au-syd, etc.guid: ID de instancia del servicio « App Configuration ». Puedes encontrarlo en la sección de credenciales del servicio del panel de control de App Configuration.apikey: ApiKey del servicio « App Configuration ». Puedes encontrarlo en la sección de credenciales del servicio del panel de control de App Configuration.collectionId: ID de la colección creada en una instancia del servicio « App Configuration » en la sección «Colecciones».environmentId: Id del entorno creado en la instancia de servicio Configuración de apps en la sección Entornos.
init()ysetContext()son los métodos de inicialización y deben iniciarse sólo una vez utilizandoappConfigClient. ElappConfigClient, una vez inicializado, se puede obtener entre módulos utilizandoAppConfiguration.getInstance().
Utilización de puntos finales privados
Opcionalmente, establezca el SDK para conectarse al servicio App Configuration utilizando un punto final privado al que solo se puede acceder a través de la red privada IBM Cloud.
appConfigClient.usePrivateEndpoint(true);
Esto debe hacerse antes de llamar a la función init en el SDK.
Opción para utilizar una memoria caché persistente para la configuración
Para que tu aplicación y el SDK puedan seguir funcionando en el improbable caso de que el servicio App Configuration no esté disponible durante los reinicios de tu aplicación, puedes configurar el SDK para que utilice una caché persistente. El SDK utiliza la memoria caché persistente para almacenar datos de App Configuration que están disponibles entre reinicios de la aplicación.
// 1. default (without persistent cache)
appConfigClient.setContext(collectionId, environmentId)
// 2. optional (with persistent cache)
appConfigClient.setContext(collectionId, environmentId, {
persistentCacheDirectory: '/var/lib/docker/volumes/'
})
Donde:
-
persistentCacheDirectory: Ruta absoluta a un directorio en el que el usuario tiene permisos de lectura y escritura. El SDK crea un archivo —appconfiguration.json— en el directorio especificado, que se utiliza como caché persistente para almacenar la información del servicio App Configuration.Cuando la memoria caché persistente está habilitada, el SDK mantiene la última configuración correcta conocida en la memoria caché persistente. Si no se puede acceder al servidor App Configuration, se cargan en la aplicación las configuraciones más recientes de la caché persistente para que esta pueda seguir funcionando.
Asegúrese de que el archivo de memoria caché no se pierda ni se suprima en ningún caso. Por ejemplo, consideremos el caso en el que se reinicia un pod de « Kubernetes » y el archivo de caché (appconfiguration.json) se había almacenado
en el volumen efímero del pod. Al reiniciarse el pod, « Kubernetes » destruye el volumen efímero del pod, por lo que el archivo de caché se elimina. Por lo tanto, asegúrese de que el archivo de memoria caché creado por el SDK siempre se
almacena en el volumen persistente proporcionando la vía de acceso absoluta correcta del directorio persistente.
Opciones fuera de línea
El SDK también está diseñado para gestionar configuraciones y realizar evaluaciones de indicadores de características y propiedades sin necesidad de estar conectado a un servici App Configuration.
appConfigClient.setContext(collectionId, environmentId, {
bootstrapFile: 'saflights/flights.json',
liveConfigUpdateEnabled: false
})
Donde:
bootstrapFile: Ruta absoluta del archivo JSON, que contiene los detalles de configuración. Asegúrese de proporcionar un archivo JSON adecuado. Puede generar este archivo utilizando el mandatoibmcloud ac exportde la CLI IBM Cloud App Configuration.liveConfigUpdateEnabled: Actualización de la configuración en tiempo real desde el servidor. Establece este valor en «false» si no se desea obtener los nuevos valores de configuración del servidor.
Ejemplos para utilizar API relacionadas con propiedades y características
Consulte los ejemplos siguientes para utilizar las API relacionadas con características.
Obtener una única característica
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
}
}
Obtener todas las características
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()} `);
}
Evaluación de características
Puede utilizar el método feature.getCurrentValue(entityId, entityAttributes) para evaluar el valor del distintivo de característica. Este método devuelve un objeto JSON que contiene el valor evaluado, el estado habilitado del
distintivo de característica y los detalles de evaluación.
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 la entidad. Se trata de un identificador de serie relacionado con la entidad con la que se evalúa la característica. Por ejemplo, una entidad puede ser una instancia de una app que se ejecuta en un dispositivo móvil, un microservicio que se ejecuta en la nube o un componente de infraestructura que ejecuta dicho microservicio. Para que cualquier entidad interactúe con App Configuration, debe proporcionar un ID de entidad exclusivo. -
entityAttributes: un objeto JSON que consta del nombre de atributo y sus valores que definen la entidad especificada. Este es un parámetro opcional si el distintivo de característica no está configurado con ninguna definición de destino. Si el destino está configurado, se debe proporcionarentityAttributespara la evaluación de regla. Un atributo es un parámetro que se utiliza para definir un segmento. El SDK utiliza los valores de atributo para determinar si la entidad especificada cumple las reglas de destino y devuelve el valor de distintivo de característica adecuado.
Obtener una única propiedad
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()} `);
}
Obtener todas las propiedades
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()} `);
}
Evaluar una propiedad
Puede utilizar el método property.getCurrentValue(entityId, entityAttributes) para evaluar el valor de la propiedad. Este método devuelve un objeto JSON que contiene el valor evaluado y los detalles de evaluación.
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 la entidad. Se trata de un identificador de serie relacionado con la entidad con la que se evalúa la propiedad. Por ejemplo, una entidad puede ser una instancia de una app que se ejecuta en un dispositivo móvil, un microservicio que se ejecuta en la nube o un componente de infraestructura que ejecuta dicho microservicio. Para que cualquier entidad interactúe con App Configuration, debe proporcionar un ID de entidad exclusivo. -
entityAttributes: un objeto JSON que consta del nombre de atributo y sus valores que definen la entidad especificada. Este es un parámetro opcional si la propiedad no está configurada con ninguna definición de destino. Si el destino está configurado, se debe proporcionarentityAttributespara la evaluación de regla. Un atributo es un parámetro que se utiliza para definir un segmento. El SDK utiliza los valores de atributo para determinar si la entidad especificada cumple las reglas de destino y devuelve el valor de propiedad adecuado.
Obtener propiedad de secreto
Método explícito para obtener las referencias de secreto almacenadas en App Configuration.
const secretPropertyObject = appConfigClient.getSecret(propertyId, secretsManagerObject);
Donde,
-
propertyID:propertyIDes el identificador de serie exclusivo, utilizando esto puede captar la propiedad que proporcionará los datos necesarios para captar el secreto. -
secretsManagerObject:secretsManagerObjectes un objeto de cliente Secrets Manager que se utiliza para obtener los secretos durante la evaluación de la propiedad secreta. Para obtener más información sobre cómo crear un objeto de cliente Secrets Manager, consulte aquí.
Evaluar una propiedad secreta
Utilice el método secretPropertyObject.getCurrentValue(entityId, entityAttributes) para evaluar el valor de la propiedad de secreto. La salida de esta llamada de método es diferente de getCurrentValue iniciada utilizando
objetos de característica y propiedad. Este método devuelve una promesa que se resuelve con la respuesta de Secrets Manager o se rechaza con un error. El valor resuelto es el valor de secreto real de la referencia de secreto evaluada.
La respuesta contiene el cuerpo, las cabeceras, el código de estado y el texto de estado. Si utiliza async o await, utilice try o catch para manejar errores.
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
}
Donde,
-
entityId:entityIdes un identificador de serie que está relacionado con la entidad con la que se evalúa la propiedad. Por ejemplo, una entidad puede ser una instancia de una aplicación que se ejecuta en un dispositivo móvil, un microservicio que se ejecuta en la nube o un componente de la infraestructura que aloja dicho microservicio. Para que cualquier entidad interactúe con App Configuration, debe proporcionar un ID de entidad exclusivo. -
entityAttributes:entityAttributeses una correlación de tipomap[string]interface{}que consta del nombre de atributo y sus valores que definen la entidad especificada. Este es un parámetro opcional si la propiedad no está configurada con ninguna definición de destino. Si el destino está configurado, se debe proporcionarentityAttributespara la evaluación de regla. Un atributo es un parámetro que se utiliza para definir un segmento. El SDK utiliza los valores de atributo para determinar si la entidad especificada cumple las reglas de destino y devuelve el valor adecuado.
Obtener el objeto appConfigClient desde otros módulos
Una vez inicializado el SDK, se puede acceder a la clase appConfigClient desde otros módulos, tal y como se muestra a continuación:
// **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)
Tipos de datos soportados
Puedes configurar indicadores de funciones y propiedades mediante App Configuration, que admite los siguientes tipos de datos: booleano, numérico, SecretRef, y cadena. El tipo de datos String puede estar en el formato de una serie de texto, JSON o YAML. El SDK procesa cada formato tal como se muestra en la tabla.
| Valor de característica o propiedad | Tipo de datos | Formato de datos | Tipo de datos devueltos por getCurrentValue().value |
Salida de ejemplo |
|---|---|---|---|---|
true |
BOOLEAN | no aplicable | boolean |
true |
25 |
NUMERIC | no aplicable | number |
25 |
| "un texto de serie" | 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:
|
Para obtener la propiedad de tipo referencia de secreto, consulte la sección de archivo léame evaluar una propiedad de secreto.
Distintivo de característica
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);
Propiedad
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);
Escuchar los cambios de características o propiedades
El SDK ofrece un mecanismo basado en eventos para notificarte en tiempo real los cambios en la configuración de los indicadores de funciones o de las propiedades. Puede escuchar el suceso configurationUpdate utilizando el mismo
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);
});