SDK server App Configuration per Node

App Configuration Il servizio fornisce un SDK per l'integrazione con il proprio microservizio o applicazione Node.js.

La versione v0.4.0 apporta alcune modifiche al valore restituito dal metodo getCurrentValue. Pertanto, se stai già utilizzando una versione precedente all' v0.4.0, ti consigliamo di leggere la guida alla migrazione prima di aggiornare l'SDK all'ultima versione.

Integrazione di SDK server per Node

App Configuration Il servizio fornisce un SDK per l'integrazione con il proprio microservizio o applicazione Node.js. Puoi valutare i valori del tuo indicatore e della tua proprietà della funzione integrando l'SDK App Configuration.

  1. Installa l'SDK. Utilizzare il seguente codice dal Registro di sistema npm.

    npm install ibm-appconfiguration-node-sdk@latest
    
  2. Nel tuo microservizio Node.js, includi il modulo SDK con:

    const {
      AppConfiguration
    } = require('ibm-appconfiguration-node-sdk');
    
  3. Inizializza l'SDK per connetterti alla tua istanza del servizio 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);
    }
    

    Dove:

    • region: Nome della regione in cui viene creata l'istanza del servizio App Configuration. Vedere l'elenco delle località supportate qui. Ad esempio: us-south, au-syd ecc.
    • guid: ID istanza del servizio App Configuration. Ottieni dalla sezione delle credenziali del servizio del dashboard App Configuration.
    • apikey: ApiKey del servizio App Configuration. Ottieni dalla sezione delle credenziali del servizio del dashboard App Configuration.
    • collectionId: ID della raccolta creata nell'istanza del servizio App Configuration nella sezione Raccolte.
    • environmentId: ID dell'ambiente creato nell'istanza del servizio App Configuration nella sezione Ambienti.

    init() e setContext() sono i metodi di inizializzazione e devono essere avviati solo una volta utilizzando appConfigClient. Il appConfigClient, dopo l'inizializzazione, può essere ottenuto attraverso i moduli utilizzando AppConfiguration.getInstance().

Utilizzo degli endpoint privati

Facoltativamente, imposta l'SDK per connetterti al servizio App Configuration utilizzando un endpoint privato accessibile solo tramite la rete privata IBM Cloud.

appConfigClient.usePrivateEndpoint(true);

Ciò deve essere fatto prima di richiamare la funzione init sull'SDK.

Opzione per utilizzare una cache persistente per la configurazione

Affinché la tua applicazione e il tuo SDK continuino le sue operazioni durante l'improbabile indisponibilità del servizio App Configuration durante i riavvii della tua applicazione, puoi configurare l'SDK per utilizzare una cache persistente. L'SDK utilizza la cache persistente per memorizzare i dati App Configuration disponibili durante i riavvii dell'applicazione.

// 1. default (without persistent cache)
appConfigClient.setContext(collectionId, environmentId)

// 2. optional (with persistent cache)
appConfigClient.setContext(collectionId, environmentId, {
  persistentCacheDirectory: '/var/lib/docker/volumes/'
})

Dove:

  • persistentCacheDirectory: percorso assoluto di una directory, che dispone dell'autorizzazione di lettura e scrittura per l'utente. L'SDK crea un file - appconfiguration.json nella directory specificata e viene utilizzato come cache persistente per memorizzare informazioni sul servizio App Configuration.

    Quando la cache persistente è abilitata, l'SDK conserva l'ultima configurazione valida nota nella cache permanente. Se il server App Configuration non è raggiungibile, le configurazioni più recenti nella cache persistente vengono caricate nell'applicazione per continuare a funzionare.

Assicurarsi che il file della cache non venga perso o eliminato in alcun caso. Si consideri, ad esempio, il caso in cui un pod Kubernetes venga riavviato e il file di cache (appconfiguration.json) fosse stato memorizzato nel volume effimero del pod. Quando il pod viene riavviato, il comando Kubernetes elimina il volume effimero presente nel pod; di conseguenza, il file di cache viene eliminato. Quindi, assicurati che il file di cache creato dall'SDK sia sempre memorizzato nel volume persistente fornendo il percorso assoluto corretto della directory persistente.

Opzioni offline

L'SDK è progettato anche per servire le configurazioni, eseguire le valutazioni di indicatore di funzione e proprietà senza essere connesso al servizio App Configuration.

appConfigClient.setContext(collectionId, environmentId, {
   bootstrapFile: 'saflights/flights.json',
   liveConfigUpdateEnabled: false
})

Dove:

  • bootstrapFile: percorso assoluto del file JSON, che contiene dettagli di configurazione. Assicurarsi di fornire un corretto file JSON. Puoi creare questo file utilizzando il comando ibmcloud ac export della CLI IBM Cloud App Configuration.
  • liveConfigUpdateEnabled: Aggiornamento della configurazione dal server. Impostare questo valore su false se i nuovi valori di configurazione non devono essere recuperati dal server.

Esempi per l'uso di API correlate a funzioni e proprietà

Vedi i seguenti esempi per l'utilizzo delle API correlate alla funzione.

Ottieni funzione singola

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

Ottieni tutte le funzioni

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

Valutazione funzione

