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

Estás viendo la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

Apigee tiene una utilidad potente llamada API de Apigee que ofrece servicios como los siguientes:

  • Implementar o anular la implementación de proxies de API
  • Configurar hosts virtuales, almacenes de claves y almacenes de confianza, entre otros
  • Crear, borrar y actualizar entidades como mapas de clave-valor (KVM), productos de API, apps de desarrolladores, desarrolladores, claves de consumidor, etcétera
  • Recupera información sobre estas entidades

Se puede acceder a estos servicios mediante un componente llamado servidor de administración en la plataforma de Apigee. Estos servicios se pueden invocar con facilidad mediante llamadas a la API sencillas.

A veces es posible que necesitemos usar uno o más de estos servicios de proxies de API en el entorno de ejecución. Esto se debe a que las entidades como KVM, tokens de acceso de 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 KVM 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.

Antipatrón

Se prefieren las API de Apigee y son útiles para las tareas administrativas y no deben usarse con el fin de realizar lógicas de entorno de ejecución en el flujo de proxies de API. Esto se debe a lo siguiente:

  • El uso de las API de Apigee para acceder a información sobre las entidades, como KVM, tokens de acceso de OAuth o para cualquier otro propósito desde proxies de API, genera dependencia de los servidores de administración.
  • Los servidores de administración no forman parte de los componentes del entorno de ejecución de Apigee 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 en los servidores de administración se almacenan en caché por un período más largo, por lo que es posible que no puedas ver los datos más recientes de inmediato en los proxies de API si realizas operaciones de escritura y lectura en un período corto.
  • Aumenta los saltos de red en el entorno de ejecución.

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

var response = httpClient.send('https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/keyvaluemaps')

Si el servidor de administración no está disponible, el código JavaScript que invoca la llamada a la API de Apigee 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 API de Apigee deben almacenarse de forma local o en algún almacenamiento seguro, como un 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 veas los valores actualizados de inmediato debido al vencimiento más largo de la caché en los servidores de administración.

Práctica recomendada

Existen formas más eficaces de recuperar información de entidades como KVM, productos de API, aplicaciones de desarrolladores, desarrolladores, claves de consumidor, etc. en el entorno de ejecución. A continuación, se presentan algunos ejemplos:

  • Usa una política KeyValueMapOperations para acceder a la información de los KVM. Aquí hay un código de muestra que indica cómo recuperar información del KVM:
    <!-- /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>
    
  • A fin de acceder a la información sobre productos de API, apps de 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 indica cómo recuperar la información de nombre y created_by de una app de desarrolladores mediante 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 del proxy de API no tiene una política VerifyAPIKey, puedes acceder a los perfiles de los productos de API, las apps de desarrolladores, etcétera. Para ello, usa las políticas AccessEntity y ExtractVariables:
      1. Recupera el perfil de la app para desarrolladores 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 la app de desarrolladores 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