反模式:從 API Proxy 叫用 Apigee API 呼叫

您正在查看 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

Apigee 提供名為 Apigee API 的強大公用程式,可提供下列服務:

  • 部署或取消部署 API Proxy
  • 設定虛擬主機、金鑰庫和信任庫等
  • 建立、刪除及更新實體,例如鍵/值對應 (KVM)、API 產品、開發人員應用程式、開發人員、消費者金鑰等等
  • 擷取這些實體的相關資訊

您可以透過 Apigee 平台中的「Management Server」元件存取這些服務。只要透過簡單的 API 呼叫,即可輕鬆叫用這些服務。

有時,我們可能需要在執行階段使用 API Proxy 中的一或多項服務。這是因為 KVM、OAuth 存取權權杖、API 產品、開發人員應用程式、開發人員、消費者金鑰等實體,會以鍵/值組合、自訂屬性或設定檔的一部分形式,提供實用的資訊。

舉例來說,您可以將下列資訊儲存在 KVM 中,讓 KVM 在執行階段更加安全且可存取:

  • 後端目標網址
  • 環境屬性
  • 後端或第三方系統的安全性憑證

同樣地,您可能也想在執行階段取得 API 產品清單或開發人員的電子郵件地址。這項資訊會顯示在開發人員應用程式設定檔中。

所有這類資訊都能在執行階段有效使用,在 Apigee 中啟用政策或自訂程式碼的動態行為。

反模式

Apigee API 是執行管理工作時的首選,且可提供實用資訊,但不應用於在 API Proxy 流程中執行任何執行階段邏輯。可能的原因如下:

  • 使用 Apigee API 存取實體的相關資訊 (例如 KVM、OAuth 存取權杖) 或透過 API 代理程式執行其他用途,都會導致管理伺服器產生依附性。
  • 管理伺服器並非 Apigee 執行階段元件的一部分,因此可能無法提供高可用性。
  • 管理伺服器也可能不會在相同的網路或資料中心內佈建,因此可能會在執行階段造成網路延遲。
  • 管理伺服器中的項目會快取較長的時間,因此如果您在短時間內執行寫入和讀取作業,可能無法在 API 代理程式中立即查看最新資料。
  • 在執行階段增加網路躍點。

在下方程式碼範例中,Apigee API 呼叫會透過自訂 JavaScript 程式碼發出,以便從 KVM 擷取資訊:

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

如果管理伺服器無法使用,則叫用 Apigee API 呼叫的 JavaScript 程式碼就會失敗。這會導致 API 要求失敗。

影響

  • 在執行階段引入對管理伺服器的額外依附元件。管理伺服器發生任何失敗都會影響 API 呼叫。
  • Apigee API 的使用者憑證必須儲存在本機或某些安全儲存空間 (例如加密的 KVM) 中。
  • 透過網路叫用管理服務可能會影響效能。
  • 由於管理伺服器的快取過期時間較長,因此您可能不會立即看到更新的值。

最佳做法

在執行階段,您可以透過更有效的方式從實體 (例如 KVM、API 產品、開發人員應用程式、開發人員、消費者金鑰等) 擷取資訊。範例如下:

  • 使用 KeyValueMapOperations 政策存取 KVM 中的資訊。以下是示範如何從 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>
  • 如要在 API 代理程式中存取 API 產品、開發人員應用程式、開發人員、消費者金鑰等資訊,請執行下列任一操作:
    • 如果 API Proxy 流程包含 VerifyAPIKey 政策,您可以使用此政策填入的流程變數存取資訊。以下是範例程式碼,說明如何使用 JavaScript 擷取開發人員應用程式的名稱和 created_by 資訊:
      <!-- /antipatterns/examples/2-7.xml -->
      print("Application Name ", context.getVariable(""verifyapikey. VerifyAPIKey.app.name"));
      print("Created by:", context.getVariable("verifyapikey. VerifyAPIKey.app.created_by"));
    • 如果 API Proxy 流程沒有 VerifyAPIKey 政策,您可以使用 AccessEntityExtractVariables 政策存取 API 產品、開發人員應用程式等的設定檔:
      1. 使用「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. 使用「ExtractVariables」政策,從開發人員應用程式中擷取 appId
        <!-- /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>

延伸閱讀