SDK do servidor App Configuration para Node
O serviço App Configuration fornece SDK para integrar com o seu microsserviço ou aplicativo Node.js.
A versão v0.4.0 traz alterações no valor de retorno do método getCurrentValue . Portanto, se você já estiver usando uma versão anterior à v0.4.0, leia o guia de migração antes de atualizar o SDK para a versão mais recente.
Integrando o SDK do servidor para Node
O serviço App Configuration fornece SDK para integrar com o seu microsserviço ou aplicativo Node.js. É possível avaliar os valores de sua sinalização de recurso e propriedade integrando o SDK do App Configuration.
-
Instalar o SDK. Use o código a seguir a partir do registro
npm.npm install ibm-appconfiguration-node-sdk@latest -
Em seu microsserviço Node.js, inclua o módulo SDK com:
const { AppConfiguration } = require('ibm-appconfiguration-node-sdk'); -
Inicialize o SDK para se conectar à sua instância de serviço do 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); }Em que:
region: Nome da região onde a instância do serviço “ App Configuration ” é criada. Veja a lista de locais com suporte aqui. Por exemplo: -us-south,au-sydetc.guid: ID da instância do serviço App Configuration. Você pode obtê-la na seção de credenciais de serviço do painel do App Configuration.apikey: ApiKey do serviço App Configuration. Você pode obtê-la na seção de credenciais de serviço do painel do App Configuration.collectionId: ID da coleção criada na instância do serviço App Configuration, na seção “Coleções”.environmentId: ID do ambiente criado na instância de serviço do App Configuration sob a seção Ambientes.
Os
init()esetContext()são os métodos de inicialização e precisam ser iniciados apenas uma vez usandoappConfigClient. OappConfigClient, depois de inicializado, pode ser obtido através de módulos usandoAppConfiguration.getInstance().
Usando terminais privados
Opcionalmente, configure o SDK para se conectar ao serviço App Configuration usando um terminal privado que é acessível somente através da rede privada IBM Cloud.
appConfigClient.usePrivateEndpoint(true);
Isso deve ser feito antes de ligar para a função init no SDK.
Opção para usar um cache persistente para configuração
Para que seu aplicativo e o SDK continuem funcionando durante uma eventual indisponibilidade do serviço App Configuration — mesmo que o aplicativo seja reiniciado —, você pode configurar o SDK para usar um cache persistente. O SDK usa o cache persistente para armazenar dados do App Configuration que estão disponíveis nas reinicializações do seu aplicativo.
// 1. default (without persistent cache)
appConfigClient.setContext(collectionId, environmentId)
// 2. optional (with persistent cache)
appConfigClient.setContext(collectionId, environmentId, {
persistentCacheDirectory: '/var/lib/docker/volumes/'
})
Em que:
-
persistentCacheDirectory: Caminho absoluto para um diretório no qual o usuário tenha permissão de leitura e gravação. O SDK cria um arquivo —appconfiguration.json— no diretório especificado, e ele é usado como cache persistente para armazenar as informações do serviço App Configuration.Quando o cache persistente é ativado, o SDK mantém a última boa configuração conhecida no cache persistente. Se o servidor App Configuration estiver indisponível, as configurações mais recentes do cache persistente são carregadas no aplicativo para que ele continue funcionando.
Certise-se de que o arquivo de cache não esteja perdido ou excluído em qualquer caso. Por exemplo, considere o caso em que um pod do Kubernetes é reiniciado e o arquivo de cache (appconfiguration.json) estava armazenado no volume
efêmero do pod. Quando o pod é reiniciado, o comando Kubernetes destrói o volume efêmero no pod; consequentemente, o arquivo de cache é excluído. Então, certifica-se de que o arquivo de cache criado pelo SDK esteja sempre armazenado
em volume persistente, fornecendo o caminho absoluto correto do diretório persistente.
Opções off-line
O SDK também foi projetado para fornecer configurações e realizar avaliações de sinalizadores de recursos e propriedades sem estar conectado a um serviç App Configuration.
appConfigClient.setContext(collectionId, environmentId, {
bootstrapFile: 'saflights/flights.json',
liveConfigUpdateEnabled: false
})
Em que:
bootstrapFile: Caminho absoluto do arquivo JSON, que contém os detalhes de configuração. Certifique-se de fornecer um arquivo JSON adequado. Você pode gerar este arquivo usando o comandoibmcloud ac exportdo comando IBM Cloud App Configuration CLI.liveConfigUpdateEnabled: Atualização da configuração em tempo real a partir do servidor. Defina este valor como “false” se os novos valores de configuração não forem obtidos do servidor.
Exemplos para uso de APIs relacionadas a recurso e propriedade
Veja os exemplos a seguir para usar as APIs relacionadas ao recurso.
Obter recurso único
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
}
}
Obter todos os recursos
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()} `);
}
Avaliação do recurso
É possível usar o método feature.getCurrentValue(entityId, entityAttributes) para avaliar o valor da sinalização do recurso. Este método retorna um objeto JSON contendo valor avaliado, status do recurso ativado e detalhes de
avaliação.
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 da entidade. Trata-se de um identificador de cadeia relacionado à entidade contra a qual o recurso é avaliado. Por exemplo, uma entidade pode ser uma instância de um app que é executada em um dispositivo móvel, um microsserviço que é executado na nuvem ou um componente de infraestrutura que executa esse microsserviço. Para que qualquer entidade interaja com o App Configuration, ela deve fornecer um ID de entidade exclusivo. -
entityAttributes: Um objeto JSON que consiste no nome do atributo e seus valores que definem a entidade especificada. Este é um parâmetro opcional se o flag do recurso não estiver configurado com nenhuma definição de direcionamento. Se o direcionamento estiver configurado, entãoentityAttributesdeverá ser fornecido para a avaliação de regra. Um atributo é um parâmetro que é usado para definir um segmento. O SDK usa os valores de atributo para determinar se a entidade especificada satisfaz as regras de destinação, e retorna o valor de sinalizador de recurso apropriado.
Obter propriedade única
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()} `);
}
Obter todas as propriedades
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()} `);
}
Avaliar uma propriedade
É possível usar o método property.getCurrentValue(entityId, entityAttributes) para avaliar o valor da propriedade. Este método retorna um objeto JSON contendo valor avaliado e detalhes de avaliação.
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 da entidade. Trata-se de um identificador de cadeia relacionado à entidade contra a qual a propriedade é avaliada. Por exemplo, uma entidade pode ser uma instância de um app que é executada em um dispositivo móvel, um microsserviço que é executado na nuvem ou um componente de infraestrutura que executa esse microsserviço. Para que qualquer entidade interaja com o App Configuration, ela deve fornecer um ID de entidade exclusivo. -
entityAttributes: Um objeto JSON que consiste no nome do atributo e seus valores que definem a entidade especificada. Este é um parâmetro opcional se a propriedade não estiver configurada com nenhuma definição de direcionamento. Se o direcionamento estiver configurado, entãoentityAttributesdeverá ser fornecido para a avaliação de regra. Um atributo é um parâmetro que é usado para definir um segmento. O SDK usa os valores de atributo para determinar se a entidade especificada satisfaz as regras de destinação, e retorna o valor de propriedade apropriado.
Obter propriedade secreta
Método explícito para obter as referências secretas armazenadas em App Configuration.
const secretPropertyObject = appConfigClient.getSecret(propertyId, secretsManagerObject);
Em que
-
propertyID:propertyIDé o identificador de cadeia única, ao usar isso você é capaz de buscar o imóvel que fornecerá os dados necessários para buscar o segredo. -
secretsManagerObject:secretsManagerObjecté um objeto cliente Secrets Manager cliente que é usado para obter os segredos durante a avaliação secreta do imóvel. Para obter mais informações sobre como criar um objeto cliente Secrets Manager, veja aqui.
Avaliar uma propriedade secreta
Use o método secretPropertyObject.getCurrentValue(entityId, entityAttributes) para avaliar o valor da propriedade secreta. A saída dessa chamada de método é diferente de getCurrentValue iniciada usando recurso e
objetos de propriedade. Este método retorna um Promise que resolve com a resposta a partir do Secrets Manager ou rejeita com um Erro. O valor resolvido é o valor secreto real da referência secreta avaliada. A resposta contém o corpo, os
cabeçalhos, o código de status e o texto de status. Se usar async ou aguardar, use try ou catch for handling erros.
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
}
Em que
-
entityId:entityIdé um identificador string que está relacionado com a Entidade contra a qual a propriedade é avaliada. Por exemplo, uma entidade pode ser uma instância de um aplicativo executado em um dispositivo móvel, um microsserviço executado na nuvem ou um componente da infraestrutura que hospeda esse microsserviço. Para que qualquer entidade interaja com o App Configuration, ela deve fornecer um ID de entidade exclusivo. -
entityAttributes:entityAttributesé um mapa do tipomap[string]interface{}que consiste no nome do atributo e seus valores que definem a entidade especificada. Este é um parâmetro opcional se a propriedade não estiver configurada com nenhuma definição de direcionamento. Se o direcionamento estiver configurado, entãoentityAttributesdeverá ser fornecido para a avaliação de regra. Um atributo é um parâmetro que é usado para definir um segmento. O SDK usa os valores de atributo para determinar se a entidade especificada satisfaz as regras de destinação, e retorna o valor adequado.
Recuperação do appConfigClient em outros módulos
Depois que o SDK for inicializado, o objeto appConfigClient poderá ser obtido em outros módulos, conforme mostrado a seguir:
// **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 dados suportados
Você pode configurar feature flags e propriedades usando App Configuration, que suporta os seguintes tipos de dados: Booleano, Numérico, SecretRef, e String. O tipo de dados de sequência pode estar no formato de uma sequência de texto, JSON ou YAML. O SDK processa cada formato como mostrado na tabela.
| Recurso ou Valor da Propriedade | Tipo de dados | Formato de dados | Tipo de dados retornados por getCurrentValue().value |
Saída de exemplo |
|---|---|---|---|---|
true |
BOOLEAN | não aplicável | boolean |
true |
25 |
NUMÉRICO | não aplicável | number |
25 |
| "um texto string" | STRING | TEXTO | 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 propriedade de tipo referência secreta, consulte a seção de releitura avalie uma propriedade secreta.
Sinalizador do recurso
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);
Propriedade
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);
Atender às mudanças de recurso ou de propriedade
O SDK oferece um mecanismo baseado em eventos para notificá-lo em tempo real quando houver alterações na configuração de um sinalizador de recurso ou de uma propriedade. Você pode ouvir o evento configurationUpdate usando o mesmo
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);
});