SDK de servidor de Configuración de apps para Python

El servicio App Configuration proporciona el SDK para integrarse con la aplicación Phyton.

Integración del SDK de servidor para Python

El servicio App Configuration proporciona el SDK para integrarse con la aplicación Phyton. Puede evaluar los valores del distintivo de característica o propiedad integrando el SDK de App Configuration.

  1. Utilice uno de los métodos siguientes para instalar el SDK:

    Utilizando pip

    pip install --upgrade ibm-appconfiguration-python-sdk
    

    Utilizando easy_install

    easy_install --upgrade ibm-appconfiguration-python-sdk
    
  2. En el código de la aplicación Python, incluya el módulo SDK con:

    from ibm_appconfiguration import AppConfiguration, Feature, Property, ConfigurationType
    
  3. Inicialice el sdk para conectarse con la instancia de servicio de App Configuration.

    appconfig_client = AppConfiguration.get_instance()
    appconfig_client.init(region='region', guid='guid', apikey='apikey')
    appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev')
    

    Donde:

    • region: Nombre de la región donde se crea la instancia del servicio App Configuration. Consulte aquí la lista de lugares compatibles. Por ejemplo: us-south, au-syd, etc.
    • guid: GUID del servicio App Configuration. Obténgalo de la sección de credenciales de servicio del panel de control de servicio de App Configuration.
    • apikey: ApiKey del servicio App Configuration. Obténgalo de la sección de credenciales de servicio del panel de control de servicio de App Configuration.
    • collection_id: ID de la colección creada en la instancia de servicio App Configuration.
    • environment_id: ID del entorno creado en la instancia de servicio App Configuration.

    En init() y set_context() son los métodos de inicialización y deben invocarse una sola vez utilizando appconfig_client. El appconfig_client, cuando se inicializa, se puede obtener entre módulos utilizando AppConfiguration.get_instance(). Para obtener más información, consulte Captación de appconfig_client en otros módulos.

Utilización de puntos finales privados

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.

appconfig_client.use_private_endpoint(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 su aplicación y el SDK continúen funcionando incluso durante el improbable escenario de una caída del servicio App Configuration, a través del reinicio de su aplicación, puede configurar el SDK para que funcione utilizando una caché persistente. El SDK utiliza la memoria caché persistente para almacenar los datos de App Configuration que están disponibles tras reinicios de la aplicación.

# 1. default (without persistent cache)
appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev')

# 2. optional (with persistent cache)
appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev', options={
   'persistent_cache_dir': '/var/lib/docker/volumes/'
})

Donde:

  • persistent_cache_dir: Ruta absoluta a un directorio que tiene permisos de lectura y escritura para el usuario. El SDK crea un archivo - appconfiguration.json en el directorio especificado, y se utiliza como caché persistente para almacenar la información del servicio App Configuration.

    Cuando la caché persistente está activada, el SDK mantiene la última configuración buena conocida en la caché persistente. Si no se puede acceder al servidor App Configuration, se cargan las últimas configuraciones en la caché persistente para que la aplicación siga funcionando.

Asegúrese de que el archivo de memoria caché creado en el directorio especificado no se pierda ni se suprima en ningún caso. Por ejemplo, considere el caso cuando se reinicia un pod de kubernetes y el archivo de memoria caché (appconfiguration.json) se ha almacenado en un volumen efímero del pod. A medida que se reinicia el pod, kubernetes destruye el volumen efermal en el pod, como resultado se suprime el archivo de memoria caché. 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 servir configuraciones y realizar evaluaciones de propiedades y distintivos de características sin estar conectado al servicio App Configuration.

appconfig_client.set_context(collection_id='collection_id', environment_id='environment_id', options={
  'bootstrap_file': 'saflights/flights.json',
  'live_config_update_enabled': False
})

Donde:

  • bootstrap_file: Ruta absoluta del archivo JSON, que contiene detalles de configuración. Asegúrese de proporcionar un archivo JSON adecuado. Puede generar este archivo mediante el comando ibmcloud ac export de la CLI IBM Cloud App Configuration.
  • live_config_update_enabled: Actualización en directo de la configuración desde el servidor. Establezca este valor en False si los nuevos valores de configuración no deben obtenerse del servidor. De forma predeterminada, este valor se establece en True.

Ejemplos para utilizar API relacionadas con propiedades y características

Consulte los ejemplos especificados para utilizar las API relacionadas con propiedades y características.

Obtener una única característica

feature = appconfig_client.get_feature('online-check-in')  # feature can be None incase of an invalid feature id

if feature is not None:
   print(f'Feature Name : {0}'.format(feature.get_feature_name()))
   print(f'Feature Id : {0}'.format(feature.get_feature_id()))
   print(f'Feature Data Type : {0}'.format(feature.get_feature_data_type()))
   if feature.is_enabled():
      # feature flag is enabled
   else:
      # feature flag is disabled

Obtener todas las características

features_dictionary = appconfig_client.get_features()

Evaluación de características

Puede utilizar el método feature.get_current_value(entity_id, entity_attributes) para evaluar el valor del indicador de característica. Este método devuelve uno de los valores Habilitado o Inhabilitado o Alterado basándose en la evaluación. El tipo de datos del valor devuelto coincide con el del distintivo de característica.

