Antipattern: richiamare le chiamate API Apigee da un proxy API

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.

Apigee dispone di una potente utilità chiamata API Apigee che offre servizi quali:

  • Deployment o annullamento del deployment dei proxy API
  • Configurazione di host virtuali, keystore e truststore e così via
  • Creazione, eliminazione e aggiornamento di entità come mappe chiave/valore (KVM), prodotti API, app sviluppatore, 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 dover utilizzare uno o più di questi servizi dai proxy API in fase di runtime. Questo perché le 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 come parte del profilo.

Ad esempio, puoi memorizzare le seguenti informazioni in un KVM per renderle più sicure e accessibili in fase di runtime:

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

Allo stesso modo, potresti voler ottenere l'elenco dei prodotti API o l'indirizzo email dello sviluppatore in fase di runtime. Queste informazioni saranno disponibili nel profilo delle app dello sviluppatore.

Tutte queste informazioni possono essere utilizzate in modo efficace in fase di runtime per attivare il comportamento dinamico nelle norme o nel codice personalizzato all'interno di 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 a informazioni sulle entità, ad esempio KVM, token di accesso OAuth o per qualsiasi altro scopo dai proxy API, comporta una dipendenza dai server di gestione.
  • I server di gestione non fanno parte dei componenti runtime di Apigee e pertanto potrebbero non essere ad alta affidabilità.
  • Inoltre, i server di gestione potrebbero non essere sottoposti a provisioning 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, 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 non va a buon fine. Di conseguenza, la richiesta API non riesce.

Impatto

  • Introduce una dipendenza aggiuntiva 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 localmente o in un archivio sicuro, ad esempio un KVM criptato.
  • Implicazioni per le prestazioni dovute alla chiamata del servizio di gestione sulla rete.
  • Potresti non visualizzare immediatamente i valori aggiornati a causa della 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 una policy KeyValueMapOperations per accedere alle informazioni delle KVM. Ecco un codice campione che mostra come recuperare 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 per sviluppatori, sviluppatori, chiavi consumer e così via nel proxy API, puoi procedere in uno dei seguenti modi:
    • Se il flusso del proxy API ha un criterio VerifyAPIKey, puoi accedere alle informazioni utilizzando le variabili di flusso compilate nell'ambito di questo criterio. Ecco un codice campione che mostra come recuperare il nome e le informazioni created_by di un'app per sviluppatori 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 del proxy API non ha un criterio VerifyAPIKey, puoi accedere ai profili di prodotti API, app per sviluppatori e così via utilizzando i criteri AccessEntity e ExtractVariables:
      1. Recupera il profilo dell'app dello 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 appId dall'app per sviluppatori con la policy 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