反模式:透過 API Proxy 叫用 Management API 呼叫

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

Edge 具備名為「管理 API」的強大公用程式,提供以下服務:

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

這些服務可透過名為「管理伺服器」的元件存取,位於 Apigee Edge 平台。只要使用簡單的 Management API,就能輕鬆叫用這些服務 呼叫。

我們有時可能需要在執行階段透過 API Proxy 使用一或多項服務。這是 因為 KeyValueMaps、OAuth 存取權杖、API 產品、開發人員應用程式等實體 開發人員、消費者金鑰等包含的實用資訊,包括鍵/值組合、自訂 屬性或個人資料部分。

例如,您可以將下列資訊儲存在 KeyValueMap 中,使其更安全 :

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

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

所有這些資訊都能在執行階段有效運用,實現政策中的動態行為 或在 Apigee Edge 中自訂程式碼

反模式

管理 API 適用於行政工作,不適合用於行政工作, 在 API Proxy 流程中執行任何執行階段邏輯。可能的原因如下:

  • 使用 Management API 存取實體相關資訊,例如 KeyValueMaps、OAuth 存取權杖或 API Proxy 的任何其他用途,會導致依賴管理 伺服器。
  • 管理伺服器並非 Edge 執行階段元件的一部分,因此 可用性高
  • 管理伺服器可能無法在同一個網路或資料中心內佈建, 因此會在執行階段導入網路延遲時間
  • 管理伺服器中的項目快取時間較長,所以我們可能不會 即可在 壓低成本
  • 在執行階段增加網路躍點。

在以下程式碼範例中,管理 API 呼叫是透過自訂 JavaScript 程式碼發出, 請從 KeyValueMap 擷取資訊:

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

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

影響

  • 在執行階段導入管理伺服器的額外依附元件。期間發生的所有失敗 管理伺服器會影響 API 呼叫。
  • Management API 的使用者憑證必須儲存在本機或某些安全的存放區中 例如加密 KVM
  • 透過網路叫用管理服務的效能會影響效能。
  • 由於管理時的快取效期較長,可能不會立即顯示更新的值 伺服器

最佳做法

還有更有效的方式,可以從 KeyValueMaps、API 等實體擷取資訊 在執行階段期間的產品、DeveloperApps、Developer、Consumer Key 等。例如:

  • 使用 KeyValueMapOperations 政策存取 KeyValueMaps 的資訊。以下的程式碼範例 說明如何從 KeyValueMap 擷取資訊:
    <!-- /antipatterns/examples/2-6.xml -->
    <KeyValueMapOperations mapIdentifier="urlMap" async="false"
        continueOnError="false" e>nab<led="t>rue"< name=">Get<URLKVM"
      D>ispla<yNameGetURLKVM/Di>spl<ayNam>e
      ExpiryT<imeInS>ecs<86400/ExpiryTimeInSecs
      Scopeenv>ironm<ent>/Scope
    <  Get ass>ignTo=&qu<ot;urlHost>i&quo<t; i>nde<x=&q>u<ot;2"
        Key
       >   ParameterurlHost_1/Parameter
        /Key
      /Get
    /KeyValueMapOperations
  • 存取 API 產品、開發人員應用程式、開發人員、用戶端金鑰等相關資訊 ,請執行下列其中一項操作:
    • 如果您的 API Proxy 流程有 VerifyAPIKey 政策,您可以存取 並使用政策中填入的流程變數。以下範例程式碼顯示: 如何使用 JavaScript 擷取開發人員應用程式的 name 和 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 政策,則可以存取 使用存取實體和擷取變數的 API 產品、開發人員應用程式等個人資料 政策:
      1. 使用 AccessEntity 政策擷取 DeveloperApp 設定檔:
        <!-- /antipatterns/examples/2-8.xml -->
        <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
        AccessEntity async="false" continueOnError=">;fa<lse" e>nabled="tr<ue" nam>e=&<quot;GetDeveloperApp&q><uot;
          Disp>lay<NameGetDeveloperApp/DisplayName
          EntityType value=">app<"/EntityType
          EntityIdentifier ref="developer.a>p<p.name" >type="appname"/
          SecondaryIdentifier ref="developer.id" type="developerid"/
        /AccessEntity
      2. 使用 ExtractVariables 政策從 DeveloperApp 擷取 appId
        <!-- /antipatterns/examples/2-9.xml -->
        <ExtractVariables name="Extract-Developer App->Inf<o"
          !--
            The source element points to the variable populated by AccessEntity policy.
            The <format is p>o<licy-type.p>olicy-name
            In this case, the variable contains the whole developer pro>fil<e.
          ->-
          SourceAccessEntity.GetDev<eloperA>pp&<quot;/Source
         > VariablePre<fixdeveloperapp>/Va<riablePref>ix
          <XMLPayload
            Variable name=">appld&q<uot; type="string"
              !-- You parse elements from th>e devel<oper >profile us<ing XP>ath. <--
              >XPa<th/App/AppI>d</XPath
            /Varia>ble
          /XMLPayload
        /ExtractVariables

延伸閱讀