Anti-pattern: richiama le chiamate API di gestione da un proxy API

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

Edge dispone di una potente utilità chiamata "API di gestione", che offre servizi come:

  • Deployment o annullamento del deployment dei proxy API
  • Configurazione di host virtuali, archivi chiavi, truststore e così via.
  • Creazione, eliminazione e/o aggiornamento di entità come KeyValueMap, prodotti API, app per sviluppatori, sviluppatori, chiavi consumer, ecc.
  • Recupero di informazioni su queste entità

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

A volte potremmo aver bisogno di utilizzare uno o più di questi servizi dei proxy API in fase di runtime. Questo perché entità come KeyValueMap, token di accesso OAuth, prodotti API, app sviluppatore, sviluppatori, chiavi utente 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 KeyValueMap per renderlo più sicuro e accessibile in fase di runtime:

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

Analogamente, è possibile che tu voglia ottenere l'elenco dei Prodotti API o l'indirizzo email dello sviluppatore al momento dell'attivazione. Queste informazioni saranno disponibili nel profilo delle app sviluppatore.

Tutte queste informazioni possono essere utilizzate in modo efficace in fase di runtime per abilitare il comportamento dinamico nei criteri o nel codice personalizzato in Apigee Edge.

Antipattern

Le API di gestione 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 di gestione per accedere alle informazioni su entità come KeyValueMap, token di accesso OAuth o per qualsiasi altro scopo dai proxy API genera una dipendenza dai server di gestione.
  • I server di gestione non fanno parte del componente di runtime Edge 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, pertanto potremmo non riuscire a visualizzare immediatamente i dati più recenti nei proxy API se eseguiamo 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 all'API di gestione viene effettuata tramite il codice JavaScript personalizzato per recuperare le informazioni da KeyValueMap:

var response = httpClient.send('https://api.enterprise.apigee.com/v1/o/org_name/e/env_name/keyvaluemaps/kvm_name')

Se il server di gestione non è disponibile, il codice JavaScript che richiama la chiamata all'API di gestione non riesce. 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 di gestione devono essere archiviate in locale o in un archivio protetto, ad esempio il KVM criptato.
  • Implicazioni delle prestazioni dovute al richiamo del servizio di gestione sulla rete.
  • Potrebbe non visualizzare immediatamente i valori aggiornati a causa di una scadenza della cache più lunga nei server di gestione.

Best practice

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

  • Utilizza un criterio KeyValueMapOperations per accedere alle informazioni da KeyValueMap. Di seguito è riportato un codice campione che mostra come recuperare le informazioni da KeyValueMap:
    <!-- /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 sviluppatore, sviluppatori, chiavi consumer e così via nel proxy API, puoi eseguire una delle seguenti operazioni:
    • Se il flusso del proxy API ha un criterio VerificationAPIKey, puoi accedere alle informazioni utilizzando le variabili di flusso compilate nell'ambito di questo criterio. Ecco un codice di esempio 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 del proxy API non ha un criterio VerificationAPIKey, puoi accedere ai profili dei prodotti API, delle app per sviluppatori e così via utilizzando i criteri Entità di accesso ed Estrai variabili:
      1. Recupera il profilo di DeveloperApp 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 da DeveloperApp con la norma 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