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 utility chiamata API Apigee che offre servizi come:

  • Deployment o annullamento del deployment di 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 esecuzione. Questo accade 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 come parte del profilo.

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

  • URL target di backend
  • Proprietà dell'ambiente
  • Le credenziali di sicurezza dei 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 esecuzione. Queste informazioni saranno disponibili nel profilo delle app dello sviluppatore.

Tutte queste informazioni possono essere utilizzate efficacemente in fase di esecuzione per attivare 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 qualsiasi logica di runtime nel flusso dei proxy API. Il motivo è che:

  • 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 comporta la dipendenza dai server di gestione.
  • I server di gestione non fanno parte dei componenti di runtime di Apigee e, pertanto, potrebbero non essere altamente disponibili.
  • Inoltre, il provisioning dei server di gestione potrebbe non essere eseguito all'interno della stessa rete o dello stesso data center e quindi potrebbe essere introdotta la latenza di rete in fase di esecuzione.
  • Le voci nei server di gestione vengono memorizzate nella cache per un periodo di tempo più lungo, pertanto potresti non essere in grado di vedere immediatamente i dati più recenti nei proxy API se esegui scritture e letture in un breve periodo di tempo.
  • Aumenta i hop di rete in fase di esecuzione.

Nell'esempio di codice seguente, la chiamata all'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 all'API Apigee non va a buon fine. Di conseguenza, la richiesta API non va a buon fine.

Impatto

  • Introduce una dipendenza aggiuntiva 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 come una KVM criptata.
  • Implicazioni sulle prestazioni dovute all'invocazione del servizio di gestione sulla rete.
  • I valori aggiornati potrebbero non essere visualizzati immediatamente a causa della scadenza della cache più lunga nei server di gestione.

Best practice

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

  • Utilizza un criterio KeyValueMapOperations per accedere alle informazioni delle mappe KeyValue. 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 per sviluppatori, sviluppatori, chiavi consumer e così via nel proxy API, puoi eseguire una delle seguenti operazioni:
    • Se il flusso di proxy API ha un regolamento VerifyAPIKey, puoi accedere alle informazioni utilizzando le variabili di flusso compilate nell'ambito di questo regolamento. Ecco un codice campione che mostra come recuperare il nome e le informazioni create_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 regolamento VerifyAPIKey, puoi accedere ai profili dei prodotti API, delle app per sviluppatori e così via utilizzando i regolamenti AccessEntity e ExtractVariables:
      1. Recupera il profilo dell'app dello sviluppatore con il AccessEntity policy:
        <!-- /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 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