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

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

Edge ha una potente utilità chiamata "API di gestione", 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/o aggiornamento di entità come KeyValueMaps, prodotti API, sviluppatore App, sviluppatori, chiavi utente ecc.
  • Recupero delle 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 una semplice API di gestione chiamate.

A volte potremmo aver bisogno di utilizzare uno o più di questi servizi dai proxy API in fase di runtime. Questo è perché entità come KeyValueMaps, OAuth Access Tokens, Prodotti API, App per sviluppatori, Sviluppatori, chiavi utente e così via contengono informazioni utili sotto forma di coppie chiave-valore, chiavi o come parte del suo profilo.

Ad esempio, puoi archiviare le seguenti informazioni in KeyValueMap per renderlo più sicuro accessibili in fase di esecuzione:

  • URL target di backend
  • Proprietà dell'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 come parte del profilo App sviluppatore.

Tutte queste informazioni possono essere utilizzate efficacemente in fase di runtime per consentire il comportamento dinamico nei criteri o 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 qualsiasi logica di runtime nel flusso dei proxy API. I motivi sono i seguenti:

  • Utilizzo delle API di gestione per accedere alle informazioni sulle entità come KeyValueMaps, OAuth L'accesso ai token o per qualsiasi altro scopo dai proxy API genera una dipendenza dalla gestione Server
  • I server di gestione non fanno parte del componente runtime Edge, pertanto potrebbero non essere ad alta disponibilità.
  • Inoltre, potrebbe non essere possibile eseguire il provisioning dei server di gestione all'interno della stessa rete o dello stesso data center. introdurre latenze di rete in fase di runtime.
  • Le voci presenti nei server di gestione vengono memorizzate nella cache per un periodo di tempo più lungo, quindi potremmo non essere vedere subito gli ultimi dati nei proxy API se eseguiamo scritture e letture in un per un breve periodo di tempo.
  • Aumenta i hop di rete in fase di esecuzione.

Nell'esempio di codice seguente, 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 l'API di gestione non va a buon fine. Di conseguenza, la richiesta API non va 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 di gestione devono essere archiviate localmente o in un archivio sicuro ad esempio KVM criptato.
  • Implicazioni sulle prestazioni dovute alla chiamata al servizio di gestione sulla rete.
  • Potrebbe non vedere subito i valori aggiornati a causa di una scadenza più lunga della cache nella gestione server web.

Best practice

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

  • Utilizza un criterio KeyValueMapOperations per accedere alle informazioni da KeyValueMaps. Ecco un esempio di codice che mostra come recuperare 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 per sviluppatori, sviluppatori, chiavi utente e così via. nel proxy API, puoi effettuare una delle seguenti operazioni:
    • Se il tuo 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 flusso del proxy API non ha un criterio VerifyAPIKey, puoi accedere ai profili dei prodotti API, delle app per sviluppatori e così via utilizzando i criteri Access Entity e Extract Variables:
      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 il valore appId da DeveloperApp con il criterio EstraiVariabili:
        <!-- /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