Antipatrón: Invoca llamadas a la API de Management desde un proxy de API

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

Edge cuenta con una potente utilidad llamada “APIs de administración” que ofrece servicios como los siguientes:

  • Implementa o anula la implementación de proxies de API
  • Configuración de hosts virtuales, almacenes de claves y almacenes de confianza, entre otros.
  • Crear, borrar o actualizar entidades como KeyValueMaps, productos de API, apps para desarrolladores, desarrolladores, claves de consumidor, etcétera
  • Recupera información sobre estas entidades

Se puede acceder a estos servicios a través de un componente llamado Servidor de administración en la plataforma Apigee Edge. Estos servicios se pueden invocar fácilmente con la ayuda de llamadas a la API de administración simples.

A veces es posible que necesitemos usar uno o más de estos servicios de proxy de API en el entorno de ejecución. Esto se debe a que las entidades, como KeyValueMaps, tokens de acceso OAuth, productos de API, apps para desarrolladores, desarrolladores, claves de consumidor, etc., contienen información útil en forma de pares clave-valor, atributos personalizados o como parte de su perfil.

Por ejemplo, puedes almacenar la siguiente información en KeyValueMap para que sea más segura y accesible en el entorno de ejecución:

  • URLs de destino de backend
  • Propiedades de los entornos
  • Credenciales de seguridad de backend o sistemas de terceros

Del mismo modo, es posible que quieras obtener la lista de productos de API o la dirección de correo electrónico del desarrollador en el entorno de ejecución. Esta información estará disponible como parte del perfil de apps de desarrollador.

Toda esta información se puede usar de manera eficaz en el entorno de ejecución para habilitar el comportamiento dinámico en las políticas o el código personalizado dentro de Apigee Edge.

Antipatrón

Se prefieren las APIs de administración, ya que son útiles para tareas administrativas y no se deben usar para realizar ninguna lógica de tiempo de ejecución en el flujo de proxies de API. Esto se debe a los siguientes motivos:

  • El uso de las APIs de administración para acceder a información sobre las entidades, como KeyValueMaps, tokens de acceso de OAuth o para cualquier otro fin desde los proxies de API, hace que dependa de los servidores de administración.
  • Los servidores de administración no forman parte del componente del entorno de ejecución de Edge y, por lo tanto, es posible que no tengan alta disponibilidad.
  • Es posible que los servidores de administración no se aprovisionen dentro de la misma red o centro de datos y, por lo tanto, pueden ingresar latencias de red en el entorno de ejecución.
  • Las entradas de los servidores de administración se almacenan en caché durante un período más prolongado, por lo que es posible que no podamos ver los datos más recientes de inmediato en los proxies de API si realizamos operaciones de escritura y lectura en un período breve.
  • Aumenta los saltos de red en el entorno de ejecución.

En la siguiente muestra de código, la llamada a la API de administración se realiza a través del código JavaScript personalizado para recuperar la información de KeyValueMap:

var response = httpClient.send('https://api.enterprise.apigee.com/v1/o/org_name/e/env_name/keyvaluemaps/kvm_name')

Si el servidor de administración no está disponible, el código JavaScript que invoca la llamada a la API de administración falla. Esto provoca que la solicitud a la API falle.

Impacto

  • Genera dependencia adicional de los servidores de administración durante el tiempo de ejecución. Cualquier falla en los servidores de administración afectará las llamadas a la API.
  • Las credenciales de usuario para las APIs de administración deben almacenarse de forma local o en algún almacén seguro, como KVM encriptado.
  • Consecuencias para el rendimiento debido a la invocación del servicio de administración por medio de la red
  • Es posible que no vean los valores actualizados de inmediato debido a un mayor vencimiento de la caché en los servidores de administración.

Práctica recomendada

Existen maneras más eficaces de recuperar información de entidades como KeyValueMaps, productos de API, DeveloperApps, desarrolladores, claves de consumidor, etc. en el tiempo de ejecución. Estos son algunos ejemplos:

  • Usa una política de KeyValueMapOperations para acceder a la información de KeyValueMaps. Este es un código de muestra que muestra cómo recuperar información del KeyValueMap:
    <!-- /antipatterns/examples/2-6.xml -->
    <KeyValueMapOperations mapIdentifier="urlMap" async="false"
        continueOnError="false" enabled="true" name="GetURLKVM">
      <DisplayName>GetURLKVM</DisplayName>
      <ExpiryTimeInSecs>86400</ExpiryTimeInSecs>
      <Scope>environment</Scope>
      <Get assignTo="urlHosti" index="2">
        <Key>
          <Parameter>urlHost_1</Parameter>
        </Key>
      </Get>
    </KeyValueMapOperations>
    
  • Para acceder a la información sobre productos de API, apps para desarrolladores, desarrolladores, claves de consumidor, etc. en el proxy de API, puedes realizar una de las siguientes acciones:
    • Si tu flujo de proxy de API tiene una política VerifyAPIKey, puedes acceder a la información mediante las variables de flujo propagadas como parte de esta política. A continuación, se muestra un código de muestra que muestra cómo recuperar el nombre y la información created_by de una app de desarrollador con JavaScript:
      <!-- /antipatterns/examples/2-7.xml -->
      print("Application Name ", context.getVariable(""verifyapikey. VerifyAPIKey.app.name"));
      print("Created by:", context.getVariable("verifyapikey. VerifyAPIKey.app.created_by"));
      
    • Si el flujo de tu proxy de API no tiene una política VerifyAPIKey, puedes acceder a los perfiles de los productos de API, las apps para desarrolladores, etc. mediante las políticas de entidad de acceso y extracción de variables:
      1. Recupera el perfil de DeveloperApp con la política AccessEntity:
        <!-- /antipatterns/examples/2-8.xml -->
        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <AccessEntity async="false" continueOnError="false" enabled="true" name="GetDeveloperApp">
          <DisplayName>GetDeveloperApp</DisplayName>
          <EntityType value="app"></EntityType>
          <EntityIdentifier ref="developer.app.name" type="appname"/>
          <SecondaryIdentifier ref="developer.id" type="developerid"/>
        </AccessEntity>
        
      2. Extrae el appId de DeveloperApp con la política ExtractVariables:
        <!-- /antipatterns/examples/2-9.xml -->
        <ExtractVariables name="Extract-Developer App-Info">
          <!--
            The source element points to the variable populated by AccessEntity policy.
            The format is <policy-type>.<policy-name>
            In this case, the variable contains the whole developer profile.
          -->
          <Source>AccessEntity.GetDeveloperApp"</Source>
          <VariablePrefix>developerapp</VariablePrefix>
          <XMLPayload>
            <Variable name="appld" type="string">
              <!-- You parse elements from the developer profile using XPath. -->
              <XPath>/App/AppId</XPath>
            </Variable>
          </XMLPayload>
        </ExtractVariables>
        

Lecturas adicionales