Anti-pattern: richiama chiamate API Apigee da un proxy API

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
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 di attendibilità e così via
  • Creazione, eliminazione e aggiornamento di entità come mappe chiave-valore (KVM), prodotti API, app per sviluppatori, sviluppatori, chiavi utente e così via.
  • Recupero di informazioni su queste entità

Questi servizi sono resi accessibili attraverso un componente chiamato server di gestione 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 consumer e così via contengono informazioni utili sotto forma di coppie chiave-valore, attributi personalizzati o all'interno del relativo profilo.

Ad esempio, puoi archiviare le seguenti informazioni in un KVM per renderlo più sicuro e accessibile in fase di runtime:

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

Analogamente, potresti voler ottenere 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 in modo efficace in fase di runtime per abilitare un comportamento dinamico nei criteri o nel codice personalizzato in Apigee.

Antipattern

Le API Apigee sono preferite e utili per le attività amministrative e non devono 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 alle 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 di 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 pertanto potrebbero 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, quindi 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 riportato di seguito, la chiamata API Apigee viene effettuata tramite il codice JavaScript personalizzato per recuperare le informazioni dal 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 all'API Apigee ha esito negativo. In seguito, la richiesta API non andrà a buon fine.

Impatto

  • Introduce un'ulteriore dipendenza dai server di gestione durante il runtime. Qualsiasi errore nei server di gestione influirà sulle chiamate API.
  • Le credenziali utente per le API Apigee devono essere archiviate in locale o in un archivio sicuro, ad esempio un KVM criptato.
  • Implicazioni sulle prestazioni a seguito del richiamo del servizio di gestione sulla rete.
  • Potrebbe non visualizzare immediatamente i valori aggiornati 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 dei KVM. Ecco un codice campione che mostra come recuperare le informazioni dal 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 alle informazioni su prodotti API, app dello sviluppatore, sviluppatori, chiavi consumer e così via nel proxy API, puoi eseguire una delle seguenti operazioni:
    • Se il flusso proxy API ha un criterio VerificationAPIKey, 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 tuo flusso proxy API non ha un criterio VerificationAPIKey, puoi accedere ai profili dei prodotti API, delle 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 dello 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