Anti-Pattern: Apigee API-Aufrufe von einem API-Proxy aus aufrufen

Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen.

Apigee bietet ein leistungsstarkes Dienstprogramm namens Apigee API, das Folgendes anbietet:

  • API-Proxys bereitstellen oder Bereitstellung aufheben
  • Virtuelle Hosts, Schlüsselspeicher und Truststores usw. konfigurieren
  • Entitäten wie Schlüssel/Wert-Zuordnungen (Key Value Maps, KVMs), API-Produkte, Entwickler-Apps, Entwickler, Consumer-Keys usw. erstellen, löschen und aktualisieren
  • Informationen zu diesen Entitäten abrufen

Diese Dienste werden über eine Komponente namens Management Server in der Apigee-Plattform zugänglich gemacht. Diese Dienste lassen sich mit einfachen API-Aufrufen einfach aufrufen.

Manchmal müssen Sie einen oder mehrere dieser Dienste über API-Proxys zur Laufzeit verwenden. Dies liegt daran, dass Entitäten wie KVMs, OAuth-Zugriffstokens, API-Produkte, Entwickler-Apps, Entwickler, Consumer-Keys usw. hilfreiche Informationen in Form von Schlüssel/Wert-Paaren, benutzerdefinierten Attributen oder als Teil des Profils enthalten.

Sie können beispielsweise die folgenden Informationen in einer KVM speichern, um sie zur Laufzeit sicherer und zugänglicher zu machen:

  • Backend-Ziel-URLs
  • Umgebungsattribute
  • Sicherheitsanmeldedaten für Backend- oder Drittanbietersysteme

Möglicherweise möchten Sie auch die Liste der API-Produkte oder die E-Mail-Adresse des Entwicklers zur Laufzeit abzurufen. Diese Informationen werden im Rahmen des Developer Apps-Profils verfügbar sein.

Alle diese Informationen können zur Laufzeit effektiv verwendet werden, um dynamisches Verhalten in Richtlinien oder benutzerdefiniertem Code in Apigee zu aktivieren.

Anti-Pattern

Die Apigee-APIs werden bevorzugt und sind nützlich für Verwaltungsaufgaben und sollten nicht für die Ausführung von Laufzeitlogik in API-Proxy-Flows verwendet werden. Dies hat folgende Gründe:

  • Die Verwendung von Apigee APIs für den Zugriff auf Informationen zu Entitäten wie KVMs, OAuth-Zugriffstokens oder zu einem anderen Zweck über API-Proxys führt zu einer Abhängigkeit von Verwaltungsservern.
  • Verwaltungsserver sind kein Bestandteil der Apigee-Laufzeitkomponenten und daher sind sie möglicherweise nicht hochverfügbar.
  • Verwaltungsserver können auch nicht innerhalb desselben Netzwerks oder Rechenzentrums bereitgestellt werden und können daher zur Laufzeit zu Netzwerklatenzen führen.
  • Die Einträge auf den Verwaltungsservern werden für einen längeren Zeitraum im Cache gespeichert, sodass Sie die neuesten Daten möglicherweise nicht sofort in den API-Proxys sehen, wenn Sie innerhalb kurzer Zeit Schreib- und Lesevorgänge ausführen.
  • Erhöhen der Netzwerk-Hops zur Laufzeit

Im folgenden Codebeispiel wird der Apigee API-Aufruf über den benutzerdefinierten JavaScript-Code durchgeführt, um die Informationen aus der KVM abzurufen:

var response = httpClient.send('https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/keyvaluemaps')

Wenn der Verwaltungsserver nicht verfügbar ist, schlägt der JavaScript-Code fehl, der den Apigee API-Aufruf aufruft. Dadurch schlägt die API-Anfrage fehl.

Auswirkungen

  • Führt während der Laufzeit zu einer zusätzlichen Abhängigkeit von Verwaltungsservern. Jeder Fehler auf den Verwaltungsservern wirkt sich auf die API-Aufrufe aus.
  • Nutzeranmeldedaten für Apigee APIs müssen entweder lokal oder in einem sicheren Speicher, z. B. einer verschlüsselten KVM, gespeichert werden.
  • Leistungseinbußen durch den Aufruf des Verwaltungsdienstes über das Netzwerk
  • Die aktualisierten Werte werden aufgrund einer längeren Cache-Ablaufzeit auf Verwaltungsservern möglicherweise nicht sofort angezeigt.

Best Practice

Es gibt effektivere Möglichkeiten, Informationen von Entitäten wie KVMs, API-Produkten, Entwickler-Apps, Entwicklern, Consumer-Keys usw. zur Laufzeit abzurufen. Hier einige Beispiele:

  • Verwenden Sie eine KeyValueMapOperations-Richtlinie, um auf Informationen aus KVMs zuzugreifen. Im folgenden Beispielcode wird gezeigt, wie Sie Informationen von der KVM abrufen:
    <!-- /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>
  • Um über den API-Proxy auf Informationen zu API-Produkten, Entwickler-Apps, Entwicklern, Consumer-Keys usw. zuzugreifen, können Sie Folgendes tun:
    • Wenn Ihr API-Proxy-Flow eine VerifyAPIKey-Richtlinie hat, können Sie mit den Flow-Variablen, die als Teil dieser Richtlinie ausgefüllt werden, auf die Informationen zugreifen. Im folgenden Beispielcode sehen Sie, wie Sie den Namen und die created_by-Informationen einer Entwickler-App mit JavaScript abrufen:
      <!-- /antipatterns/examples/2-7.xml -->
      print("Application Name ", context.getVariable(""verifyapikey. VerifyAPIKey.app.name"));
      print("Created by:", context.getVariable("verifyapikey. VerifyAPIKey.app.created_by"));
    • Wenn Ihr API-Proxy-Flow keine VerifyAPIKey-Richtlinie hat, können Sie über die AccessEntity- und die ExtractVariables-Richtlinie auf die Profile von API-Produkten, Entwickler-Apps usw. zugreifen:
      1. Rufen Sie das Profil der Entwickler-App mit der AccessEntity-Richtlinie ab:
        <!-- /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. Extrahieren Sie appId aus der Entwickler-App mit der ExtractVariables-Richtlinie:
        <!-- /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>

Weitere Informationen