您正在查看 Apigee 和 Apigee Hybrid 文档。
查看 Apigee Edge 文档。
API 代理是用于连接后端服务的客户端应用的接口。Apigee 通过 API 代理提供了多种方法来连接到后端服务:
- TargetEndpoint 连接到任何 HTTP/HTTPs、NodeJS 或托管目标服务。
- ServiceCallout 政策,用于在调用 TargetEndpoint 中的目标服务器之前或之后调用任何外部服务。
- 向 JavaScript 政策或 JavaCallout 政策添加自定义代码,以连接到后端服务。
持久性连接
HTTP 持久性连接(也称为 HTTP keep-alive或 HTTP 连接重复使用)是一种概念,允许单个 TCP 连接发送和接收多个 HTTP 请求/响应,而不是为每个请求/响应对打开新连接。
Apigee 使用持久性连接与后端服务进行通信。默认情况下,连接保持活动状态 60 秒。也就是说,如果连接在连接池中的空闲时间超过 60 秒,则该连接会关闭。
keep-alive 超时期限可通过 API 代理的 TargetEndpoint 配置中指定的名为 keepalive.timeout.millis
的属性进行配置。例如,对于 TargetEndpoint 中的特定后端服务,您可以将 keep-live 时间段设置为 30 秒。
在以下示例中,keepalive.timeout.millis
在 TargetEndpoint 配置中设置为 30 秒:
<!-- /antipatterns/examples/disable-persistent-connections-1.xml --> <TargetEndpoint name="default"> <HTTPTargetConnection> <URL>http://mocktarget.apigee.net</URL> <Properties> <Property name="keepalive.timeout.millis">30000</Property> </Properties> </HTTPTargetConnection>Disable HTTP persistent (Reusable keep-alive) connections </TargetEndpoint>
在上面的示例中,keepalive.timeout.millis
用于控制 API 代理中特定后端服务的 keep-alive 行为。此外,还有一个控制所有代理中所有后端服务 keep-alive 行为的属性。HTTPTransport.keepalive.timeout.millis
可以在消息处理器组件中配置。此属性的默认值是 60 秒。对此属性进行任何修改都会影响 Apigee 与所有 API 代理中所有后端服务之间的 keep-alive 连接行为。
反模式
不建议通过在特定 API 代理的 TargetEndpoint 配置中将属性 keepalive.timeout.millis
设置为 0 或在消息处理器上将 HTTPTransport.keepalive.timeout.millis
设置为 0 来停用持久性(keep-alive)连接,因为这会影响性能。
在以下示例中,TargetEndpoint 配置将 keepalive.timeout.millis
设置为 0,以为特定后端服务停用持久性(keep-alive)连接:
<!-- /antipatterns/examples/disable-persistent-connections-2.xml --> <TargetEndpoint name="default"> <HTTPTargetConnection> <URL>http://mocktarget.apigee.net</URL> <Properties> <Property name="keepalive.timeout.millis">0</Property> </Properties> </HTTPTargetConnection> </TargetEndpoint>
如果为一个或多个后端服务停用 keep-alive 连接,则 Apigee 必须为每个目标后端服务的新请求打开新的连接。如果后端是 HTTP,Apigee 还会为每个新请求执行 SSL 握手,从而增加 API 请求的总体延迟时间。
影响
- 增加 API 请求的总体响应时间,因为 Apigee 必须打开新连接并对每条新请求执行 SSL 握手。
- 在高流量条件下,连接可能会耗尽,因为将连接撤销到系统需要一些时间。
最佳做法
- 后端服务应按照 HTTP 1.1 标准遵守和处理 HTTP 持久性连接。
- 如果后端服务能够处理持久性(keep-alive)连接,则应使用
Connection:keep-alive
标头做出响应。 - 如果后端服务无法处理持久性连接,则应使用
Connection:close
标头做出响应。
实现此模式可确保 Apigee 可以自动处理与后端服务的持久性或非持久连接,而无需更改 API 代理。