È possibile utilizzare il metodo feature.getCurrentValue(entityId, entityAttributes) per valutare il valore dell'indicatore di funzione. Questo metodo restituisce un oggetto JSON che contiene il valore valutato, lo stato abilitato dell'indicatore funzione e i dettagli di valutazione.

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 dell'entità. Si tratta di un identificativo stringa correlato all'entità rispetto alla quale viene valutata la funzione. Ad esempio, un'entità potrebbe essere un'istanza di un'applicazione che viene eseguita su un dispositivo mobile, un microservizio che viene eseguito sul Cloud o un componente dell'infrastruttura che esegue tale microservizio. Affinché qualsiasi entità interagisca con App Configuration, deve fornire un ID entità univoco.

  • entityAttributes: un oggetto JSON costituito dal nome dell'attributo e dai relativi valori che definiscono l'entità specificata. Questo è un parametro facoltativo se l'indicatore della funzione non è configurato con alcuna definizione di destinazione. Se la destinazione è configurata, entityAttributes deve essere fornito per la valutazione della regola. Un attributo è un parametro utilizzato per definire un segmento. L'SDK utilizza i valori degli attributi per stabilire se l'entità specificata soddisfa le regole di destinazione e restituisce il valore dell'indicatore della funzione appropriato.

Ottieni singola propriet ...

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

Ottieni tutte le proprietà

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

Valuta una proprietà

È possibile utilizzare il metodo property.getCurrentValue(entityId, entityAttributes) per valutare il valore della proprietà. Questo metodo restituisce un oggetto JSON contenente il valore valutato e i dettagli di valutazione.

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 dell'entità. Si tratta di un identificativo stringa relativo all'entità rispetto alla quale viene valutata la proprietà. Ad esempio, un'entità potrebbe essere un'istanza di un'applicazione che viene eseguita su un dispositivo mobile, un microservizio che viene eseguito sul Cloud o un componente dell'infrastruttura che esegue tale microservizio. Affinché qualsiasi entità interagisca con App Configuration, deve fornire un ID entità univoco.

  • entityAttributes: un oggetto JSON costituito dal nome dell'attributo e dai relativi valori che definiscono l'entità specificata. Questo è un parametro facoltativo se la proprietà non è configurata con alcuna definizione di destinazione. Se la destinazione è configurata, entityAttributes deve essere fornito per la valutazione della regola. Un attributo è un parametro utilizzato per definire un segmento. L'SDK utilizza i valori degli attributi per stabilire se l'entità specificata soddisfa le regole di destinazione e restituisce il valore della proprietà appropriato.

Ottieni proprietà segreta

Metodo esplicito per ottenere i riferimenti segreti memorizzati in App Configuration.

const secretPropertyObject = appConfigClient.getSecret(propertyId, secretsManagerObject);

Dove,

  • propertyID: propertyID è l'identificativo stringa univoco, utilizzando questo è possibile recuperare la proprietà che fornirà i dati necessari per recuperare il segreto.

  • secretsManagerObject: secretsManagerObject è un oggetto client Secrets Manager utilizzato per ottenere i segreti durante la valutazione della proprietà del segreto. Per ulteriori informazioni su come creare un oggetto client Secrets Manager, vedi qui.

Valuta una proprietà segreta

Utilizzare il metodo secretPropertyObject.getCurrentValue(entityId, entityAttributes) per valutare il valore della proprietà del segreto. L'output di questa chiamata al metodo è diverso da quello di getCurrentValue avviato utilizzando gli oggetti funzione e proprietà. Questo metodo restituisce una Promessa che si risolve con la risposta da Secrets Manager o rifiuta con un errore. Il valore risolto è il valore segreto effettivo del riferimento segreto valutato. La risposta contiene il corpo, le intestazioni, il codice di stato e il testo di stato. Se si utilizza async o in attesa, utilizzare try o catch per la gestione degli errori.

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
}

Dove,

  • entityId: entityId è un identificatore stringa correlato all'entità rispetto alla quale viene valutata la proprietà. Ad esempio, un'entità potrebbe essere un'istanza di un'applicazione che viene eseguita su un dispositivo mobile, un microservizio che viene eseguito sul cloud o un componente dell'infrastruttura che esegue tale microservizio. Affinché qualsiasi entità interagisca con App Configuration, deve fornire un ID entità univoco.

  • entityAttributes: entityAttributes è una mappa di tipo map[string]interface{} composta dal nome attributo e dai relativi valori che definiscono l'entità specificata. Questo è un parametro facoltativo se la proprietà non è configurata con alcuna definizione di destinazione. Se la destinazione è configurata, entityAttributes deve essere fornito per la valutazione della regola. Un attributo è un parametro utilizzato per definire un segmento. L'SDK utilizza i valori di attributo per stabilire se l'entità specificata soddisfa le regole di destinazione e restituisce il valore appropriato.

Recupero di appConfigClient su altri moduli

Una volta inizializzato l'SDK, è possibile ottenere appConfigClient attraverso altri moduli, come mostrato di seguito:

// **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)

Tipi di dati supportati

È possibile configurare flag e proprietà delle caratteristiche con App Configuration, supportando i seguenti tipi di dati: Boolean, Numeric, SecretRef, e String. Il tipo di dati stringa può essere nel formato di una stringa di testo, JSON o YAML. L'SDK elabora ciascun formato come mostrato nella tabella.

Esempi di risultati
Valore della funzione o della proprietà Tipo di dati Formato dati Tipo di dati restituiti da getCurrentValue().value Output di esempio
true BOOLEAN non applicabile boolean true
25 NUMERIC non applicabile number 25
"una stringa di testo" 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 Jones
women:
- Mary Smith
- Susan Williams
STRING YAML java.lang.String

`"men:

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

Per la proprietà di tipo riferimento segreto, fare riferimento alla sezione del readme valutare una proprietà segreta.

Indicatore di funzione

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

Proprietà

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

Ascolta le modifiche della funzione o della proprietà

L'SDK fornisce un meccanismo basato sugli eventi per notificare in tempo reale le modifiche di configurazione dell'indicatore della funzione o della proprietà. Puoi ascoltare l'evento configurationUpdate utilizzando lo stesso 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);
});