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

您正在查看 Apigee X 文档。
查看 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:使用代理链的代码流

更多详情