反模式:从 API 代理调用 Management API

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

Edge 拥有一个名为“管理 API”的强大实用程序,它提供如下服务:

  • 部署或取消部署 API 代理
  • 配置虚拟主机、密钥库和 truststores 等。
  • 创建、删除和/或更新实体,例如 KeyValueMaps、API 产品、开发者 应用、开发者、使用方密钥等
  • 检索这些实体的相关信息

这些服务可通过名为管理服务器的组件(位于 Apigee Edge 平台借助简单的管理 API,可以轻松调用这些服务 调用。

有时,我们可能需要在运行时使用 API 代理中的一项或多项服务。这是 因为 KeyValueMaps、OAuth 访问令牌、API 产品、开发者应用程序等实体, 开发者、使用方键值等以键值对、自定义 属性或其配置文件中的一部分。

例如,您可以将以下信息存储在 KeyValueMap 中,以提高其运行时的安全性和可访问性:

  • 后端目标网址
  • 环境属性
  • 后端或第三方系统的安全凭据

同样,您可能希望在运行时获取 API 产品列表或开发者的电子邮件地址。 此信息将作为开发者应用配置文件的一部分提供。

所有这些信息都可以在运行时有效使用,以支持政策中的动态行为 或自定义代码。

反模式

管理 API 是管理任务的首选,并且不应用于 在 API 代理流程中执行任何运行时逻辑的操作。原因如下:

  • 使用管理 API 访问有关实体的信息,例如 KeyValueMaps、OAuth 访问令牌或用于 API 代理的任何其他用途会导致对 Management API 的依赖 服务器。
  • 管理服务器不是 Edge 运行时组件的一部分,因此可能不属于 高可用性
  • 管理服务器也可能无法在同一网络或数据中心内预配,因此可能会在运行时导致网络延迟。
  • 管理服务器中的条目会缓存更长时间,因此在短时间内执行写入和读取时,我们可能无法立即在 API 代理中看到最新数据。
  • 在运行时增加网络跃点。

在下面的代码示例中,通过自定义 JavaScript 代码对 Management API 进行调用, 从 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 调用。
  • 管理 API 的用户凭据需要存储在本地或某个安全的存储区中 例如加密 KVM
  • 通过网络调用管理服务对性能产生的影响。
  • 由于管理服务器中的缓存过期时间较长,可能无法立即看到更新后的值。

最佳做法

还有更有效的方法从实体(如 KeyValueMaps、API 运行时的产品、DeveloperApps、开发者、使用方密钥等。以下是几个例子:

  • 使用 KeyValueMapOperations 政策访问 KeyValueMap 中的信息。以下是示例代码 ,其中显示了如何从 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 产品、开发者 Apps、开发者、使用方密钥等信息,您可以执行以下任一操作:
    • 如果您的 API 代理流程具有 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 代理流程没有 VerifyAPIKey 政策,那么您可以访问 使用访问实体和提取变量的 API 产品、开发者应用等的配置文件 政策: <ph type="x-smartling-placeholder">
        </ph>
      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

深入阅读