Antipattern: richiamare chiamate API Apigee da un proxy API

Stai visualizzando la documentazione relativa a Apigee e Apigee ibrido.
Visualizza la documentazione di Apigee Edge.

Apigee ha una potente utilità chiamata API Apigee che offre servizi come:

  • Deployment o annullamento del deployment dei proxy API
  • Configurazione di host virtuali, archivi chiavi e archivi attendibili e così via
  • Creazione, eliminazione e aggiornamento di entità come mappe chiave-valore (KVM), prodotti API, app per sviluppatori, sviluppatori, chiavi consumer e così via
  • Recupero delle informazioni su queste entità

Questi servizi sono resi accessibili tramite un componente chiamato Management Server nella piattaforma Apigee. Questi servizi possono essere richiamati facilmente con l'aiuto di semplici chiamate API.

A volte potremmo aver bisogno di utilizzare uno o più di questi servizi da proxy API in fase di runtime. Questo perché entità come KVM, token di accesso OAuth, prodotti API, app per sviluppatori, sviluppatori, chiavi utente e così via contengono informazioni utili sotto forma di coppie chiave-valore, attributi personalizzati o come parte del proprio profilo.

Ad esempio, puoi archiviare le seguenti informazioni in una KVM per renderla più sicura e accessibile in fase di runtime:

  • URL di destinazione backend
  • Proprietà ambiente
  • Credenziali di sicurezza di sistemi backend o di terze parti

Analogamente, potresti voler ricevere l'elenco dei prodotti API o l'indirizzo email dello sviluppatore in fase di runtime. Queste informazioni saranno disponibili nel profilo app sviluppatore.

Tutte queste informazioni possono essere utilizzate efficacemente in fase di runtime per consentire il comportamento dinamico nei criteri o nel codice personalizzato all'interno di Apigee.

Antipattern

Le API Apigee sono preferite e utili per le attività amministrative e non dovrebbero essere utilizzate per eseguire alcuna logica di runtime nel flusso dei proxy API. I motivi sono i seguenti:

  • L'utilizzo delle API Apigee per accedere a informazioni su entità come KVM, token di accesso OAuth o per qualsiasi altro scopo dai proxy API porta alla dipendenza dai server di gestione.
  • I server di gestione non fanno parte dei componenti runtime di Apigee e, pertanto, potrebbero non essere ad alta disponibilità.
  • Inoltre, potrebbe non essere eseguito il provisioning dei server di gestione all'interno della stessa rete o dello stesso data center e potrebbero quindi introdurre latenze di rete in fase di runtime.
  • Le voci nei server di gestione vengono memorizzate nella cache per un periodo di tempo più lungo, pertanto potresti non essere in grado di visualizzare immediatamente i dati più recenti nei proxy API se esegui scritture e letture in un breve periodo di tempo.
  • Aumenta gli hop di rete in fase di runtime.

Nell'esempio di codice seguente, la chiamata API Apigee viene effettuata tramite il codice JavaScript personalizzato per recuperare le informazioni dalla KVM:

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

Se il server di gestione non è disponibile, il codice JavaScript che richiama la chiamata API Apigee non riesce. Di conseguenza, la richiesta API non andrà a buon fine.

Impatto

  • Introduce un'ulteriore dipendenza dai server di gestione durante il runtime. Eventuali errori nei server di gestione influiranno sulle chiamate API.
  • Le credenziali utente per le API Apigee devono essere archiviate localmente o in un archivio sicuro, ad esempio una KVM criptata.
  • Implicazioni sulle prestazioni dovute alla chiamata al servizio di gestione sulla rete.
  • I valori aggiornati potrebbero non essere visualizzati immediatamente a causa di una scadenza più lunga della cache nei server di gestione.

Best practice

Esistono modi più efficaci per recuperare informazioni da entità come KVM, prodotti API, app per sviluppatori, sviluppatori, chiavi consumer e così via in fase di runtime. Ecco alcuni esempi:

  • Utilizza un criterio KeyValueMapOperations per accedere alle informazioni dalle KVM. Ecco un codice campione che mostra come recuperare informazioni dalla 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>
    
  • Per accedere a informazioni su prodotti API, app per sviluppatori, sviluppatori, chiavi consumer e così via nel proxy API, puoi effettuare una delle seguenti operazioni:
    • Se il tuo flusso proxy API ha un criterio VerifyAPIKey, puoi accedere alle informazioni utilizzando le variabili di flusso compilate come parte di questo criterio. Ecco un codice campione che mostra come recuperare il nome e le informazioni create_by di un'app sviluppatore utilizzando 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"));
      
    • Se il flusso proxy API non ha un criterio VerifyAPIKey, puoi accedere ai profili dei prodotti API, alle app per sviluppatori e così via utilizzando i criteri AccessEntity e ExtractVariables:
      1. Recupera il profilo dell'app sviluppatore con il criterio 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. Estrai il valore appId dall'app sviluppatore con il criterio 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>
        

Per approfondire