反模式:使用自定义代码或作为目标在代理中调用代理

您正在查看 ApigeeApigee Hybrid 文档。
查看 Apigee Edge 文档。

Apigee 允许您从一个 API 代理调用另一个 API 代理。如果您的 API 代理包含可供其他 API 代理使用的可重用代码,则此功能特别有用。

反模式

如果在目标端点或自定义 JavaScript 代码中使用 HTTPTargetConnection 从一个 API 代理调用另一个 API 代理,将会导致额外的网络跃点。

使用 HTTPTargetConnection 从代理 1 调用代理 2

以下代码示例使用 HTTPTargetConnection 从代理 1 调用代理 2:

<!-- /antipatterns/examples/2-1.xml -->
<HTTPTargetConnection>
  <URL>https://api-test.example.com/proxy2</URL>
</HTTPTargetConnection>

从 JavaScript 代码从代理 1 调用代理 2

以下代码示例使用 JavaScript 从代理 1 调用代理 2:

<!-- /antipatterns/examples/2-2.xml -->
var response = httpClient.send('https://api-test.example.com/proxy2);
response.waitForComplete();

代码流

如需了解为何出现这一固有缺陷,我们需要了解请求采用的路由,如下图所示:

1) 客户端向代理 1 发出请求;2) 代理 1 向代理 2 发出的请求会生成网络跃点;3) 来自代理 2 的请求定向到目标服务器。
图 1:代码流

如图所示,一个请求遍历多个分布式组件,包括路由器和消息处理器。

在上述代码示例中,从代理 1 调用代理 2 意味着请求必须在运行时通过传统路由(路由器 > MP)进行路由。这类似于从客户端调用 API,因而会导致多个网络跃点,从而增加延迟时间。这些代理不需要考虑代理 1 请求已到达 MP。

影响

从其他 API 代理调用一个 API 代理会产生不必要的网络跃点,也就是说,必须将请求从一个消息处理器传递到另一个消息处理器。

最佳做法

  • 使用代理链功能从一个 API 代理调用另一个 API 代理。代理链更高效,因为它使用本地连接引用目标端点(另一个 API 代理)。

    以下代码示例展示了在您的端点定义中使用 LocalTargetConnection 的代理链:

    <!-- /antipatterns/examples/2-3.xml -->
    <LocalTargetConnection>
      <APIProxy>proxy2</APIProxy>
      <ProxyEndpoint>default</ProxyEndpoint>
    </LocalTargetConnection>
    

    调用的 API 代理将在同一消息处理器中执行;因此,它可避免网络跃点,如下图所示:

    1) 客户端向代理 1 发出请求;2) 从代理 1 到代理 2 的请求通过 psuedo-local 调用进行;3) 来自代理 2 的请求定向到目标服务器。
    图 2:使用代理链的代码流

更多详情