entity_id = "john_doe"
entity_attributes = {
   'city': 'Bangalore',
   'country': 'India'
}
feature_value = feature.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes)
  • entity_id: 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.

  • entity_attributes: 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 proporcionar entity_attributes para 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

property = appconfig_client.get_property('check-in-charges')  # property can be None incase of an invalid property id
if property is not None:
   print(f'Property Name : {0}'.format(property.get_property_name()))
   print(f'Property Id : {0}'.format(property.get_property_id()))
   print(f'Property Data Type : {0}'.format(property.get_property_data_type()))

Obtener todas las propiedades

properties_dictionary = appconfig_client.get_properties()

Evaluación de propiedades

Puede utilizar el método property.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes) para evaluar el valor de la propiedad. Este método devuelve el valor de propiedad predeterminado o su valor alterado temporalmente basándose en la evaluación. El tipo de datos del valor devuelto coincide con el de la propiedad.

entity_id = "john_doe"
entity_attributes = {
   'city': 'Bangalore',
   'country': 'India'
}
property_value = property.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes)
  • entity_id: 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.

  • entity_attributes: 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 proporcionar entity_attributes para 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.

Captación de appconfig_client en otros módulos

Cuando se inicializa el SDK, el appconfig_client se puede obtener a través de otros módulos como se muestra:

# **other modules**

from ibm_appconfiguration import AppConfiguration

appconfig_client = AppConfiguration.get_instance()
feature = appconfig_client.get_feature('online-check-in')
enabled = feature.is_enabled()
feature_value = feature.get_current_value(entity_id, entity_attributes)

Tipos de datos soportados

Puede configurar propiedades y distintivos de características con el servicio App Configuration, dando soporte a los siguientes tipos de datos: Booleano, Numérico y Serie. El tipo de datos Serie puede tener el formato de una serie de texto, JSON o YAML. El SDK procesa cada formato tal como se muestra en la tabla.

Ejemplos de resultados
Valor de característica o propiedad Tipo de datos Formato de datos Tipo de datos devueltos por GetCurrentValue() Salida de ejemplo
true BOOLEANO No aplicable bool true
25 NUMERIC No aplicable int 25
"un texto de serie" STRING TEXT string a string text
{"firefox": {
"name": "Firefox",
"pref_url": "about:config"
}}
STRING JSON Dictionary or List of Dictionary {'firefox': {'name': 'Firefox', 'pref_url': 'about:config'}}
men:
- John Smith
- Bill Jones
women:
- Mary Smith
- Susan Williams
STRING YAML Dictionary {'men': ['John Smith', 'Bill Jones'], 'women': ['Mary Smith', 'Susan Williams']}

Distintivo de característica

feature = appconfig_client.get_feature('json-feature')
feature.get_feature_data_type() // STRING
feature.get_feature_data_format() // JSON
feature.get_current_value(entityId, entityAttributes) // returns single dictionary object or list of dictionary object

// Example Below
// input json :- [{"role": "developer", "description": "do coding"},{"role": "tester", "description": "do testing"}]
// expected output :- "do coding"

tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val[0]['description']

// input json :- {"role": "tester", "description": "do testing"}
// expected output :- "tester"

tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val['role']

feature = appconfig_client.getFeature('yaml-feature')
feature.get_feature_data_type() // STRING
feature.get_feature_data_format() // YAML
feature.get_current_value(entityId, entityAttributes) // returns dictionary object

// Example Below
// input yaml string :- "---\nrole: tester\ndescription: do_testing"
// expected output :- "do_testing"

tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val['description']

Propiedad

property = appconfig_client.get_property('json-property')
property.get_property_data_type() // STRING
property.get_property_data_format() // JSON
property.get_current_value(entityId, entityAttributes) // returns single dictionary object or list of dictionary object

// Example Below
// input json :- [{"role": "developer", "description": "do coding"},{"role": "tester", "description": "do testing"}]
// expected output :- "do coding"

tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val[0]['description']

// input json :- {"role": "tester", "description": "do testing"}
// expected output :- "tester"

tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val['role']

property = appconfig_client.get_property('yaml-property')
property.get_property_data_type() // STRING
property.get_property_data_format() // YAML
property.get_current_value(entityId, entityAttributes) // returns dictionary object

// Example Below
// input yaml string :- "---\nrole: tester\ndescription: do_testing"
// expected output :- "do_testing"

tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val['description']

Establecer escucha para los cambios de datos de propiedades y propiedades

El SDK proporciona un mecanismo para notificarle en tiempo real cuando cambia la configuración de las propiedades o los indicadores de características. Puedes suscribirte a los cambios de configuración utilizando el mismo appconfig_client.

def configuration_update(self):
   print('Received updates on configurations')
   # **add your code**
   # To find the effect of any configuration changes, you can call the feature or property related methods

   # feature = appconfig_client.getFeature('online-check-in')
   # new_value = feature.get_current_value(entity_id, entity_attributes)

appconfig_client.register_configuration_update_listener(configuration_update)

Obtener datos más recientes

appconfig_client.fetch_configurations()