您正在查看 Apigee 和 Apigee Hybrid 文档。
查看 Apigee Edge 文档。
Apigee 具有一个强大的实用程序,称为 Apigee API,可提供以下服务:
- 部署或取消部署 API 代理
- 配置虚拟主机、密钥库和信任库等
- 创建、删除和更新实体,例如键值对映射 (KVM)、API 产品、开发者应用、开发者、使用方密钥等
- 检索这些实体的相关信息
这些服务可以通过 Apigee 平台中名为 Management Server 的组件访问。借助简单的 API 调用,可轻松调用这些服务。
有时,我们可能需要在运行时使用 API 代理中的一项或多项服务。这是因为键值对映射 (KVM)、OAuth 访问令牌、API 产品、开发者应用、开发者、使用方密钥等实体以键值对、自定义属性形式或作为其配置文件的一部分包含有用的信息。
例如,您可以将以下信息存储在键值对映射 (KVM) 中,以提高其运行时的安全性和可访问性:
- 后端目标网址
- 环境属性
- 后端或第三方系统的安全凭据
同样,您可能希望在运行时获取 API 产品或开发者电子邮件地址列表。此信息将作为开发者应用配置文件的一部分提供。
所以这些信息都可以在运行时有效地使用,以便在政策中启用动态行为或在 Apigee 中启用自定义代码。
反模式
Apigee API 是首选,并且对于管理任务很有用,不应该用于在 API 代理流程中执行任何运行时逻辑。原因如下:
- 如果从 API 代理中使用 Apigee API 来访问实体(例如键值对映射 (KVM)、OAuth 访问令牌)的相关信息或用于任何其他目的,将会导致对管理服务器的依赖关系。
- 管理服务器不属于 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 代理流程具有 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 政策,则您可以使用
AccessEntity
和ExtractVariables
政策来访问 API 产品、开发者应用等的配置文件:- 使用 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>
- 使用 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>
- 使用 AccessEntity 政策检索开发者应用的配置文件:
- 如果您的 API 代理流程具有 VerifyAPIKey 政策,则您可以使用作为此政策一部分填充的流变量访问信息。以下示例代码演示了如何使用 JavaScript 检索开发者应用的名称和 created_by 的相关信息: